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