1d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -emit-llvm -o %t.ll
2d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// RUN: FileCheck %s -check-prefix=FUNS < %t.ll
3d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// RUN: FileCheck %s -check-prefix=VARS < %t.ll
4d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -fvisibility hidden -emit-llvm -o %t.ll
5d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// RUN: FileCheck %s -check-prefix=FUNS-HIDDEN < %t.ll
6d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// RUN: FileCheck %s -check-prefix=VARS-HIDDEN < %t.ll
7d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
8d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#define HIDDEN __attribute__((visibility("hidden")))
9d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#define PROTECTED __attribute__((visibility("protected")))
10d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#define DEFAULT __attribute__((visibility("default")))
11d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#define TYPE_HIDDEN __attribute__((type_visibility("hidden")))
12d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#define TYPE_PROTECTED __attribute__((type_visibility("protected")))
13d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#define TYPE_DEFAULT __attribute__((type_visibility("default")))
14d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
15d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// type_visibility is rdar://11880378
16d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
17d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#if !__has_attribute(type_visibility)
18d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#error No type_visibility attribute!
19d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#endif
20d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
21d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// The template tests come first because IR-gen reorders RTTI wierdly.
22d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace temp0 {
23d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  struct A;
24d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  template <class T> struct TYPE_DEFAULT B {
25d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall    virtual void foo() {}
26d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  };
27d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
28d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  template struct B<A>;
29d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS:        define weak_odr void @_ZN5temp01BINS_1AEE3fooEv(
30d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTVN5temp01BINS_1AEEE = weak_odr unnamed_addr constant
31d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTSN5temp01BINS_1AEEE = weak_odr constant
32d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTIN5temp01BINS_1AEEE = weak_odr unnamed_addr constant
33d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS-HIDDEN: define weak_odr hidden void @_ZN5temp01BINS_1AEE3fooEv(
34d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTVN5temp01BINS_1AEEE = weak_odr hidden unnamed_addr constant
35d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTSN5temp01BINS_1AEEE = weak_odr hidden constant
36d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTIN5temp01BINS_1AEEE = weak_odr hidden unnamed_addr constant
37d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall}
38d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
39d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace temp1 {
40d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  struct TYPE_DEFAULT A;
41d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  template <class T> struct TYPE_DEFAULT B {
42d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall    virtual void foo() {}
43d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  };
44d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
45d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  template struct B<A>;
46d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS:        define weak_odr void @_ZN5temp11BINS_1AEE3fooEv(
47d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTVN5temp11BINS_1AEEE = weak_odr unnamed_addr constant
48d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTSN5temp11BINS_1AEEE = weak_odr constant
49d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTIN5temp11BINS_1AEEE = weak_odr unnamed_addr constant
50d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS-HIDDEN: define weak_odr hidden void @_ZN5temp11BINS_1AEE3fooEv(
51d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTVN5temp11BINS_1AEEE = weak_odr unnamed_addr constant
52d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTSN5temp11BINS_1AEEE = weak_odr constant
53d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTIN5temp11BINS_1AEEE = weak_odr unnamed_addr constant
54d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall}
55d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
56d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace temp2 {
57d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  struct TYPE_DEFAULT A;
58d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  template <class T> struct B {
59d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall    virtual void foo() {}
60d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  };
61d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
62d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  template struct B<A>;
63d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS:        define weak_odr void @_ZN5temp21BINS_1AEE3fooEv(
64d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTVN5temp21BINS_1AEEE = weak_odr unnamed_addr constant
65d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTSN5temp21BINS_1AEEE = weak_odr constant
66d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTIN5temp21BINS_1AEEE = weak_odr unnamed_addr constant
67d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS-HIDDEN: define weak_odr hidden void @_ZN5temp21BINS_1AEE3fooEv(
68d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTVN5temp21BINS_1AEEE = weak_odr hidden unnamed_addr constant
69d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTSN5temp21BINS_1AEEE = weak_odr hidden constant
70d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTIN5temp21BINS_1AEEE = weak_odr hidden unnamed_addr constant
71d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall}
72d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
73d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace temp3 {
74d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  struct TYPE_HIDDEN A;
75d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  template <class T> struct TYPE_DEFAULT B {
76d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall    virtual void foo() {}
77d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  };
78d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
79d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  template struct B<A>;
80d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS:        define weak_odr hidden void @_ZN5temp31BINS_1AEE3fooEv(
81d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTVN5temp31BINS_1AEEE = weak_odr hidden unnamed_addr constant
82d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTSN5temp31BINS_1AEEE = weak_odr hidden constant
83d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTIN5temp31BINS_1AEEE = weak_odr hidden unnamed_addr constant
84d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS-HIDDEN: define weak_odr hidden void @_ZN5temp31BINS_1AEE3fooEv(
85d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTVN5temp31BINS_1AEEE = weak_odr hidden unnamed_addr constant
86d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTSN5temp31BINS_1AEEE = weak_odr hidden constant
87d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTIN5temp31BINS_1AEEE = weak_odr hidden unnamed_addr constant
88d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall}
89d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
90d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace temp4 {
91d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  struct TYPE_DEFAULT A;
92d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  template <class T> struct TYPE_HIDDEN B {
93d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall    virtual void foo() {}
94d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  };
95d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
96d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  template struct B<A>;
97d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS:        define weak_odr void @_ZN5temp41BINS_1AEE3fooEv(
98d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTVN5temp41BINS_1AEEE = weak_odr hidden unnamed_addr constant
99d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTSN5temp41BINS_1AEEE = weak_odr hidden constant
100d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTIN5temp41BINS_1AEEE = weak_odr hidden unnamed_addr constant
101d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS-HIDDEN: define weak_odr hidden void @_ZN5temp41BINS_1AEE3fooEv(
102d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTVN5temp41BINS_1AEEE = weak_odr hidden unnamed_addr constant
103d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTSN5temp41BINS_1AEEE = weak_odr hidden constant
104d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTIN5temp41BINS_1AEEE = weak_odr hidden unnamed_addr constant
105d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall}
106d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
107d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace type0 {
108d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  struct TYPE_DEFAULT A {
109d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall    virtual void foo();
110d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  };
111d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
112d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  void A::foo() {}
113d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS:        define void @_ZN5type01A3fooEv(
114d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTVN5type01AE = unnamed_addr constant
115d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTSN5type01AE = constant
116d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTIN5type01AE = unnamed_addr constant
117d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS-HIDDEN: define hidden void @_ZN5type01A3fooEv(
118d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTVN5type01AE = unnamed_addr constant
119d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTSN5type01AE = constant
120d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTIN5type01AE = unnamed_addr constant
121d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall}
122d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
123d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace type1 {
124d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  struct HIDDEN TYPE_DEFAULT A {
125d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall    virtual void foo();
126d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  };
127d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
128d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  void A::foo() {}
129d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS:        define hidden void @_ZN5type11A3fooEv(
130d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTVN5type11AE = unnamed_addr constant
131d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTSN5type11AE = constant
132d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTIN5type11AE = unnamed_addr constant
133d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS-HIDDEN: define hidden void @_ZN5type11A3fooEv(
134d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTVN5type11AE = unnamed_addr constant
135d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTSN5type11AE = constant
136d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTIN5type11AE = unnamed_addr constant
137d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall}
138d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
139d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace type2 {
140d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  struct TYPE_HIDDEN A {
141d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall    virtual void foo();
142d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  };
143d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
144d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  void A::foo() {}
145d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS:        define void @_ZN5type21A3fooEv(
146d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTVN5type21AE = hidden unnamed_addr constant
147d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTSN5type21AE = hidden constant
148d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTIN5type21AE = hidden unnamed_addr constant
149d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS-HIDDEN: define hidden void @_ZN5type21A3fooEv(
150d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTVN5type21AE = hidden unnamed_addr constant
151d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTSN5type21AE = hidden constant
152d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTIN5type21AE = hidden unnamed_addr constant
153d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall}
154d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
155d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace type3 {
156d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  struct DEFAULT TYPE_HIDDEN A {
157d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall    virtual void foo();
158d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  };
159d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
160d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  void A::foo() {}
161d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS:        define void @_ZN5type31A3fooEv(
162d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTVN5type31AE = hidden unnamed_addr constant
163d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTSN5type31AE = hidden constant
164d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS:        @_ZTIN5type31AE = hidden unnamed_addr constant
165d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // FUNS-HIDDEN: define void @_ZN5type31A3fooEv(
166d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTVN5type31AE = hidden unnamed_addr constant
167d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTSN5type31AE = hidden constant
168d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  // VARS-HIDDEN: @_ZTIN5type31AE = hidden unnamed_addr constant
169d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall}
170d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
171