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