xref: /aosp_15_r20/external/clang/test/CodeGenCXX/anonymous-namespaces.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -triple x86_64-apple-darwin10 -emit-llvm %s -o - > %t
2*67e74705SXin Li // RUN: FileCheck %s -check-prefix=CHECK-1 < %t
3*67e74705SXin Li // RUN: FileCheck %s -check-prefix=CHECK-2 < %t
4*67e74705SXin Li 
5*67e74705SXin Li int f();
6*67e74705SXin Li 
7*67e74705SXin Li namespace {
8*67e74705SXin Li   // CHECK-1: @_ZN12_GLOBAL__N_11bE = internal global i32 0
9*67e74705SXin Li   // CHECK-1: @_ZN12_GLOBAL__N_1L1cE = internal global i32 0
10*67e74705SXin Li   // CHECK-1: @_ZN12_GLOBAL__N_11D1dE = internal global i32 0
11*67e74705SXin Li   // CHECK-1: @_ZN12_GLOBAL__N_11aE = internal global i32 0
12*67e74705SXin Li   int a = 0;
13*67e74705SXin Li 
14*67e74705SXin Li   int b = f();
15*67e74705SXin Li 
16*67e74705SXin Li   static int c = f();
17*67e74705SXin Li 
18*67e74705SXin Li   class D {
19*67e74705SXin Li     static int d;
20*67e74705SXin Li   };
21*67e74705SXin Li 
22*67e74705SXin Li   int D::d = f();
23*67e74705SXin Li 
24*67e74705SXin Li   // Check for generation of a VTT with internal linkage
25*67e74705SXin Li   // CHECK-1: @_ZTSN12_GLOBAL__N_11X1EE = internal constant
26*67e74705SXin Li   struct X {
27*67e74705SXin Li     struct EBase { };
~E__anon024255880111::X::E28*67e74705SXin Li     struct E : public virtual EBase { virtual ~E() {} };
29*67e74705SXin Li   };
30*67e74705SXin Li 
31*67e74705SXin Li   // CHECK-1-LABEL: define internal i32 @_ZN12_GLOBAL__N_13fooEv()
foo()32*67e74705SXin Li   int foo() {
33*67e74705SXin Li     return 32;
34*67e74705SXin Li   }
35*67e74705SXin Li 
36*67e74705SXin Li   // CHECK-1-LABEL: define internal i32 @_ZN12_GLOBAL__N_11A3fooEv()
37*67e74705SXin Li   namespace A {
foo()38*67e74705SXin Li     int foo() {
39*67e74705SXin Li       return 45;
40*67e74705SXin Li     }
41*67e74705SXin Li   }
42*67e74705SXin Li }
43*67e74705SXin Li 
concrete()44*67e74705SXin Li int concrete() {
45*67e74705SXin Li   return a + foo() + A::foo();
46*67e74705SXin Li }
47*67e74705SXin Li 
test_XE()48*67e74705SXin Li void test_XE() { throw X::E(); }
49*67e74705SXin Li 
50*67e74705SXin Li // Miscompile on llvmc plugins.
51*67e74705SXin Li namespace test2 {
52*67e74705SXin Li   struct A {
53*67e74705SXin Li     template <class T> struct B {
footest2::A::B54*67e74705SXin Li       static void foo() {}
55*67e74705SXin Li     };
56*67e74705SXin Li   };
57*67e74705SXin Li   namespace {
58*67e74705SXin Li     struct C;
59*67e74705SXin Li   }
60*67e74705SXin Li 
61*67e74705SXin Li   // CHECK-2-LABEL: define void @_ZN5test24testEv()
62*67e74705SXin Li   // CHECK-2:   call void @_ZN5test21A1BINS_12_GLOBAL__N_11CEE3fooEv()
test()63*67e74705SXin Li   void test() {
64*67e74705SXin Li     A::B<C>::foo();
65*67e74705SXin Li   }
66*67e74705SXin Li 
67*67e74705SXin Li   // CHECK-2-LABEL: define internal void @_ZN5test21A1BINS_12_GLOBAL__N_11CEE3fooEv()
68*67e74705SXin Li }
69*67e74705SXin Li 
70*67e74705SXin Li namespace {
71*67e74705SXin Li 
bar()72*67e74705SXin Li int bar() {
73*67e74705SXin Li   extern int a;
74*67e74705SXin Li   return a;
75*67e74705SXin Li }
76*67e74705SXin Li 
77*67e74705SXin Li } // namespace
78