xref: /llvm-project/clang/test/CodeGenCXX/visibility.cpp (revision d041a9bf2d99efe9ae4068eff98f5f5066cb717f)
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 
4 #define HIDDEN __attribute__((visibility("hidden")))
5 #define PROTECTED __attribute__((visibility("protected")))
6 #define DEFAULT __attribute__((visibility("default")))
7 
8 namespace test30 {
9   // When H is hidden, it should make X hidden, even if the template argument
10   // is not.
11   struct H {
12   };
13   template<H *T>
14   struct X {
15   };
16   H DEFAULT a;
17   X<&a> b;
18   // CHECK: _ZN6test301bE = global
19   // CHECK-HIDDEN: _ZN6test301bE = hidden global
20 }
21 
22 namespace test25 {
23   template<typename T>
24   struct X {
25     template<typename U>
26     struct definition {
27     };
28   };
29 
30   class DEFAULT A { };
31 
32   X<int>::definition<A> a;
33   // CHECK: @_ZN6test251aE = global
34   // CHECK-HIDDEN: @_ZN6test251aE = hidden global
35 }
36 
37 namespace test28 {
38   class DEFAULT foo {
39   };
40   foo myvec;
41   // CHECK: @_ZN6test285myvecE = global
42   // CHECK-HIDDEN: @_ZN6test285myvecE = hidden global
43 }
44 
45 namespace test29 {
46 #pragma GCC visibility push(hidden)
47   struct RECT {
48     int top;
49   };
50   __attribute__ ((visibility ("default"))) extern RECT data_rect;
51   RECT data_rect = { -1};
52 #pragma GCC visibility pop
53   // CHECK: @_ZN6test299data_rectE = global
54   // CHECK-HIDDEN: @_ZN6test299data_rectE = global
55 }
56 
57 namespace test40 {
58   template<typename T>
59   struct foo {
60     DEFAULT static int bar;
61   };
62   template<typename T>
63   int foo<T>::bar;
64   template struct foo<int>;
65   // CHECK: _ZN6test403fooIiE3barE = weak_odr global
66   // CHECK-HIDDEN: _ZN6test403fooIiE3barE = weak_odr global
67 }
68 
69 namespace test41 {
70   // Unlike gcc we propagate the information that foo not only is hidden, but
71   // has been explicitly marked as so. This lets us produce a hidden undefined
72   // reference to bar.
73   struct __attribute__((visibility("hidden"))) foo {};
74   extern foo bar;
75   foo *zed() {
76     return &bar;
77   }
78   // CHECK: @_ZN6test413barE = external hidden global
79   // CHECK-HIDDEN: @_ZN6test413barE = external hidden global
80 }
81 
82 namespace test48 {
83   // Test that we use the visibility of struct foo when instantiating the
84   // template. Note that is a case where we disagree with gcc, it produces
85   // a default symbol.
86   struct HIDDEN foo {
87   };
88   DEFAULT foo x;
89 
90   struct bar {
91     template<foo *z>
92     struct zed {
93     };
94   };
95 
96   bar::zed<&x> y;
97   // CHECK: _ZN6test481yE = hidden global
98   // CHECK-HIDDEN: _ZN6test481yE = hidden global
99 }
100 
101 // CHECK: @_ZN5Test425VariableInHiddenNamespaceE = hidden global i32 10
102 // CHECK: @_ZN5Test71aE = hidden global
103 // CHECK: @_ZN5Test71bE = global
104 // CHECK: @test9_var = global
105 // CHECK-HIDDEN: @test9_var = global
106 // CHECK: @_ZN6Test121A6hiddenE = external hidden global
107 // CHECK: @_ZN6Test121A7visibleE = external global
108 // CHECK-HIDDEN: @_ZN6Test121A6hiddenE = external hidden global
109 // CHECK-HIDDEN: @_ZN6Test121A7visibleE = external global
110 // CHECK: @_ZN6Test131B1aE = hidden global
111 // CHECK: @_ZN6Test131C1aE = global
112 // CHECK-HIDDEN: @_ZN6Test131B1aE = hidden global
113 // CHECK-HIDDEN: @_ZN6Test131C1aE = global
114 // CHECK: @_ZN6Test143varE = external global
115 // CHECK-HIDDEN: @_ZN6Test143varE = external global
116 // CHECK: @_ZN6Test154TempINS_1AEE5Inner6bufferE = external global [0 x i8]
117 // CHECK-HIDDEN: @_ZN6Test154TempINS_1AEE5Inner6bufferE = external global [0 x i8]
118 
119 namespace test27 {
120   template<typename T>
121   class C {
122     class __attribute__((visibility("default"))) D {
123       void f();
124     };
125   };
126 
127   template<>
128   class C<int>::D {
129     virtual void g();
130   };
131 
132   void C<int>::D::g() {
133   }
134   // CHECK: _ZTVN6test271CIiE1DE = unnamed_addr constant
135   // CHECK-HIDDEN: _ZTVN6test271CIiE1DE = unnamed_addr constant
136 }
137 
138 // CHECK: @_ZZN6Test193fooIiEEvvE1a = linkonce_odr global
139 // CHECK: @_ZGVZN6Test193fooIiEEvvE1a = linkonce_odr global i64
140 // CHECK-HIDDEN: @_ZZN6Test193fooIiEEvvE1a = linkonce_odr hidden global
141 // CHECK-HIDDEN: @_ZGVZN6Test193fooIiEEvvE1a = linkonce_odr hidden global i64
142 // CHECK-HIDDEN: @_ZTVN6Test161AIcEE = external unnamed_addr constant
143 // CHECK-HIDDEN: @_ZTTN6Test161AIcEE = external unnamed_addr constant
144 // CHECK: @_ZTVN5Test63fooE = linkonce_odr hidden unnamed_addr constant
145 
146 namespace Test1 {
147   // CHECK: define hidden void @_ZN5Test11fEv
148   void HIDDEN f() { }
149 
150 }
151 
152 namespace Test2 {
153   struct HIDDEN A {
154     void f();
155   };
156 
157   // A::f is a member function of a hidden class.
158   // CHECK: define hidden void @_ZN5Test21A1fEv
159   void A::f() { }
160 }
161 
162 namespace Test3 {
163   struct HIDDEN A {
164     struct B {
165       void f();
166     };
167   };
168 
169   // B is a nested class where its parent class is hidden.
170   // CHECK: define hidden void @_ZN5Test31A1B1fEv
171   void A::B::f() { }
172 }
173 
174 namespace Test4 HIDDEN {
175   int VariableInHiddenNamespace = 10;
176 
177   // Test4::g is in a hidden namespace.
178   // CHECK: define hidden void @_ZN5Test41gEv
179   void g() { }
180 
181   struct DEFAULT A {
182     void f();
183   };
184 
185   // A has default visibility.
186   // CHECK: define void @_ZN5Test41A1fEv
187   void A::f() { }
188 }
189 
190 namespace Test5 {
191 
192   namespace NS HIDDEN {
193     // f is in NS which is hidden.
194     // CHECK: define hidden void @_ZN5Test52NS1fEv()
195     void f() { }
196   }
197 
198   namespace NS {
199     // g is in NS, but this NS decl is not hidden.
200     // CHECK: define void @_ZN5Test52NS1gEv
201     void g() { }
202   }
203 }
204 
205 // <rdar://problem/8091955>
206 namespace Test6 {
207   struct HIDDEN foo {
208     foo() { }
209     void bonk();
210     virtual void bar() = 0;
211 
212     virtual void zonk() {}
213   };
214 
215   struct barc : public foo {
216     barc();
217     virtual void bar();
218   };
219 
220   barc::barc() {}
221 }
222 
223 namespace Test7 {
224   class HIDDEN A {};
225   A a; // top of file
226 
227   template <A&> struct Aref {
228     static void foo() {}
229   };
230 
231   class B : public A {};
232   B b; // top of file
233 
234   // CHECK: define linkonce_odr hidden void @_ZN5Test74ArefILZNS_1aEEE3fooEv()
235   void test() {
236     Aref<a>::foo();
237   }
238 }
239 
240 namespace Test8 {
241   void foo();
242   void bar() {}
243   // CHECK-HIDDEN: define hidden void @_ZN5Test83barEv()
244   // CHECK-HIDDEN: declare void @_ZN5Test83fooEv()
245 
246   void test() {
247     foo();
248     bar();
249   }
250 }
251 
252 // PR8457
253 namespace Test9 {
254   extern "C" {
255     struct A { int field; };
256     void DEFAULT test9_fun(struct A *a) { }
257     struct A DEFAULT test9_var; // above
258   }
259   // CHECK: define void @test9_fun(
260   // CHECK-HIDDEN: define void @test9_fun(
261 
262   void test() {
263     A a = test9_var;
264     test9_fun(&a);
265   }
266 }
267 
268 // PR8478
269 namespace Test10 {
270   struct A;
271 
272   class DEFAULT B {
273     void foo(A*);
274   };
275 
276   // CHECK: define void @_ZN6Test101B3fooEPNS_1AE(
277   // CHECK-HIDDEN: define void @_ZN6Test101B3fooEPNS_1AE(
278   void B::foo(A*) {}
279 }
280 
281 // PR8492
282 namespace Test11 {
283   struct A {
284     void foo() {}
285     void DEFAULT bar() {}
286   };
287 
288   void test() {
289     A a;
290     a.foo();
291     a.bar();
292   }
293 
294   // CHECK: define linkonce_odr void @_ZN6Test111A3fooEv(
295   // CHECK: define linkonce_odr void @_ZN6Test111A3barEv(
296   // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6Test111A3fooEv(
297   // CHECK-HIDDEN: define linkonce_odr void @_ZN6Test111A3barEv(
298 }
299 
300 // Tested at top of file.
301 namespace Test12 {
302   struct A {
303     // This is hidden in all cases: the explicit attribute takes
304     // priority over -fvisibility on the parent.
305     static int hidden HIDDEN;
306 
307     // This is default in all cases because it's only a declaration.
308     static int visible;
309   };
310 
311   void test() {
312     A::hidden = 0;
313     A::visible = 0;
314   }
315 }
316 
317 // Tested at top of file.
318 namespace Test13 {
319   struct HIDDEN A {};
320 
321   // Should be hidden in all cases.
322   struct B {
323     static A a;
324   };
325   A B::a;
326 
327   // Should be default in all cases.
328   struct DEFAULT C {
329     static A a;
330   };
331   A C::a;
332 };
333 
334 // Tested at top of file.
335 namespace Test14 {
336   // Neither the visibility of the type nor -fvisibility=hidden should
337   // apply to declarations.
338   extern struct A *var;
339 
340   struct A *test() { return var; }
341 }
342 
343 // rdar://problem/8613093
344 namespace Test15 {
345   struct A {};
346   template <class T> struct Temp {
347     struct Inner {
348       static char buffer[0];
349     };
350   };
351 
352   char *test() {
353     return Temp<A>::Inner::buffer;
354   }
355 }
356 
357 namespace Test16 {
358   struct Base1 { virtual void foo(); };
359   struct Base2 : virtual Base1 { virtual void foo(); };
360   template <class T> struct A : virtual Base1, Base2 {
361     virtual void foo();
362   };
363   extern template struct A<char>;
364 
365   void test() {
366     A<char> a;
367     a.foo();
368   }
369 }
370 
371 namespace Test17 {
372   struct HIDDEN A {
373     static void foo();
374     static void DEFAULT bar();
375     static void HIDDEN baz();
376 
377     struct DEFAULT B {
378       static void foo();
379       static void DEFAULT bar();
380       static void HIDDEN baz();
381     };
382   };
383 
384   void test() {
385     A::foo();
386     A::bar();
387     A::baz();
388     A::B::foo();
389     A::B::bar();
390     A::B::baz();
391   }
392   // CHECK: declare hidden void @_ZN6Test171A3fooEv()
393   // CHECK: declare void @_ZN6Test171A3barEv()
394   // CHECK: declare hidden void @_ZN6Test171A3bazEv()
395   // CHECK: declare void @_ZN6Test171A1B3fooEv()
396   // CHECK: declare void @_ZN6Test171A1B3barEv()
397   // CHECK: declare hidden void @_ZN6Test171A1B3bazEv()
398   // CHECK-HIDDEN: declare hidden void @_ZN6Test171A3fooEv()
399   // CHECK-HIDDEN: declare void @_ZN6Test171A3barEv()
400   // CHECK-HIDDEN: declare hidden void @_ZN6Test171A3bazEv()
401   // CHECK-HIDDEN: declare void @_ZN6Test171A1B3fooEv()
402   // CHECK-HIDDEN: declare void @_ZN6Test171A1B3barEv()
403   // CHECK-HIDDEN: declare hidden void @_ZN6Test171A1B3bazEv()
404 }
405 
406 namespace Test18 {
407   template <class T> struct HIDDEN A {
408     static void foo();
409     static void DEFAULT bar();
410     static void HIDDEN baz();
411 
412     struct DEFAULT B {
413       static void foo();
414       static void DEFAULT bar();
415       static void HIDDEN baz();
416     };
417   };
418   struct HIDDEN H;
419 
420   void test() {
421     A<int>::foo();
422     A<int>::bar();
423     A<int>::baz();
424     A<int>::B::foo();
425     A<int>::B::bar();
426     A<int>::B::baz();
427     A<H>::foo();
428     A<H>::bar();
429     A<H>::baz();
430     A<H>::B::foo();
431     A<H>::B::bar();
432     A<H>::B::baz();
433   }
434   // CHECK: declare hidden void @_ZN6Test181AIiE3fooEv()
435   // CHECK: declare void @_ZN6Test181AIiE3barEv()
436   // CHECK: declare hidden void @_ZN6Test181AIiE3bazEv()
437   // CHECK: declare void @_ZN6Test181AIiE1B3fooEv()
438   // CHECK: declare void @_ZN6Test181AIiE1B3barEv()
439   // CHECK: declare hidden void @_ZN6Test181AIiE1B3bazEv()
440   // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3fooEv()
441   // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3barEv()
442   // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3bazEv()
443   // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3fooEv()
444   // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3barEv()
445   // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3bazEv()
446   // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE3fooEv()
447   // CHECK-HIDDEN: declare void @_ZN6Test181AIiE3barEv()
448   // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE3bazEv()
449   // CHECK-HIDDEN: declare void @_ZN6Test181AIiE1B3fooEv()
450   // CHECK-HIDDEN: declare void @_ZN6Test181AIiE1B3barEv()
451   // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE1B3bazEv()
452   // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3fooEv()
453   // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3barEv()
454   // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3bazEv()
455   // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3fooEv()
456   // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3barEv()
457   // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3bazEv()
458 }
459 
460 namespace Test19 {
461   struct A { A(); ~A(); };
462 
463   // Tested at top of file.
464   template <class T> void foo() {
465     static A a;
466   }
467 
468   void test() {
469     foo<int>();
470   }
471 }
472 
473 // Various things with class template specializations.
474 namespace Test20 {
475   template <unsigned> struct HIDDEN A {};
476 
477   // An explicit specialization inherits the explicit visibility of
478   // the template.
479   template <> struct A<0> {
480     static void test0();
481     static void test1();
482   };
483 
484   // CHECK: define hidden void @_ZN6Test201AILj0EE5test0Ev()
485   void A<0>::test0() {}
486 
487   // CHECK: declare hidden void @_ZN6Test201AILj0EE5test1Ev()
488   void test1() {
489     A<0>::test1();
490   }
491 
492   // ...unless that's explicitly overridden.
493   template <> struct DEFAULT A<1> {
494     static void test2();
495     static void test3();
496   };
497 
498   // CHECK: define void @_ZN6Test201AILj1EE5test2Ev()
499   void A<1>::test2() {}
500 
501   // CHECK: declare void @_ZN6Test201AILj1EE5test3Ev()
502   void test3() {
503     A<1>::test3();
504   }
505 
506   // <rdar://problem/8778497>
507   // But we should assume that an unknown specialization has the
508   // explicit visibility settings of the template.
509   template <class T> struct B {
510     static void test4() {}
511     static void test5();
512   };
513 
514   // CHECK: define linkonce_odr hidden void @_ZN6Test201BINS_1AILj2EEEE5test4Ev()
515   void test4() {
516     B<A<2> >::test4();
517   }
518 
519   // CHECK: declare hidden void @_ZN6Test201BINS_1AILj2EEEE5test5Ev()
520   void test5() {
521     B<A<2> >::test5();
522   }
523 }
524 
525 // PR9371
526 namespace test21 {
527   enum En { en };
528   template<En> struct A {
529     __attribute__((visibility("default"))) void foo() {}
530   };
531 
532   // CHECK: define weak_odr void @_ZN6test211AILNS_2EnE0EE3fooEv(
533   template void A<en>::foo();
534 }
535 
536 // rdar://problem/9616154
537 // Visibility on explicit specializations should take precedence.
538 namespace test22 {
539   class A1 {};
540   class A2 {};
541 
542   template <class T> struct B {};
543   template <> struct DEFAULT B<A1> {
544     static void foo();
545     static void bar() {}
546   };
547   template <> struct B<A2> {
548     static void foo();
549     static void bar() {}
550   };
551 
552   void test() {
553     B<A1>::foo();
554     B<A1>::bar();
555     B<A2>::foo();
556     B<A2>::bar();
557   }
558   // CHECK: declare void @_ZN6test221BINS_2A1EE3fooEv()
559   // CHECK: define linkonce_odr void @_ZN6test221BINS_2A1EE3barEv()
560   // CHECK: declare void @_ZN6test221BINS_2A2EE3fooEv()
561   // CHECK: define linkonce_odr void @_ZN6test221BINS_2A2EE3barEv()
562   // CHECK-HIDDEN: declare void @_ZN6test221BINS_2A1EE3fooEv()
563   // CHECK-HIDDEN: define linkonce_odr void @_ZN6test221BINS_2A1EE3barEv()
564   // CHECK-HIDDEN: declare void @_ZN6test221BINS_2A2EE3fooEv()
565   // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test221BINS_2A2EE3barEv()
566 }
567 
568 namespace PR10113 {
569   namespace foo DEFAULT {
570     template<typename T>
571       class bar {
572       void zed() {}
573     };
574   }
575   template class foo::bar<char>;
576   // CHECK: define weak_odr void @_ZN7PR101133foo3barIcE3zedEv
577   // CHECK-HIDDEN: define weak_odr void @_ZN7PR101133foo3barIcE3zedEv
578 
579   struct zed {
580   };
581   template class foo::bar<zed>;
582   // CHECK: define weak_odr void @_ZN7PR101133foo3barINS_3zedEE3zedEv
583   // CHECK-HIDDEN: define weak_odr hidden void @_ZN7PR101133foo3barINS_3zedEE3zedEv
584 }
585 
586 namespace PR11690 {
587   template<class T> struct Class {
588     void size() const {
589     }
590   };
591   template class DEFAULT Class<char>;
592   // CHECK: define weak_odr void @_ZNK7PR116905ClassIcE4sizeEv
593   // CHECK-HIDDEN: define weak_odr void @_ZNK7PR116905ClassIcE4sizeEv
594 
595   template<class T> void Method() {}
596   template  DEFAULT void Method<char>();
597   // CHECK: define weak_odr void @_ZN7PR116906MethodIcEEvv
598   // CHECK-HIDDEN: define weak_odr void @_ZN7PR116906MethodIcEEvv
599 }
600 
601 namespace PR11690_2 {
602   namespace foo DEFAULT {
603     class bar;
604     template<typename T1, typename T2 = bar>
605     class zed {
606       void bar() {
607       }
608     };
609   }
610   struct baz {
611   };
612   template class foo::zed<baz>;
613   // CHECK: define weak_odr void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv
614   // CHECK-HIDDEN: define weak_odr hidden void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv
615 }
616 
617 namespace test23 {
618   // Having a template argument that is explicitly visible should not make
619   // the template instantiation visible.
620   template <typename T>
621   struct X {
622     static void f() {
623     }
624   };
625 
626   class DEFAULT A;
627 
628   void g() {
629     X<A> y;
630     y.f();
631   }
632   // CHECK: define linkonce_odr void @_ZN6test231XINS_1AEE1fEv
633   // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test231XINS_1AEE1fEv
634 }
635 
636 namespace PR12001 {
637   template <typename P1>
638   void Bind(const P1& p1) {
639   }
640 
641   class DEFAULT Version { };
642 
643   void f() {
644     Bind(Version());
645   }
646   // CHECK: define linkonce_odr void @_ZN7PR120014BindINS_7VersionEEEvRKT_
647   // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN7PR120014BindINS_7VersionEEEvRKT_
648 }
649 
650 namespace test24 {
651   class DEFAULT A { };
652 
653   struct S {
654     template <typename T>
655     void mem() {}
656   };
657 
658   void test() {
659     S s;
660     s.mem<A>();
661   }
662   // CHECK: define linkonce_odr void @_ZN6test241S3memINS_1AEEEvv
663   // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test241S3memINS_1AEEEvv
664 }
665 
666 namespace test26 {
667   template<typename T>
668   class C {
669     __attribute__((visibility("default")))  void f();
670   };
671 
672   template<>
673   void C<int>::f() { }
674 
675   // CHECK: define void @_ZN6test261CIiE1fEv
676   // CHECK-HIDDEN: define void @_ZN6test261CIiE1fEv
677 }
678 
679 namespace test31 {
680   struct A {
681     struct HIDDEN B {
682       static void DEFAULT baz();
683     };
684   };
685   void f() {
686     A::B::baz();
687   }
688   // CHECK: declare void @_ZN6test311A1B3bazEv()
689   // CHECK-HIDDEN: declare void @_ZN6test311A1B3bazEv()
690 }
691 
692 namespace test32 {
693   struct HIDDEN A {
694     struct DEFAULT B {
695       void DEFAULT baz();
696     };
697   };
698   void A::B::baz() {
699   }
700   // CHECK: define void @_ZN6test321A1B3bazEv
701   // CHECK-HIDDEN: define void @_ZN6test321A1B3bazEv
702 }
703 
704 namespace test33 {
705   template<typename T>
706   class foo {
707     void bar() {}
708   };
709   struct HIDDEN zed {
710   };
711   template class DEFAULT foo<zed>;
712   // CHECK: define weak_odr void @_ZN6test333fooINS_3zedEE3barEv
713   // CHECK-HIDDEN: define weak_odr void @_ZN6test333fooINS_3zedEE3barEv
714 }
715 
716 namespace test34 {
717   struct foo {
718   };
719   template<class T>
720   void bar() {}
721   template DEFAULT void bar<foo>();
722   // CHECK: define weak_odr void @_ZN6test343barINS_3fooEEEvv
723   // CHECK-HIDDEN: define weak_odr void @_ZN6test343barINS_3fooEEEvv
724 }
725 
726 namespace test35 {
727   // This is a really ugly testcase. GCC propagates the DEFAULT in zed's
728   // definition. It's not really clear what we can do here, because we
729   // produce the symbols before even seeing the DEFAULT definition of zed.
730   // FIXME: Maybe the best thing to do here is error?  It's certainly hard
731   // to argue that this ought to be valid.
732   template<typename T>
733   struct DEFAULT foo {
734     void bar() {}
735   };
736   class zed;
737   template class foo<zed>;
738   class DEFAULT zed {
739   };
740   // CHECK: define weak_odr void @_ZN6test353fooINS_3zedEE3barEv
741   // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test353fooINS_3zedEE3barEv
742 }
743 
744 namespace test36 {
745   template<typename T1, typename T2>
746   class foo {
747     void bar() {}
748   };
749   class DEFAULT S1 {};
750   struct HIDDEN S2 {};
751   template class foo<S1, S2>;
752   // CHECK: define weak_odr hidden void @_ZN6test363fooINS_2S1ENS_2S2EE3barEv
753   // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test363fooINS_2S1ENS_2S2EE3barEv
754 }
755 
756 namespace test37 {
757   struct HIDDEN foo {
758   };
759   template<class T>
760   DEFAULT void bar() {}
761   template DEFAULT void bar<foo>();
762   // CHECK: define weak_odr void @_ZN6test373barINS_3fooEEEvv
763   // CHECK-HIDDEN: define weak_odr void @_ZN6test373barINS_3fooEEEvv
764 }
765 
766 namespace test38 {
767   template<typename T>
768   class DEFAULT foo {
769     void bar() {}
770   };
771   struct HIDDEN zed {
772   };
773   template class foo<zed>;
774   // CHECK: define weak_odr hidden void @_ZN6test383fooINS_3zedEE3barEv
775   // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test383fooINS_3zedEE3barEv
776 }
777 
778 namespace test39 {
779   class DEFAULT default_t;
780   class HIDDEN hidden_t;
781   template <class T> class A {
782     template <class U> class B {
783       HIDDEN void hidden() {}
784       void noattr() {}
785       template <class V> void temp() {}
786     };
787   };
788   template class DEFAULT A<hidden_t>;
789   template class DEFAULT A<hidden_t>::B<hidden_t>;
790   template void A<hidden_t>::B<hidden_t>::temp<default_t>();
791   template void A<hidden_t>::B<hidden_t>::temp<hidden_t>();
792 
793   // CHECK: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E6hiddenEv
794   // CHECK: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E6noattrEv
795   // CHECK: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempINS_9default_tEEEvv
796 
797   // GCC produces a default for this one. Why?
798   // CHECK: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempIS1_EEvv
799 
800   // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E6hiddenEv
801   // CHECK-HIDDEN: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E6noattrEv
802   // CHECK-HIDDEN: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempINS_9default_tEEEvv
803 
804   // GCC produces a default for this one. Why?
805   // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempIS1_EEvv
806 }
807 
808 namespace test42 {
809   struct HIDDEN foo {
810   };
811   template <class P>
812   struct bar {
813   };
814   template <>
815   struct HIDDEN bar<foo> {
816     DEFAULT static void zed();
817   };
818   void bar<foo>::zed() {
819   }
820   // CHECK: define void @_ZN6test423barINS_3fooEE3zedEv
821   // CHECK-HIDDEN: define void @_ZN6test423barINS_3fooEE3zedEv
822 }
823 
824 namespace test43 {
825   struct HIDDEN foo {
826   };
827   template <class P>
828   void bar() {
829   }
830   template <>
831   DEFAULT void bar<foo>() {
832   }
833   // CHECK: define void @_ZN6test433barINS_3fooEEEvv
834   // CHECK-HIDDEN: define void @_ZN6test433barINS_3fooEEEvv
835 }
836 
837 namespace test44 {
838   template <typename T>
839   struct foo {
840     foo() {}
841   };
842   namespace {
843     struct bar;
844   }
845   template struct DEFAULT foo<bar>;
846   foo<bar> x;
847   // CHECK: define internal void @_ZN6test443fooINS_12_GLOBAL__N_13barEEC1Ev
848   // CHECK-HIDDEN: define internal void @_ZN6test443fooINS_12_GLOBAL__N_13barEEC1Ev
849 }
850 
851 namespace test45 {
852   template <typename T>
853   struct foo {
854     template <typename T2>
855     struct bar {
856       bar() {};
857     };
858   };
859   namespace {
860     struct zed;
861   }
862   template struct DEFAULT foo<int>::bar<zed>;
863   foo<int>::bar<zed> x;
864   // CHECK: define internal void @_ZN6test453fooIiE3barINS_12_GLOBAL__N_13zedEEC1Ev
865   // CHECK-HIDDEN: define internal void @_ZN6test453fooIiE3barINS_12_GLOBAL__N_13zedEEC1Ev
866 }
867 
868 namespace test46 {
869   template <typename T>
870   void foo() {
871   }
872   namespace {
873     struct bar;
874   }
875   template DEFAULT void foo<bar>();
876   void zed() {
877     foo<bar>();
878   }
879   // CHECK: define internal void @_ZN6test463fooINS_12_GLOBAL__N_13barEEEvv
880   // CHECK-HIDDEN: define internal void @_ZN6test463fooINS_12_GLOBAL__N_13barEEEvv
881 }
882 
883 namespace test47 {
884   struct foo {
885     template <typename T>
886     static void bar() {
887     }
888   };
889   namespace {
890     struct zed;
891   }
892   template __attribute__((visibility("default"))) void foo::bar<zed>();
893   void baz() {
894     foo::bar<zed>();
895   }
896   // CHECK: define internal void @_ZN6test473foo3barINS_12_GLOBAL__N_13zedEEEvv
897   // CHECK-HIDDEN: define internal void @_ZN6test473foo3barINS_12_GLOBAL__N_13zedEEEvv
898 }
899 
900 namespace test49 {
901   // Test that we use the visibility of struct foo when instantiating the
902   // template. Note that is a case where we disagree with gcc, it produces
903   // a default symbol.
904 
905   struct HIDDEN foo {
906   };
907 
908   DEFAULT foo x;
909 
910   struct bar {
911     template<foo *z>
912     void zed() {
913     }
914   };
915 
916   template void bar::zed<&x>();
917   // CHECK: define weak_odr hidden void @_ZN6test493bar3zedIXadL_ZNS_1xEEEEEvv
918   // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test493bar3zedIXadL_ZNS_1xEEEEEvv
919 }
920 
921 namespace test50 {
922   // Test that we use the visibility of struct foo when instantiating the
923   // template. Note that is a case where we disagree with gcc, it produces
924   // a default symbol.
925 
926   struct HIDDEN foo {
927   };
928   DEFAULT foo x;
929   template<foo *z>
930   struct DEFAULT bar {
931     void zed() {
932     }
933   };
934   template void bar<&x>::zed();
935   // CHECK: define weak_odr hidden void @_ZN6test503barIXadL_ZNS_1xEEEE3zedEv
936   // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test503barIXadL_ZNS_1xEEEE3zedEv
937 }
938 
939 namespace test51 {
940   // Test that we use the visibility of struct foo when instantiating the
941   // template. Note that is a case where we disagree with gcc, it produces
942   // a default symbol.
943 
944   struct HIDDEN foo {
945   };
946   DEFAULT foo x;
947   template<foo *z>
948   void DEFAULT zed() {
949   }
950   template void zed<&x>();
951   // CHECK: define weak_odr hidden void @_ZN6test513zedIXadL_ZNS_1xEEEEEvv
952   // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test513zedIXadL_ZNS_1xEEEEEvv
953 }
954 
955 namespace test52 {
956   // Test that we use the linkage of struct foo when instantiating the
957   // template. Note that is a case where we disagree with gcc, it produces
958   // an external symbol.
959 
960   namespace {
961     struct foo {
962     };
963   }
964   template<foo *x>
965   void zed() {
966   }
967   void f() {
968     zed<nullptr>();
969   }
970   // CHECK: define internal void @_ZN6test523zedILPNS_12_GLOBAL__N_13fooE0EEEvv
971   // CHECK-HIDDEN: define internal void @_ZN6test523zedILPNS_12_GLOBAL__N_13fooE0EEEvv
972 }
973 
974 namespace test53 {
975   template<typename _Tp > struct vector   {
976     static void       _M_fill_insert();
977   };
978 #pragma GCC visibility push(hidden)
979   // GCC doesn't seem to use the visibility of enums at all, we do.
980   enum zed {v1};
981 
982   // GCC fails to mark this specialization hidden, we mark it.
983   template<>
984   struct vector<int> {
985     static void       _M_fill_insert();
986   };
987   void foo() {
988     vector<unsigned>::_M_fill_insert();
989     vector<int>::_M_fill_insert();
990     vector<zed>::_M_fill_insert();
991   }
992 #pragma GCC visibility pop
993   // CHECK: declare void @_ZN6test536vectorIjE14_M_fill_insertEv
994   // CHECK-HIDDEN: declare void @_ZN6test536vectorIjE14_M_fill_insertEv
995   // CHECK: declare hidden void @_ZN6test536vectorIiE14_M_fill_insertEv
996   // CHECK-HIDDEN: declare hidden void @_ZN6test536vectorIiE14_M_fill_insertEv
997   // CHECK: declare hidden void @_ZN6test536vectorINS_3zedEE14_M_fill_insertEv
998   // CHECK-HIDDEN: declare hidden void @_ZN6test536vectorINS_3zedEE14_M_fill_insertEv
999 }
1000 
1001 namespace test54 {
1002   template <class T>
1003   struct foo {
1004     static void bar();
1005   };
1006 #pragma GCC visibility push(hidden)
1007   class zed {
1008     zed(const zed &);
1009   };
1010   void bah() {
1011     foo<zed>::bar();
1012   }
1013 #pragma GCC visibility pop
1014   // CHECK: declare hidden void @_ZN6test543fooINS_3zedEE3barEv
1015   // CHECK-HIDDEN: declare hidden void @_ZN6test543fooINS_3zedEE3barEv
1016 }
1017 
1018 namespace test55 {
1019   template <class T>
1020   struct __attribute__((visibility("hidden"))) foo {
1021     static void bar();
1022   };
1023   template <class T> struct foo;
1024   void foobar() {
1025     foo<int>::bar();
1026   }
1027   // CHECK: declare hidden void @_ZN6test553fooIiE3barEv
1028   // CHECK-HIDDEN: declare hidden void @_ZN6test553fooIiE3barEv
1029 }
1030 
1031 namespace test56 {
1032   template <class T> struct foo;
1033   template <class T>
1034   struct __attribute__((visibility("hidden"))) foo {
1035     static void bar();
1036   };
1037   void foobar() {
1038     foo<int>::bar();
1039   }
1040   // CHECK: declare hidden void @_ZN6test563fooIiE3barEv
1041   // CHECK-HIDDEN: declare hidden void @_ZN6test563fooIiE3barEv
1042 }
1043 
1044 namespace test57 {
1045 #pragma GCC visibility push(hidden)
1046   template <class T>
1047   struct foo;
1048   void bar(foo<int>*);
1049   template <class T>
1050   struct foo {
1051     static void zed();
1052   };
1053   void bah() {
1054     foo<int>::zed();
1055   }
1056 #pragma GCC visibility pop
1057   // CHECK: declare hidden void @_ZN6test573fooIiE3zedEv
1058   // CHECK-HIDDEN: declare hidden void @_ZN6test573fooIiE3zedEv
1059 }
1060 
1061 namespace test58 {
1062 #pragma GCC visibility push(hidden)
1063   struct foo;
1064   template<typename T>
1065   struct __attribute__((visibility("default"))) bar {
1066     static void zed() {
1067     }
1068   };
1069   void bah() {
1070     bar<foo>::zed();
1071   }
1072 #pragma GCC visibility pop
1073   // CHECK: define linkonce_odr hidden void @_ZN6test583barINS_3fooEE3zedEv
1074   // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test583barINS_3fooEE3zedEv
1075 }
1076 
1077 namespace test59 {
1078   DEFAULT int f();
1079   HIDDEN int g();
1080   typedef int (*foo)();
1081   template<foo x, foo y>
1082   void test() {}
1083   void use() {
1084     test<&g, &f>();
1085     // CHECK: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1gEvEEXadL_ZNS_1fEvEEEEvv
1086     // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1gEvEEXadL_ZNS_1fEvEEEEvv
1087 
1088     test<&f, &g>();
1089     // CHECK: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1fEvEEXadL_ZNS_1gEvEEEEvv
1090     // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1fEvEEXadL_ZNS_1gEvEEEEvv
1091   }
1092 }
1093 
1094 namespace test60 {
1095   template<int i>
1096   class __attribute__((visibility("hidden"))) a {};
1097   template<int i>
1098   class __attribute__((visibility("default"))) b {};
1099   template<template<int> class x, template<int> class y>
1100   void test() {}
1101   void use() {
1102     test<a, b>();
1103     // CHECK: define linkonce_odr hidden void @_ZN6test604testINS_1aENS_1bEEEvv
1104     // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test604testINS_1aENS_1bEEEvv
1105 
1106     test<b, a>();
1107     // CHECK: define linkonce_odr hidden void @_ZN6test604testINS_1bENS_1aEEEvv
1108     // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test604testINS_1bENS_1aEEEvv
1109   }
1110 }
1111 
1112 namespace test61 {
1113   template <typename T1>
1114   struct Class1
1115   {
1116     void f1() { f2(); }
1117     inline void f2();
1118   };
1119   template<>
1120   inline void Class1<int>::f2()
1121   {
1122   }
1123   void g(Class1<int> *x) {
1124     x->f1();
1125   }
1126 }
1127 namespace test61 {
1128   // Just test that we don't crash. Currently we apply this attribute. Current
1129   // gcc issues a warning about it being unused since "the type is already
1130   // defined". We should probably do the same.
1131   template class __attribute__ ((visibility("hidden"))) Class1<int>;
1132 }
1133 
1134 namespace test62 {
1135   template <typename T1>
1136   struct Class1
1137   {
1138     void f1() { f2(); }
1139     inline void f2() {}
1140   };
1141   template<>
1142   inline void Class1<int>::f2()
1143   {
1144   }
1145   void g(Class1<int> *x) {
1146     x->f2();
1147   }
1148 }
1149 namespace test62 {
1150   template class __attribute__ ((visibility("hidden"))) Class1<int>;
1151   // Just test that we don't crash. Currently we apply this attribute. Current
1152   // gcc issues a warning about it being unused since "the type is already
1153   // defined". We should probably do the same.
1154 }
1155 
1156 namespace test63 {
1157   enum HIDDEN E { E0 };
1158   struct A {
1159     template <E> static void foo() {}
1160 
1161     template <E> struct B {
1162       static void foo() {}
1163     };
1164   };
1165 
1166   void test() {
1167     A::foo<E0>();
1168     A::B<E0>::foo();
1169   }
1170   // CHECK: define linkonce_odr hidden void @_ZN6test631A3fooILNS_1EE0EEEvv()
1171   // CHECK: define linkonce_odr hidden void @_ZN6test631A1BILNS_1EE0EE3fooEv()
1172 }
1173 
1174 // Don't ignore the visibility of template arguments just because we
1175 // explicitly instantiated something.
1176 namespace test64 {
1177   struct HIDDEN A {};
1178   template <class P> struct B {
1179     static DEFAULT void foo() {}
1180   };
1181 
1182   template class B<A>;
1183   // CHECK: define weak_odr hidden void @_ZN6test641BINS_1AEE3fooEv()
1184 }
1185