xref: /aosp_15_r20/external/clang/test/CodeGenCXX/visibility-ms-compat.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -fvisibility hidden -ftype-visibility default -emit-llvm -o %t
2*67e74705SXin Li // RUN: FileCheck %s < %t
3*67e74705SXin Li // RUN: FileCheck -check-prefix=CHECK-GLOBAL %s < %t
4*67e74705SXin Li 
5*67e74705SXin Li // The two visibility options above are how we translate
6*67e74705SXin Li // -fvisibility-ms-compat in the driver.
7*67e74705SXin Li 
8*67e74705SXin Li // rdar://13079314
9*67e74705SXin Li 
10*67e74705SXin Li #define HIDDEN __attribute__((visibility("hidden")))
11*67e74705SXin Li #define PROTECTED __attribute__((visibility("protected")))
12*67e74705SXin Li #define DEFAULT __attribute__((visibility("default")))
13*67e74705SXin Li 
14*67e74705SXin Li namespace std {
15*67e74705SXin Li   class type_info;
16*67e74705SXin Li };
17*67e74705SXin Li 
18*67e74705SXin Li namespace test0 {
19*67e74705SXin Li   struct A {
20*67e74705SXin Li     static void foo();
21*67e74705SXin Li     static void bar();
22*67e74705SXin Li   };
23*67e74705SXin Li 
foo()24*67e74705SXin Li   void A::foo() { bar(); }
25*67e74705SXin Li   // CHECK-LABEL: define hidden void @_ZN5test01A3fooEv()
26*67e74705SXin Li   // CHECK: declare void @_ZN5test01A3barEv()
27*67e74705SXin Li 
28*67e74705SXin Li   const std::type_info &ti = typeid(A);
29*67e74705SXin Li   // CHECK-GLOBAL: @_ZTSN5test01AE = linkonce_odr constant
30*67e74705SXin Li   // CHECK-GLOBAL: @_ZTIN5test01AE = linkonce_odr constant
31*67e74705SXin Li   // CHECK-GLOBAL: @_ZN5test02tiE = hidden constant
32*67e74705SXin Li }
33*67e74705SXin Li 
34*67e74705SXin Li namespace test1 {
35*67e74705SXin Li   struct HIDDEN A {
36*67e74705SXin Li     static void foo();
37*67e74705SXin Li     static void bar();
38*67e74705SXin Li   };
39*67e74705SXin Li 
foo()40*67e74705SXin Li   void A::foo() { bar(); }
41*67e74705SXin Li   // CHECK-LABEL: define hidden void @_ZN5test11A3fooEv()
42*67e74705SXin Li   // CHECK: declare hidden void @_ZN5test11A3barEv()
43*67e74705SXin Li 
44*67e74705SXin Li   const std::type_info &ti = typeid(A);
45*67e74705SXin Li   // CHECK-GLOBAL: @_ZTSN5test11AE = linkonce_odr hidden constant
46*67e74705SXin Li   // CHECK-GLOBAL: @_ZTIN5test11AE = linkonce_odr hidden constant
47*67e74705SXin Li   // CHECK-GLOBAL: @_ZN5test12tiE = hidden constant
48*67e74705SXin Li }
49*67e74705SXin Li 
50*67e74705SXin Li namespace test2 {
51*67e74705SXin Li   struct DEFAULT A {
52*67e74705SXin Li     static void foo();
53*67e74705SXin Li     static void bar();
54*67e74705SXin Li   };
55*67e74705SXin Li 
foo()56*67e74705SXin Li   void A::foo() { bar(); }
57*67e74705SXin Li   // CHECK-LABEL: define void @_ZN5test21A3fooEv()
58*67e74705SXin Li   // CHECK: declare void @_ZN5test21A3barEv()
59*67e74705SXin Li 
60*67e74705SXin Li   const std::type_info &ti = typeid(A);
61*67e74705SXin Li   // CHECK-GLOBAL: @_ZTSN5test21AE = linkonce_odr constant
62*67e74705SXin Li   // CHECK-GLOBAL: @_ZTIN5test21AE = linkonce_odr constant
63*67e74705SXin Li   // CHECK-GLOBAL: @_ZN5test22tiE = hidden constant
64*67e74705SXin Li }
65*67e74705SXin Li 
66*67e74705SXin Li namespace test3 {
67*67e74705SXin Li   struct A { int x; };
68*67e74705SXin Li   template <class T> struct B {
footest3::B69*67e74705SXin Li     static void foo() { bar(); }
70*67e74705SXin Li     static void bar();
71*67e74705SXin Li   };
72*67e74705SXin Li 
73*67e74705SXin Li   template void B<A>::foo();
74*67e74705SXin Li   // CHECK-LABEL: define weak_odr hidden void @_ZN5test31BINS_1AEE3fooEv()
75*67e74705SXin Li   // CHECK: declare void @_ZN5test31BINS_1AEE3barEv()
76*67e74705SXin Li 
77*67e74705SXin Li   const std::type_info &ti = typeid(B<A>);
78*67e74705SXin Li   // CHECK-GLOBAL: @_ZTSN5test31BINS_1AEEE = linkonce_odr constant
79*67e74705SXin Li   // CHECK-GLOBAL: @_ZTIN5test31BINS_1AEEE = linkonce_odr constant
80*67e74705SXin Li }
81*67e74705SXin Li 
82*67e74705SXin Li namespace test4 {
83*67e74705SXin Li   struct A { int x; };
84*67e74705SXin Li   template <class T> struct DEFAULT B {
footest4::B85*67e74705SXin Li     static void foo() { bar(); }
86*67e74705SXin Li     static void bar();
87*67e74705SXin Li   };
88*67e74705SXin Li 
89*67e74705SXin Li   template void B<A>::foo();
90*67e74705SXin Li   // CHECK-LABEL: define weak_odr void @_ZN5test41BINS_1AEE3fooEv()
91*67e74705SXin Li   // CHECK: declare void @_ZN5test41BINS_1AEE3barEv()
92*67e74705SXin Li 
93*67e74705SXin Li   const std::type_info &ti = typeid(B<A>);
94*67e74705SXin Li   // CHECK-GLOBAL: @_ZTSN5test41BINS_1AEEE = linkonce_odr constant
95*67e74705SXin Li   // CHECK-GLOBAL: @_ZTIN5test41BINS_1AEEE = linkonce_odr constant
96*67e74705SXin Li }
97*67e74705SXin Li 
98*67e74705SXin Li namespace test5 {
99*67e74705SXin Li   struct A { int x; };
100*67e74705SXin Li   template <class T> struct HIDDEN B {
footest5::B101*67e74705SXin Li     static void foo() { bar(); }
102*67e74705SXin Li     static void bar();
103*67e74705SXin Li   };
104*67e74705SXin Li 
105*67e74705SXin Li   template void B<A>::foo();
106*67e74705SXin Li   // CHECK-LABEL: define weak_odr hidden void @_ZN5test51BINS_1AEE3fooEv()
107*67e74705SXin Li   // CHECK: declare hidden void @_ZN5test51BINS_1AEE3barEv()
108*67e74705SXin Li 
109*67e74705SXin Li   const std::type_info &ti = typeid(B<A>);
110*67e74705SXin Li   // CHECK-GLOBAL: @_ZTSN5test51BINS_1AEEE = linkonce_odr hidden constant
111*67e74705SXin Li   // CHECK-GLOBAL: @_ZTIN5test51BINS_1AEEE = linkonce_odr hidden constant
112*67e74705SXin Li }
113