blob: be8e199532b480d7c0cd1994930846e7aaed4d05 [file] [log] [blame]
Anders Carlsson39de84d2010-02-07 01:44:36 +00001// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
John McCall1fb0caa2010-10-22 21:05:15 +00002// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -fvisibility hidden -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-HIDDEN
Anders Carlsson39de84d2010-02-07 01:44:36 +00003
4#define HIDDEN __attribute__((visibility("hidden")))
5#define PROTECTED __attribute__((visibility("protected")))
6#define DEFAULT __attribute__((visibility("default")))
7
Rafael Espindola60115a02012-04-22 00:43:48 +00008namespace 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
Rafael Espindola860097c2012-02-23 04:17:32 +000022namespace 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
Rafael Espindola2f47c362012-03-10 13:01:40 +000037namespace test28 {
38 class DEFAULT foo {
39 };
40 foo myvec;
41 // CHECK: @_ZN6test285myvecE = global
42 // CHECK-HIDDEN: @_ZN6test285myvecE = hidden global
43}
44
Rafael Espindolac7e60602012-04-19 05:50:08 +000045namespace 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
Rafael Espindola797105a2012-05-16 02:10:38 +000057namespace 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
Anders Carlsson39de84d2010-02-07 01:44:36 +000069// CHECK: @_ZN5Test425VariableInHiddenNamespaceE = hidden global i32 10
John McCall1fb0caa2010-10-22 21:05:15 +000070// CHECK: @_ZN5Test71aE = hidden global
71// CHECK: @_ZN5Test71bE = global
John McCallac65c622010-10-26 04:59:26 +000072// CHECK: @test9_var = global
73// CHECK-HIDDEN: @test9_var = global
John McCall110e8e52010-10-29 22:22:43 +000074// CHECK: @_ZN6Test121A6hiddenE = external hidden global
75// CHECK: @_ZN6Test121A7visibleE = external global
76// CHECK-HIDDEN: @_ZN6Test121A6hiddenE = external hidden global
77// CHECK-HIDDEN: @_ZN6Test121A7visibleE = external global
78// CHECK: @_ZN6Test131B1aE = hidden global
79// CHECK: @_ZN6Test131C1aE = global
80// CHECK-HIDDEN: @_ZN6Test131B1aE = hidden global
81// CHECK-HIDDEN: @_ZN6Test131C1aE = global
82// CHECK: @_ZN6Test143varE = external global
83// CHECK-HIDDEN: @_ZN6Test143varE = external global
John McCallee301022010-10-30 09:18:49 +000084// CHECK: @_ZN6Test154TempINS_1AEE5Inner6bufferE = external global [0 x i8]
85// CHECK-HIDDEN: @_ZN6Test154TempINS_1AEE5Inner6bufferE = external global [0 x i8]
Rafael Espindola860097c2012-02-23 04:17:32 +000086
87namespace test27 {
88 template<typename T>
89 class C {
90 class __attribute__((visibility("default"))) D {
91 void f();
92 };
93 };
94
95 template<>
96 class C<int>::D {
97 virtual void g();
98 };
99
100 void C<int>::D::g() {
101 }
102 // CHECK: _ZTVN6test271CIiE1DE = unnamed_addr constant
103 // CHECK-HIDDEN: _ZTVN6test271CIiE1DE = unnamed_addr constant
104}
105
John McCall112c9672010-11-02 21:04:24 +0000106// CHECK: @_ZZN6Test193fooIiEEvvE1a = linkonce_odr global
107// CHECK: @_ZGVZN6Test193fooIiEEvvE1a = linkonce_odr global i64
108// CHECK-HIDDEN: @_ZZN6Test193fooIiEEvvE1a = linkonce_odr hidden global
109// CHECK-HIDDEN: @_ZGVZN6Test193fooIiEEvvE1a = linkonce_odr hidden global i64
Rafael Espindolacd3ac4b2011-01-15 08:23:14 +0000110// CHECK-HIDDEN: @_ZTVN6Test161AIcEE = external unnamed_addr constant
Peter Collingbournebf1c5ae2011-09-26 01:56:36 +0000111// CHECK-HIDDEN: @_ZTTN6Test161AIcEE = external unnamed_addr constant
Anders Carlssonf502d932011-01-24 00:46:19 +0000112// CHECK: @_ZTVN5Test63fooE = linkonce_odr hidden unnamed_addr constant
John McCall1fb0caa2010-10-22 21:05:15 +0000113
Anders Carlsson39de84d2010-02-07 01:44:36 +0000114namespace Test1 {
115 // CHECK: define hidden void @_ZN5Test11fEv
116 void HIDDEN f() { }
117
118}
119
120namespace Test2 {
121 struct HIDDEN A {
122 void f();
123 };
124
125 // A::f is a member function of a hidden class.
126 // CHECK: define hidden void @_ZN5Test21A1fEv
127 void A::f() { }
128}
129
130namespace Test3 {
131 struct HIDDEN A {
132 struct B {
133 void f();
134 };
135 };
136
137 // B is a nested class where its parent class is hidden.
138 // CHECK: define hidden void @_ZN5Test31A1B1fEv
139 void A::B::f() { }
140}
141
142namespace Test4 HIDDEN {
143 int VariableInHiddenNamespace = 10;
144
145 // Test4::g is in a hidden namespace.
146 // CHECK: define hidden void @_ZN5Test41gEv
147 void g() { }
148
149 struct DEFAULT A {
150 void f();
151 };
152
153 // A has default visibility.
154 // CHECK: define void @_ZN5Test41A1fEv
155 void A::f() { }
156}
157
158namespace Test5 {
159
160 namespace NS HIDDEN {
161 // f is in NS which is hidden.
162 // CHECK: define hidden void @_ZN5Test52NS1fEv()
163 void f() { }
164 }
165
166 namespace NS {
167 // g is in NS, but this NS decl is not hidden.
168 // CHECK: define void @_ZN5Test52NS1gEv
169 void g() { }
170 }
171}
Douglas Gregorc66bcfd2010-06-14 23:41:45 +0000172
173// <rdar://problem/8091955>
174namespace Test6 {
175 struct HIDDEN foo {
176 foo() { }
177 void bonk();
178 virtual void bar() = 0;
179
180 virtual void zonk() {}
181 };
182
183 struct barc : public foo {
184 barc();
185 virtual void bar();
186 };
187
188 barc::barc() {}
189}
John McCall1fb0caa2010-10-22 21:05:15 +0000190
191namespace Test7 {
192 class HIDDEN A {};
193 A a; // top of file
194
195 template <A&> struct Aref {
196 static void foo() {}
197 };
198
199 class B : public A {};
200 B b; // top of file
201
202 // CHECK: define linkonce_odr hidden void @_ZN5Test74ArefILZNS_1aEEE3fooEv()
203 void test() {
204 Aref<a>::foo();
205 }
206}
207
208namespace Test8 {
209 void foo();
210 void bar() {}
211 // CHECK-HIDDEN: define hidden void @_ZN5Test83barEv()
212 // CHECK-HIDDEN: declare void @_ZN5Test83fooEv()
213
214 void test() {
215 foo();
216 bar();
217 }
218}
John McCallac65c622010-10-26 04:59:26 +0000219
220// PR8457
221namespace Test9 {
222 extern "C" {
223 struct A { int field; };
224 void DEFAULT test9_fun(struct A *a) { }
225 struct A DEFAULT test9_var; // above
226 }
227 // CHECK: define void @test9_fun(
228 // CHECK-HIDDEN: define void @test9_fun(
229
230 void test() {
231 A a = test9_var;
232 test9_fun(&a);
233 }
234}
John McCall67fa6d52010-10-28 07:07:52 +0000235
236// PR8478
237namespace Test10 {
238 struct A;
239
Eli Friedmanfc038e92011-12-17 00:36:09 +0000240 class DEFAULT B {
John McCall67fa6d52010-10-28 07:07:52 +0000241 void foo(A*);
242 };
243
244 // CHECK: define void @_ZN6Test101B3fooEPNS_1AE(
245 // CHECK-HIDDEN: define void @_ZN6Test101B3fooEPNS_1AE(
246 void B::foo(A*) {}
247}
John McCall0df95872010-10-29 00:29:13 +0000248
249// PR8492
250namespace Test11 {
251 struct A {
252 void foo() {}
253 void DEFAULT bar() {}
254 };
255
256 void test() {
257 A a;
258 a.foo();
259 a.bar();
260 }
261
262 // CHECK: define linkonce_odr void @_ZN6Test111A3fooEv(
263 // CHECK: define linkonce_odr void @_ZN6Test111A3barEv(
264 // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6Test111A3fooEv(
265 // CHECK-HIDDEN: define linkonce_odr void @_ZN6Test111A3barEv(
266}
John McCall110e8e52010-10-29 22:22:43 +0000267
268// Tested at top of file.
269namespace Test12 {
270 struct A {
271 // This is hidden in all cases: the explicit attribute takes
272 // priority over -fvisibility on the parent.
273 static int hidden HIDDEN;
274
275 // This is default in all cases because it's only a declaration.
276 static int visible;
277 };
278
279 void test() {
280 A::hidden = 0;
281 A::visible = 0;
282 }
283}
284
285// Tested at top of file.
286namespace Test13 {
287 struct HIDDEN A {};
288
289 // Should be hidden in all cases.
290 struct B {
291 static A a;
292 };
293 A B::a;
294
295 // Should be default in all cases.
296 struct DEFAULT C {
297 static A a;
298 };
299 A C::a;
300};
301
302// Tested at top of file.
303namespace Test14 {
304 // Neither the visibility of the type nor -fvisibility=hidden should
305 // apply to declarations.
306 extern struct A *var;
307
308 struct A *test() { return var; }
309}
John McCallee301022010-10-30 09:18:49 +0000310
311// rdar://problem/8613093
312namespace Test15 {
313 struct A {};
314 template <class T> struct Temp {
315 struct Inner {
316 static char buffer[0];
317 };
318 };
319
320 char *test() {
321 return Temp<A>::Inner::buffer;
322 }
323}
John McCallaf146032010-10-30 11:50:40 +0000324
325namespace Test16 {
326 struct Base1 { virtual void foo(); };
327 struct Base2 : virtual Base1 { virtual void foo(); };
328 template <class T> struct A : virtual Base1, Base2 {
329 virtual void foo();
330 };
331 extern template struct A<char>;
332
333 void test() {
334 A<char> a;
335 a.foo();
336 }
337}
John McCall36987482010-11-02 01:45:15 +0000338
339namespace Test17 {
340 struct HIDDEN A {
341 static void foo();
342 static void DEFAULT bar();
343 static void HIDDEN baz();
344
345 struct DEFAULT B {
346 static void foo();
347 static void DEFAULT bar();
348 static void HIDDEN baz();
349 };
350 };
351
352 void test() {
353 A::foo();
354 A::bar();
355 A::baz();
356 A::B::foo();
357 A::B::bar();
358 A::B::baz();
359 }
360 // CHECK: declare hidden void @_ZN6Test171A3fooEv()
361 // CHECK: declare void @_ZN6Test171A3barEv()
362 // CHECK: declare hidden void @_ZN6Test171A3bazEv()
363 // CHECK: declare void @_ZN6Test171A1B3fooEv()
364 // CHECK: declare void @_ZN6Test171A1B3barEv()
365 // CHECK: declare hidden void @_ZN6Test171A1B3bazEv()
366 // CHECK-HIDDEN: declare hidden void @_ZN6Test171A3fooEv()
367 // CHECK-HIDDEN: declare void @_ZN6Test171A3barEv()
368 // CHECK-HIDDEN: declare hidden void @_ZN6Test171A3bazEv()
369 // CHECK-HIDDEN: declare void @_ZN6Test171A1B3fooEv()
370 // CHECK-HIDDEN: declare void @_ZN6Test171A1B3barEv()
371 // CHECK-HIDDEN: declare hidden void @_ZN6Test171A1B3bazEv()
372}
373
374namespace Test18 {
375 template <class T> struct HIDDEN A {
376 static void foo();
377 static void DEFAULT bar();
378 static void HIDDEN baz();
379
380 struct DEFAULT B {
381 static void foo();
382 static void DEFAULT bar();
383 static void HIDDEN baz();
384 };
385 };
386 struct HIDDEN H;
387
388 void test() {
389 A<int>::foo();
390 A<int>::bar();
391 A<int>::baz();
392 A<int>::B::foo();
393 A<int>::B::bar();
394 A<int>::B::baz();
395 A<H>::foo();
396 A<H>::bar();
397 A<H>::baz();
398 A<H>::B::foo();
399 A<H>::B::bar();
400 A<H>::B::baz();
401 }
402 // CHECK: declare hidden void @_ZN6Test181AIiE3fooEv()
403 // CHECK: declare void @_ZN6Test181AIiE3barEv()
404 // CHECK: declare hidden void @_ZN6Test181AIiE3bazEv()
405 // CHECK: declare void @_ZN6Test181AIiE1B3fooEv()
406 // CHECK: declare void @_ZN6Test181AIiE1B3barEv()
407 // CHECK: declare hidden void @_ZN6Test181AIiE1B3bazEv()
408 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3fooEv()
409 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3barEv()
410 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3bazEv()
411 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3fooEv()
412 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3barEv()
413 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3bazEv()
414 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE3fooEv()
415 // CHECK-HIDDEN: declare void @_ZN6Test181AIiE3barEv()
416 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE3bazEv()
417 // CHECK-HIDDEN: declare void @_ZN6Test181AIiE1B3fooEv()
418 // CHECK-HIDDEN: declare void @_ZN6Test181AIiE1B3barEv()
419 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE1B3bazEv()
420 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3fooEv()
421 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3barEv()
422 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3bazEv()
423 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3fooEv()
424 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3barEv()
425 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3bazEv()
426}
John McCall112c9672010-11-02 21:04:24 +0000427
428namespace Test19 {
429 struct A { A(); ~A(); };
430
431 // Tested at top of file.
432 template <class T> void foo() {
433 static A a;
434 }
435
436 void test() {
437 foo<int>();
438 }
439}
John McCall7f1b9872010-12-18 03:30:47 +0000440
441// Various things with class template specializations.
442namespace Test20 {
443 template <unsigned> struct HIDDEN A {};
444
445 // An explicit specialization inherits the explicit visibility of
446 // the template.
447 template <> struct A<0> {
448 static void test0();
449 static void test1();
450 };
451
452 // CHECK: define hidden void @_ZN6Test201AILj0EE5test0Ev()
453 void A<0>::test0() {}
454
455 // CHECK: declare hidden void @_ZN6Test201AILj0EE5test1Ev()
456 void test1() {
457 A<0>::test1();
458 }
459
460 // ...unless that's explicitly overridden.
461 template <> struct DEFAULT A<1> {
462 static void test2();
463 static void test3();
464 };
465
466 // CHECK: define void @_ZN6Test201AILj1EE5test2Ev()
467 void A<1>::test2() {}
468
469 // CHECK: declare void @_ZN6Test201AILj1EE5test3Ev()
470 void test3() {
471 A<1>::test3();
472 }
473
474 // <rdar://problem/8778497>
475 // But we should assume that an unknown specialization has the
476 // explicit visibility settings of the template.
477 template <class T> struct B {
478 static void test4() {}
479 static void test5();
480 };
481
482 // CHECK: define linkonce_odr hidden void @_ZN6Test201BINS_1AILj2EEEE5test4Ev()
483 void test4() {
484 B<A<2> >::test4();
485 }
486
Rafael Espindola093ecc92012-01-14 00:30:36 +0000487 // CHECK: declare hidden void @_ZN6Test201BINS_1AILj2EEEE5test5Ev()
John McCall7f1b9872010-12-18 03:30:47 +0000488 void test5() {
489 B<A<2> >::test5();
490 }
491}
John McCall1a0918a2011-03-04 10:39:25 +0000492
493// PR9371
494namespace test21 {
495 enum En { en };
496 template<En> struct A {
497 __attribute__((visibility("default"))) void foo() {}
498 };
499
500 // CHECK: define weak_odr void @_ZN6test211AILNS_2EnE0EE3fooEv(
501 template void A<en>::foo();
502}
John McCall6ce51ee2011-06-27 23:06:04 +0000503
504// rdar://problem/9616154
505// Visibility on explicit specializations should take precedence.
506namespace test22 {
507 class A1 {};
508 class A2 {};
509
510 template <class T> struct B {};
511 template <> struct DEFAULT B<A1> {
512 static void foo();
513 static void bar() {}
514 };
515 template <> struct B<A2> {
516 static void foo();
517 static void bar() {}
518 };
519
520 void test() {
521 B<A1>::foo();
522 B<A1>::bar();
523 B<A2>::foo();
524 B<A2>::bar();
525 }
526 // CHECK: declare void @_ZN6test221BINS_2A1EE3fooEv()
527 // CHECK: define linkonce_odr void @_ZN6test221BINS_2A1EE3barEv()
528 // CHECK: declare void @_ZN6test221BINS_2A2EE3fooEv()
529 // CHECK: define linkonce_odr void @_ZN6test221BINS_2A2EE3barEv()
530 // CHECK-HIDDEN: declare void @_ZN6test221BINS_2A1EE3fooEv()
531 // CHECK-HIDDEN: define linkonce_odr void @_ZN6test221BINS_2A1EE3barEv()
532 // CHECK-HIDDEN: declare void @_ZN6test221BINS_2A2EE3fooEv()
533 // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test221BINS_2A2EE3barEv()
534}
Rafael Espindola71cb8a22012-01-01 18:06:40 +0000535
536namespace PR10113 {
Rafael Espindolab5d763d2012-01-02 06:26:22 +0000537 namespace foo DEFAULT {
Rafael Espindola71cb8a22012-01-01 18:06:40 +0000538 template<typename T>
539 class bar {
540 void zed() {}
541 };
542 }
543 template class foo::bar<char>;
544 // CHECK: define weak_odr void @_ZN7PR101133foo3barIcE3zedEv
545 // CHECK-HIDDEN: define weak_odr void @_ZN7PR101133foo3barIcE3zedEv
Rafael Espindola093ecc92012-01-14 00:30:36 +0000546
547 struct zed {
548 };
549 template class foo::bar<zed>;
550 // CHECK: define weak_odr void @_ZN7PR101133foo3barINS_3zedEE3zedEv
Rafael Espindola51183372012-04-22 12:37:27 +0000551
552 // FIXME: This should be hidden as zed is hidden.
553 // CHECK-HIDDEN: define weak_odr void @_ZN7PR101133foo3barINS_3zedEE3zedEv
Rafael Espindola71cb8a22012-01-01 18:06:40 +0000554}
Rafael Espindola0257b7f2012-01-03 06:04:21 +0000555
556namespace PR11690 {
557 template<class T> struct Class {
558 void size() const {
559 }
560 };
561 template class DEFAULT Class<char>;
562 // CHECK: define weak_odr void @_ZNK7PR116905ClassIcE4sizeEv
563 // CHECK-HIDDEN: define weak_odr void @_ZNK7PR116905ClassIcE4sizeEv
Rafael Espindola256fc4d2012-01-04 05:40:59 +0000564
565 template<class T> void Method() {}
Rafael Espindola093ecc92012-01-14 00:30:36 +0000566 template DEFAULT void Method<char>();
Rafael Espindola256fc4d2012-01-04 05:40:59 +0000567 // CHECK: define weak_odr void @_ZN7PR116906MethodIcEEvv
568 // CHECK-HIDDEN: define weak_odr void @_ZN7PR116906MethodIcEEvv
Rafael Espindola0257b7f2012-01-03 06:04:21 +0000569}
Rafael Espindola093ecc92012-01-14 00:30:36 +0000570
571namespace PR11690_2 {
572 namespace foo DEFAULT {
573 class bar;
574 template<typename T1, typename T2 = bar>
575 class zed {
576 void bar() {
577 }
578 };
579 }
580 struct baz {
581 };
582 template class foo::zed<baz>;
583 // CHECK: define weak_odr void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv
Rafael Espindola51183372012-04-22 12:37:27 +0000584
585 // FIXME: This should be hidden as baz is hidden.
586 // CHECK-HIDDEN: define weak_odr void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv
Rafael Espindola093ecc92012-01-14 00:30:36 +0000587}
Rafael Espindola860097c2012-02-23 04:17:32 +0000588
589namespace test23 {
590 // Having a template argument that is explicitly visible should not make
591 // the template instantiation visible.
592 template <typename T>
593 struct X {
594 static void f() {
595 }
596 };
597
598 class DEFAULT A;
599
600 void g() {
601 X<A> y;
602 y.f();
603 }
604 // CHECK: define linkonce_odr void @_ZN6test231XINS_1AEE1fEv
605 // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test231XINS_1AEE1fEv
606}
607
608namespace PR12001 {
609 template <typename P1>
610 void Bind(const P1& p1) {
611 }
612
613 class DEFAULT Version { };
614
615 void f() {
616 Bind(Version());
617 }
618 // CHECK: define linkonce_odr void @_ZN7PR120014BindINS_7VersionEEEvRKT_
619 // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN7PR120014BindINS_7VersionEEEvRKT_
620}
621
622namespace test24 {
623 class DEFAULT A { };
624
625 struct S {
626 template <typename T>
627 void mem() {}
628 };
629
630 void test() {
631 S s;
632 s.mem<A>();
633 }
634 // CHECK: define linkonce_odr void @_ZN6test241S3memINS_1AEEEvv
635 // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test241S3memINS_1AEEEvv
636}
637
638namespace test26 {
639 template<typename T>
640 class C {
641 __attribute__((visibility("default"))) void f();
642 };
643
644 template<>
645 void C<int>::f() { }
646
647 // CHECK: define void @_ZN6test261CIiE1fEv
648 // CHECK-HIDDEN: define void @_ZN6test261CIiE1fEv
649}
Rafael Espindolabc356d02012-04-22 01:22:25 +0000650
651namespace test31 {
652 struct A {
653 struct HIDDEN B {
654 static void DEFAULT baz();
655 };
656 };
657 void f() {
658 A::B::baz();
659 }
660 // CHECK: declare void @_ZN6test311A1B3bazEv()
661 // CHECK-HIDDEN: declare void @_ZN6test311A1B3bazEv()
662}
Rafael Espindolaa77e0722012-04-22 02:41:22 +0000663
664namespace test32 {
665 struct HIDDEN A {
666 struct DEFAULT B {
667 void DEFAULT baz();
668 };
669 };
670 void A::B::baz() {
671 }
672 // CHECK: define void @_ZN6test321A1B3bazEv
673 // CHECK-HIDDEN: define void @_ZN6test321A1B3bazEv
674}
Rafael Espindolaf6a8b9c2012-04-22 15:31:59 +0000675
676namespace test33 {
677 template<typename T>
678 class foo {
679 void bar() {}
Rafael Espindolaf6a8b9c2012-04-22 15:31:59 +0000680 };
Rafael Espindola71776ef2012-04-22 16:03:00 +0000681 struct HIDDEN zed {
Rafael Espindolaf6a8b9c2012-04-22 15:31:59 +0000682 };
Rafael Espindola71776ef2012-04-22 16:03:00 +0000683 template class DEFAULT foo<zed>;
Rafael Espindolaf6a8b9c2012-04-22 15:31:59 +0000684 // CHECK: define weak_odr void @_ZN6test333fooINS_3zedEE3barEv
685 // CHECK-HIDDEN: define weak_odr void @_ZN6test333fooINS_3zedEE3barEv
686}
Rafael Espindolaa5416bd2012-04-22 22:31:25 +0000687
688namespace test34 {
689 struct foo {
690 };
691 template<class T>
692 void bar() {}
693 template DEFAULT void bar<foo>();
694 // CHECK: define weak_odr void @_ZN6test343barINS_3fooEEEvv
695 // CHECK-HIDDEN: define weak_odr void @_ZN6test343barINS_3fooEEEvv
696}
Rafael Espindola546ee6d2012-04-23 14:02:53 +0000697
698namespace test35 {
699 // This is a really ugly testcase. GCC propagates the DEFAULT in zed's
700 // definition. What we do instead is be conservative about merging
701 // implicit visibilities.
702 // FIXME: Maybe the best thing to do here is error? The test at least
703 // makes sure we don't produce a hidden symbol for foo<zed>::bar.
704 template<typename T>
705 struct DEFAULT foo {
706 void bar() {}
707 };
708 class zed;
709 template class foo<zed>;
710 class DEFAULT zed {
711 };
712 // CHECK: define weak_odr void @_ZN6test353fooINS_3zedEE3barEv
713 // CHECK-HIDDEN: define weak_odr void @_ZN6test353fooINS_3zedEE3barEv
714}
Rafael Espindola923b0c92012-04-23 17:51:55 +0000715
716namespace test36 {
717 template<typename T1, typename T2>
718 class foo {
719 void bar() {}
720 };
721 class DEFAULT S1 {};
722 struct HIDDEN S2 {};
723 template class foo<S1, S2>;
724 // CHECK: define weak_odr hidden void @_ZN6test363fooINS_2S1ENS_2S2EE3barEv
725 // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test363fooINS_2S1ENS_2S2EE3barEv
726}
Rafael Espindola31c195a2012-05-15 14:09:55 +0000727
728namespace test37 {
729 struct HIDDEN foo {
730 };
731 template<class T>
732 DEFAULT void bar() {}
733 template DEFAULT void bar<foo>();
734 // CHECK: define weak_odr void @_ZN6test373barINS_3fooEEEvv
735 // CHECK-HIDDEN: define weak_odr void @_ZN6test373barINS_3fooEEEvv
736}
737
738namespace test38 {
739 template<typename T>
740 class DEFAULT foo {
741 void bar() {}
742 };
743 struct HIDDEN zed {
744 };
745 template class foo<zed>;
746 // CHECK: define weak_odr hidden void @_ZN6test383fooINS_3zedEE3barEv
747 // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test383fooINS_3zedEE3barEv
748}
749
750namespace test39 {
751 class DEFAULT default_t;
752 class HIDDEN hidden_t;
753 template <class T> class A {
754 template <class U> class B {
755 HIDDEN void hidden() {}
756 void noattr() {}
757 template <class V> void temp() {}
758 };
759 };
760 template class DEFAULT A<hidden_t>;
761 template class DEFAULT A<hidden_t>::B<hidden_t>;
762 template void A<hidden_t>::B<hidden_t>::temp<default_t>();
763 template void A<hidden_t>::B<hidden_t>::temp<hidden_t>();
764
765 // CHECK: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E6hiddenEv
766 // CHECK: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E6noattrEv
767 // CHECK: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempINS_9default_tEEEvv
768
769 // GCC produces a default for this one. Why?
770 // CHECK: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempIS1_EEvv
771
772 // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E6hiddenEv
773 // CHECK-HIDDEN: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E6noattrEv
774 // CHECK-HIDDEN: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempINS_9default_tEEEvv
775
776 // GCC produces a default for this one. Why?
777 // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempIS1_EEvv
778}