1 // RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
2 // RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -fvisibility hidden -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-HIDDEN
3 // For clang, "internal" is just an alias for "hidden". We could use it for some
4 // optimization purposes on 32-bit x86, but it's not worth it.
5 // RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -fvisibility internal -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-HIDDEN
7 #define HIDDEN __attribute__((visibility("hidden")))
8 #define PROTECTED __attribute__((visibility("protected")))
9 #define DEFAULT __attribute__((visibility("default")))
12 // When H is hidden, it should make X hidden, even if the template argument
21 // CHECK: _ZN6test301bE = global
22 // CHECK-HIDDEN: _ZN6test301bE = hidden global
35 X<int>::definition<A> a;
36 // CHECK: @_ZN6test251aE = global
37 // CHECK-HIDDEN: @_ZN6test251aE = hidden global
44 // CHECK: @_ZN6test285myvecE = global
45 // CHECK-HIDDEN: @_ZN6test285myvecE = hidden global
49 #pragma GCC visibility push(hidden)
53 DEFAULT extern RECT data_rect;
54 RECT data_rect = { -1};
55 #pragma GCC visibility pop
56 // CHECK: @_ZN6test299data_rectE = global
57 // CHECK-HIDDEN: @_ZN6test299data_rectE = global
63 DEFAULT static int bar;
67 template struct foo<int>;
68 // CHECK: _ZN6test403fooIiE3barE = weak_odr global
69 // CHECK-HIDDEN: _ZN6test403fooIiE3barE = weak_odr global
73 // Unlike gcc we propagate the information that foo not only is hidden, but
74 // has been explicitly marked as so. This lets us produce a hidden undefined
81 // CHECK: @_ZN6test413barE = external hidden global
82 // CHECK-HIDDEN: @_ZN6test413barE = external hidden global
86 // Test that we use the visibility of struct foo when instantiating the
87 // template. Note that is a case where we disagree with gcc, it produces
100 // CHECK: _ZN6test481yE = hidden global
101 // CHECK-HIDDEN: _ZN6test481yE = hidden global
104 // CHECK: @_ZN5Test425VariableInHiddenNamespaceE = hidden global i32 10
105 // CHECK: @_ZN5Test71aE = hidden global
106 // CHECK: @_ZN5Test71bE = global
107 // CHECK: @test9_var = global
108 // CHECK-HIDDEN: @test9_var = global
109 // CHECK: @_ZN6Test121A6hiddenE = external hidden global
110 // CHECK: @_ZN6Test121A7visibleE = external global
111 // CHECK-HIDDEN: @_ZN6Test121A6hiddenE = external hidden global
112 // CHECK-HIDDEN: @_ZN6Test121A7visibleE = external global
113 // CHECK: @_ZN6Test131B1aE = hidden global
114 // CHECK: @_ZN6Test131C1aE = global
115 // CHECK-HIDDEN: @_ZN6Test131B1aE = hidden global
116 // CHECK-HIDDEN: @_ZN6Test131C1aE = global
117 // CHECK: @_ZN6Test143varE = external global
118 // CHECK-HIDDEN: @_ZN6Test143varE = external global
119 // CHECK: @_ZN6Test154TempINS_1AEE5Inner6bufferE = external global [0 x i8]
120 // CHECK-HIDDEN: @_ZN6Test154TempINS_1AEE5Inner6bufferE = external global [0 x i8]
135 void C<int>::D::g() {
137 // CHECK: _ZTVN6test271CIiE1DE = unnamed_addr constant
138 // CHECK-HIDDEN: _ZTVN6test271CIiE1DE = unnamed_addr constant
141 // CHECK: @_ZTVN5Test63fooE = linkonce_odr hidden unnamed_addr constant
143 // CHECK-HIDDEN: @_ZTVN6Test161AIcEE = external unnamed_addr constant
144 // CHECK-HIDDEN: @_ZTTN6Test161AIcEE = external unnamed_addr constant
146 // CHECK: @_ZZN6test681fC1EvE4test = linkonce_odr global
147 // CHECK-HIDDEN: @_ZZN6test681fC1EvE4test = linkonce_odr hidden global
149 // CHECK: @_ZGVZN6test681fC1EvE4test = linkonce_odr global
150 // CHECK-HIDDEN: @_ZGVZN6test681fC1EvE4test = linkonce_odr hidden global
152 // CHECK: @_ZZN6Test193fooIiEEvvE1a = linkonce_odr global
153 // CHECK-HIDDEN: @_ZZN6Test193fooIiEEvvE1a = linkonce_odr hidden global
155 // CHECK: @_ZGVZN6Test193fooIiEEvvE1a = linkonce_odr global i64
156 // CHECK-HIDDEN: @_ZGVZN6Test193fooIiEEvvE1a = linkonce_odr hidden global i64
159 // CHECK-LABEL: define hidden void @_ZN5Test11fEv
169 // A::f is a member function of a hidden class.
170 // CHECK-LABEL: define hidden void @_ZN5Test21A1fEv
181 // B is a nested class where its parent class is hidden.
182 // CHECK-LABEL: define hidden void @_ZN5Test31A1B1fEv
186 namespace Test4 HIDDEN {
187 int VariableInHiddenNamespace = 10;
189 // Test4::g is in a hidden namespace.
190 // CHECK-LABEL: define hidden void @_ZN5Test41gEv
197 // A has default visibility.
198 // CHECK-LABEL: define void @_ZN5Test41A1fEv
204 namespace NS HIDDEN {
205 // f is in NS which is hidden.
206 // CHECK-LABEL: define hidden void @_ZN5Test52NS1fEv()
211 // g is in NS, but this NS decl is not hidden.
212 // CHECK-LABEL: define void @_ZN5Test52NS1gEv
217 // <rdar://problem/8091955>
222 virtual void bar() = 0;
224 virtual void zonk() {}
227 struct barc : public foo {
239 template <A&> struct Aref {
243 class B : public A {};
246 // CHECK-LABEL: define linkonce_odr hidden void @_ZN5Test74ArefIL_ZNS_1aEEE3fooEv()
255 // CHECK-HIDDEN-LABEL: define hidden void @_ZN5Test83barEv()
256 // CHECK-HIDDEN: declare void @_ZN5Test83fooEv()
267 struct A { int field; };
268 void DEFAULT test9_fun(struct A *a) { }
269 struct A DEFAULT test9_var; // above
271 // CHECK-LABEL: define void @test9_fun(
272 // CHECK-HIDDEN-LABEL: define void @test9_fun(
288 // CHECK-LABEL: define void @_ZN6Test101B3fooEPNS_1AE(
289 // CHECK-HIDDEN-LABEL: define void @_ZN6Test101B3fooEPNS_1AE(
297 void DEFAULT bar() {}
306 // CHECK-LABEL: define linkonce_odr void @_ZN6Test111A3fooEv(
307 // CHECK-LABEL: define linkonce_odr void @_ZN6Test111A3barEv(
308 // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6Test111A3fooEv(
309 // CHECK-HIDDEN-LABEL: define linkonce_odr void @_ZN6Test111A3barEv(
312 // Tested at top of file.
315 // This is hidden in all cases: the explicit attribute takes
316 // priority over -fvisibility on the parent.
317 static int hidden HIDDEN;
319 // This is default in all cases because it's only a declaration.
329 // Tested at top of file.
333 // Should be hidden in all cases.
339 // Should be default in all cases.
346 // Tested at top of file.
348 // Neither the visibility of the type nor -fvisibility=hidden should
349 // apply to declarations.
350 extern struct A *var;
352 struct A *test() { return var; }
355 // rdar://problem/8613093
358 template <class T> struct Temp {
360 static char buffer[0];
365 return Temp<A>::Inner::buffer;
370 struct Base1 { virtual void foo(); };
371 struct Base2 : virtual Base1 { virtual void foo(); };
372 template <class T> struct A : virtual Base1, Base2 {
375 extern template struct A<char>;
386 static void DEFAULT bar();
387 static void HIDDEN baz();
391 static void DEFAULT bar();
392 static void HIDDEN baz();
404 // CHECK: declare hidden void @_ZN6Test171A3fooEv()
405 // CHECK: declare void @_ZN6Test171A3barEv()
406 // CHECK: declare hidden void @_ZN6Test171A3bazEv()
407 // CHECK: declare void @_ZN6Test171A1B3fooEv()
408 // CHECK: declare void @_ZN6Test171A1B3barEv()
409 // CHECK: declare hidden void @_ZN6Test171A1B3bazEv()
410 // CHECK-HIDDEN: declare hidden void @_ZN6Test171A3fooEv()
411 // CHECK-HIDDEN: declare void @_ZN6Test171A3barEv()
412 // CHECK-HIDDEN: declare hidden void @_ZN6Test171A3bazEv()
413 // CHECK-HIDDEN: declare void @_ZN6Test171A1B3fooEv()
414 // CHECK-HIDDEN: declare void @_ZN6Test171A1B3barEv()
415 // CHECK-HIDDEN: declare hidden void @_ZN6Test171A1B3bazEv()
419 template <class T> struct HIDDEN A {
421 static void DEFAULT bar();
422 static void HIDDEN baz();
426 static void DEFAULT bar();
427 static void HIDDEN baz();
446 // CHECK: declare hidden void @_ZN6Test181AIiE3fooEv()
447 // CHECK: declare void @_ZN6Test181AIiE3barEv()
448 // CHECK: declare hidden void @_ZN6Test181AIiE3bazEv()
449 // CHECK: declare void @_ZN6Test181AIiE1B3fooEv()
450 // CHECK: declare void @_ZN6Test181AIiE1B3barEv()
451 // CHECK: declare hidden void @_ZN6Test181AIiE1B3bazEv()
452 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3fooEv()
453 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3barEv()
454 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3bazEv()
455 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3fooEv()
456 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3barEv()
457 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3bazEv()
458 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE3fooEv()
459 // CHECK-HIDDEN: declare void @_ZN6Test181AIiE3barEv()
460 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE3bazEv()
461 // CHECK-HIDDEN: declare void @_ZN6Test181AIiE1B3fooEv()
462 // CHECK-HIDDEN: declare void @_ZN6Test181AIiE1B3barEv()
463 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE1B3bazEv()
464 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3fooEv()
465 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3barEv()
466 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3bazEv()
467 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3fooEv()
468 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3barEv()
469 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3bazEv()
473 struct A { A(); ~A(); };
475 // Tested at top of file.
476 template <class T> void foo() {
485 // Various things with class template specializations.
487 template <unsigned> struct HIDDEN A {};
489 // An explicit specialization inherits the explicit visibility of
491 template <> struct A<0> {
496 // CHECK-LABEL: define hidden void @_ZN6Test201AILj0EE5test0Ev()
497 void A<0>::test0() {}
499 // CHECK: declare hidden void @_ZN6Test201AILj0EE5test1Ev()
504 // ...unless that's explicitly overridden.
505 template <> struct DEFAULT A<1> {
510 // CHECK-LABEL: define void @_ZN6Test201AILj1EE5test2Ev()
511 void A<1>::test2() {}
513 // CHECK: declare void @_ZN6Test201AILj1EE5test3Ev()
518 // <rdar://problem/8778497>
519 // But we should assume that an unknown specialization has the
520 // explicit visibility settings of the template.
521 template <class T> struct B {
522 static void test4() {}
526 // CHECK-LABEL: define linkonce_odr hidden void @_ZN6Test201BINS_1AILj2EEEE5test4Ev()
531 // CHECK: declare hidden void @_ZN6Test201BINS_1AILj2EEEE5test5Ev()
540 template<En> struct A {
541 DEFAULT void foo() {}
544 // CHECK-LABEL: define weak_odr void @_ZN6test211AILNS_2EnE0EE3fooEv(
545 template void A<en>::foo();
548 // rdar://problem/9616154
549 // Visibility on explicit specializations should take precedence.
554 template <class T> struct B {};
555 template <> struct DEFAULT B<A1> {
559 template <> struct B<A2> {
570 // CHECK: declare void @_ZN6test221BINS_2A1EE3fooEv()
571 // CHECK-LABEL: define linkonce_odr void @_ZN6test221BINS_2A1EE3barEv()
572 // CHECK: declare void @_ZN6test221BINS_2A2EE3fooEv()
573 // CHECK-LABEL: define linkonce_odr void @_ZN6test221BINS_2A2EE3barEv()
574 // CHECK-HIDDEN: declare void @_ZN6test221BINS_2A1EE3fooEv()
575 // CHECK-HIDDEN-LABEL: define linkonce_odr void @_ZN6test221BINS_2A1EE3barEv()
576 // CHECK-HIDDEN: declare void @_ZN6test221BINS_2A2EE3fooEv()
577 // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test221BINS_2A2EE3barEv()
581 namespace foo DEFAULT {
587 template class foo::bar<char>;
588 // CHECK-LABEL: define weak_odr void @_ZN7PR101133foo3barIcE3zedEv
589 // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN7PR101133foo3barIcE3zedEv
593 template class foo::bar<zed>;
594 // CHECK-LABEL: define weak_odr void @_ZN7PR101133foo3barINS_3zedEE3zedEv
595 // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN7PR101133foo3barINS_3zedEE3zedEv
599 template<class T> struct Class {
603 template class DEFAULT Class<char>;
604 // CHECK-LABEL: define weak_odr void @_ZNK7PR116905ClassIcE4sizeEv
605 // CHECK-HIDDEN-LABEL: define weak_odr void @_ZNK7PR116905ClassIcE4sizeEv
607 template<class T> void Method() {}
608 template DEFAULT void Method<char>();
609 // CHECK-LABEL: define weak_odr void @_ZN7PR116906MethodIcEEvv
610 // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN7PR116906MethodIcEEvv
613 namespace PR11690_2 {
614 namespace foo DEFAULT {
616 template<typename T1, typename T2 = bar>
624 template class foo::zed<baz>;
625 // CHECK-LABEL: define weak_odr void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv
626 // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv
630 // Having a template argument that is explicitly visible should not make
631 // the template instantiation visible.
632 template <typename T>
644 // CHECK-LABEL: define linkonce_odr void @_ZN6test231XINS_1AEE1fEv
645 // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test231XINS_1AEE1fEv
649 template <typename P1>
650 void Bind(const P1& p1) {
653 class DEFAULT Version { };
658 // CHECK-LABEL: define linkonce_odr void @_ZN7PR120014BindINS_7VersionEEEvRKT_
659 // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN7PR120014BindINS_7VersionEEEvRKT_
666 template <typename T>
674 // CHECK-LABEL: define linkonce_odr void @_ZN6test241S3memINS_1AEEEvv
675 // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test241S3memINS_1AEEEvv
687 // CHECK-LABEL: define void @_ZN6test261CIiE1fEv
688 // CHECK-HIDDEN-LABEL: define void @_ZN6test261CIiE1fEv
694 static void DEFAULT baz();
700 // CHECK: declare void @_ZN6test311A1B3bazEv()
701 // CHECK-HIDDEN: declare void @_ZN6test311A1B3bazEv()
712 // CHECK-LABEL: define void @_ZN6test321A1B3bazEv
713 // CHECK-HIDDEN-LABEL: define void @_ZN6test321A1B3bazEv
723 template class DEFAULT foo<zed>;
724 // CHECK-LABEL: define weak_odr void @_ZN6test333fooINS_3zedEE3barEv
725 // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test333fooINS_3zedEE3barEv
733 template DEFAULT void bar<foo>();
734 // CHECK-LABEL: define weak_odr void @_ZN6test343barINS_3fooEEEvv
735 // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test343barINS_3fooEEEvv
739 // This is a really ugly testcase. GCC propagates the DEFAULT in zed's
740 // definition. It's not really clear what we can do here, because we
741 // produce the symbols before even seeing the DEFAULT definition of zed.
742 // FIXME: Maybe the best thing to do here is error? It's certainly hard
743 // to argue that this ought to be valid.
749 template class foo<zed>;
752 // CHECK-LABEL: define weak_odr void @_ZN6test353fooINS_3zedEE3barEv
753 // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test353fooINS_3zedEE3barEv
757 template<typename T1, typename T2>
763 template class foo<S1, S2>;
764 // CHECK-LABEL: define weak_odr hidden void @_ZN6test363fooINS_2S1ENS_2S2EE3barEv
765 // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test363fooINS_2S1ENS_2S2EE3barEv
772 DEFAULT void bar() {}
773 template DEFAULT void bar<foo>();
774 // CHECK-LABEL: define weak_odr void @_ZN6test373barINS_3fooEEEvv
775 // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test373barINS_3fooEEEvv
785 template class foo<zed>;
786 // CHECK-LABEL: define weak_odr hidden void @_ZN6test383fooINS_3zedEE3barEv
787 // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test383fooINS_3zedEE3barEv
791 class DEFAULT default_t;
792 class HIDDEN hidden_t;
793 template <class T> class A {
794 template <class U> class B {
795 HIDDEN void hidden() {}
797 template <class V> void temp() {}
800 template class DEFAULT A<hidden_t>;
801 template class DEFAULT A<hidden_t>::B<hidden_t>;
802 template void A<hidden_t>::B<hidden_t>::temp<default_t>();
803 template void A<hidden_t>::B<hidden_t>::temp<hidden_t>();
805 // CHECK-LABEL: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E6hiddenEv
806 // CHECK-LABEL: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E6noattrEv
807 // CHECK-LABEL: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempINS_9default_tEEEvv
809 // GCC produces a default for this one. Why?
810 // CHECK-LABEL: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempIS1_EEvv
812 // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E6hiddenEv
813 // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E6noattrEv
814 // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempINS_9default_tEEEvv
816 // GCC produces a default for this one. Why?
817 // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempIS1_EEvv
827 struct HIDDEN bar<foo> {
828 DEFAULT static void zed();
830 void bar<foo>::zed() {
832 // CHECK-LABEL: define void @_ZN6test423barINS_3fooEE3zedEv
833 // CHECK-HIDDEN-LABEL: define void @_ZN6test423barINS_3fooEE3zedEv
843 DEFAULT void bar<foo>() {
845 // CHECK-LABEL: define void @_ZN6test433barINS_3fooEEEvv
846 // CHECK-HIDDEN-LABEL: define void @_ZN6test433barINS_3fooEEEvv
850 template <typename T>
857 template struct DEFAULT foo<bar>;
859 // CHECK-LABEL: define internal void @_ZN6test443fooINS_12_GLOBAL__N_13barEEC1Ev
860 // CHECK-HIDDEN-LABEL: define internal void @_ZN6test443fooINS_12_GLOBAL__N_13barEEC1Ev
864 template <typename T>
866 template <typename T2>
874 template struct DEFAULT foo<int>::bar<zed>;
875 foo<int>::bar<zed> x;
876 // CHECK-LABEL: define internal void @_ZN6test453fooIiE3barINS_12_GLOBAL__N_13zedEEC1Ev
877 // CHECK-HIDDEN-LABEL: define internal void @_ZN6test453fooIiE3barINS_12_GLOBAL__N_13zedEEC1Ev
881 template <typename T>
887 template DEFAULT void foo<bar>();
891 // CHECK-LABEL: define internal void @_ZN6test463fooINS_12_GLOBAL__N_13barEEEvv
892 // CHECK-HIDDEN-LABEL: define internal void @_ZN6test463fooINS_12_GLOBAL__N_13barEEEvv
897 template <typename T>
904 template DEFAULT void foo::bar<zed>();
908 // CHECK-LABEL: define internal void @_ZN6test473foo3barINS_12_GLOBAL__N_13zedEEEvv
909 // CHECK-HIDDEN-LABEL: define internal void @_ZN6test473foo3barINS_12_GLOBAL__N_13zedEEEvv
913 // Test that we use the visibility of struct foo when instantiating the
914 // template. Note that is a case where we disagree with gcc, it produces
928 template void bar::zed<&x>();
929 // CHECK-LABEL: define weak_odr hidden void @_ZN6test493bar3zedIXadL_ZNS_1xEEEEEvv
930 // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test493bar3zedIXadL_ZNS_1xEEEEEvv
934 // Test that we use the visibility of struct foo when instantiating the
935 // template. Note that is a case where we disagree with gcc, it produces
946 template void bar<&x>::zed();
947 // CHECK-LABEL: define weak_odr hidden void @_ZN6test503barIXadL_ZNS_1xEEEE3zedEv
948 // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test503barIXadL_ZNS_1xEEEE3zedEv
952 // Test that we use the visibility of struct foo when instantiating the
953 // template. Note that is a case where we disagree with gcc, it produces
962 template void zed<&x>();
963 // CHECK-LABEL: define weak_odr hidden void @_ZN6test513zedIXadL_ZNS_1xEEEEEvv
964 // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test513zedIXadL_ZNS_1xEEEEEvv
968 // Test that we use the linkage of struct foo when instantiating the
969 // template. Note that is a case where we disagree with gcc, it produces
970 // an external symbol.
982 // CHECK-LABEL: define internal void @_ZN6test523zedILPNS_12_GLOBAL__N_13fooE0EEEvv
983 // CHECK-HIDDEN-LABEL: define internal void @_ZN6test523zedILPNS_12_GLOBAL__N_13fooE0EEEvv
987 template<typename _Tp > struct vector {
988 static void _M_fill_insert();
990 #pragma GCC visibility push(hidden)
991 // GCC doesn't seem to use the visibility of enums at all, we do.
994 // GCC fails to mark this specialization hidden, we mark it.
997 static void _M_fill_insert();
1000 vector<unsigned>::_M_fill_insert();
1001 vector<int>::_M_fill_insert();
1002 vector<zed>::_M_fill_insert();
1004 #pragma GCC visibility pop
1005 // CHECK: declare void @_ZN6test536vectorIjE14_M_fill_insertEv
1006 // CHECK-HIDDEN: declare void @_ZN6test536vectorIjE14_M_fill_insertEv
1007 // CHECK: declare hidden void @_ZN6test536vectorIiE14_M_fill_insertEv
1008 // CHECK-HIDDEN: declare hidden void @_ZN6test536vectorIiE14_M_fill_insertEv
1009 // CHECK: declare hidden void @_ZN6test536vectorINS_3zedEE14_M_fill_insertEv
1010 // CHECK-HIDDEN: declare hidden void @_ZN6test536vectorINS_3zedEE14_M_fill_insertEv
1018 #pragma GCC visibility push(hidden)
1025 #pragma GCC visibility pop
1026 // CHECK: declare hidden void @_ZN6test543fooINS_3zedEE3barEv
1027 // CHECK-HIDDEN: declare hidden void @_ZN6test543fooINS_3zedEE3barEv
1035 template <class T> struct foo;
1039 // CHECK: declare hidden void @_ZN6test553fooIiE3barEv
1040 // CHECK-HIDDEN: declare hidden void @_ZN6test553fooIiE3barEv
1044 template <class T> struct foo;
1052 // CHECK: declare hidden void @_ZN6test563fooIiE3barEv
1053 // CHECK-HIDDEN: declare hidden void @_ZN6test563fooIiE3barEv
1057 #pragma GCC visibility push(hidden)
1060 void bar(foo<int>*);
1068 #pragma GCC visibility pop
1069 // CHECK: declare hidden void @_ZN6test573fooIiE3zedEv
1070 // CHECK-HIDDEN: declare hidden void @_ZN6test573fooIiE3zedEv
1074 #pragma GCC visibility push(hidden)
1076 template<typename T>
1077 struct DEFAULT bar {
1084 #pragma GCC visibility pop
1085 // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test583barINS_3fooEE3zedEv
1086 // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test583barINS_3fooEE3zedEv
1092 typedef int (*foo)();
1093 template<foo x, foo y>
1097 // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1gEvEEXadL_ZNS_1fEvEEEEvv
1098 // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1gEvEEXadL_ZNS_1fEvEEEEvv
1101 // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1fEvEEXadL_ZNS_1gEvEEEEvv
1102 // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1fEvEEXadL_ZNS_1gEvEEEEvv
1111 template<template<int> class x, template<int> class y>
1115 // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test604testINS_1aENS_1bEEEvv
1116 // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test604testINS_1aENS_1bEEEvv
1119 // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test604testINS_1bENS_1aEEEvv
1120 // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test604testINS_1bENS_1aEEEvv
1125 template <typename T1>
1132 inline void Class1<int>::f2()
1135 void g(Class1<int> *x) {
1140 // Just test that we don't crash. Currently we apply this attribute. Current
1141 // gcc issues a warning about it being unused since "the type is already
1142 // defined". We should probably do the same.
1143 template class HIDDEN Class1<int>;
1147 template <typename T1>
1154 inline void Class1<int>::f2()
1157 void g(Class1<int> *x) {
1162 template class HIDDEN Class1<int>;
1163 // Just test that we don't crash. Currently we apply this attribute. Current
1164 // gcc issues a warning about it being unused since "the type is already
1165 // defined". We should probably do the same.
1169 enum HIDDEN E { E0 };
1171 template <E> static void foo() {}
1173 template <E> struct B {
1174 static void foo() {}
1182 // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test631A3fooILNS_1EE0EEEvv()
1183 // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test631A1BILNS_1EE0EE3fooEv()
1186 // Don't ignore the visibility of template arguments just because we
1187 // explicitly instantiated something.
1190 template <class P> struct B {
1191 static DEFAULT void foo() {}
1194 template class B<A>;
1195 // CHECK-LABEL: define weak_odr hidden void @_ZN6test641BINS_1AEE3fooEv()
1200 template <class T> struct B {
1202 template <class U> static void funcT1();
1203 template <class U> static void funcT2();
1205 template <class U> class InnerT {};
1207 template <template <class T> class Temp> struct C {
1208 static void foo() {}
1211 // CHECK-LABEL: define void @_ZN6test651BINS_1AEE4funcEv()
1212 template <> DEFAULT void B<A>::func() {}
1214 // CHECK-LABEL: define void @_ZN6test651BINS_1AEE6funcT2IS1_EEvv()
1215 template <> template <> DEFAULT void B<A>::funcT2<A>() {}
1217 // CHECK-LABEL: define linkonce_odr void @_ZN6test651BINS_1AEE6funcT1IiEEvv()
1218 // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test651BINS_1AEE6funcT1IS1_EEvv()
1219 template <> template <class T> DEFAULT void B<A>::funcT1() {}
1221 // CHECK-LABEL: define linkonce_odr void @_ZN6test651BINS_1AEE5Inner3fooEv()
1222 template <> struct DEFAULT B<A>::Inner {
1223 static void foo() {}
1226 // CHECK-LABEL: define linkonce_odr void @_ZN6test651BINS_1AEE6InnerTIiE3fooEv()
1227 // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test651BINS_1AEE6InnerTIS1_E3fooEv()
1228 template <> template <class U> struct DEFAULT B<A>::InnerT {
1229 static void foo() {}
1233 B<A>::funcT1<int>();
1236 B<A>::InnerT<int>::foo();
1237 B<A>::InnerT<A>::foo();
1240 template class C<B<A>::InnerT>;
1244 template <typename T>
1245 struct DEFAULT barT {
1246 static void zed() {}
1250 template struct barT<foo>;
1251 // CHECK-LABEL: define weak_odr void @_ZN6test664barTINS_3fooEE3zedEv
1252 // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test664barTINS_3fooEE3zedEv
1255 struct DEFAULT barI {
1256 static void zed() {}
1259 extern int I DEFAULT;
1260 template struct barI<&I>;
1261 // CHECK-LABEL: define weak_odr void @_ZN6test664barIIXadL_ZNS_1IEEEE3zedEv
1262 // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test664barIIXadL_ZNS_1IEEEE3zedEv
1264 typedef void (*fType)(void);
1266 struct DEFAULT barF {
1267 static void zed() {}
1271 template struct barF<F>;
1272 // CHECK-LABEL: define weak_odr void @_ZN6test664barFIXadL_ZNS_1FEvEEE3zedEv
1273 // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test664barFIXadL_ZNS_1FEvEEE3zedEv
1277 template <typename T>
1278 struct DEFAULT bar {
1279 static void zed() {}
1284 void f(foo *rootfoo);
1288 template struct bar<foo>;
1289 // CHECK-LABEL: define weak_odr void @_ZN6test673barINS_3fooEE3zedEv
1290 // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test673barINS_3fooEE3zedEv
1294 class A { public: ~A(); };
1304 // Check lines at top of file.
1315 namespace foo __attribute__((visibility("hidden"))) {
1317 // CHECK-LABEL: define void @_ZN6test693foo1fEv
1318 // CHECK-HIDDEN-LABEL: define hidden void @_ZN6test693foo1fEv