xref: /aosp_15_r20/external/clang/test/SemaCXX/ast-print.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple %ms_abi_triple -ast-print %s -std=gnu++11 | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // CHECK: r;
4*67e74705SXin Li // CHECK-NEXT: (r->method());
5*67e74705SXin Li struct MyClass
6*67e74705SXin Li {
methodMyClass7*67e74705SXin Li     void method() {}
8*67e74705SXin Li };
9*67e74705SXin Li 
10*67e74705SXin Li struct Reference
11*67e74705SXin Li {
12*67e74705SXin Li     MyClass* object;
operator ->Reference13*67e74705SXin Li     MyClass* operator ->() { return object; }
14*67e74705SXin Li };
15*67e74705SXin Li 
test1()16*67e74705SXin Li void test1() {
17*67e74705SXin Li     Reference r;
18*67e74705SXin Li     (r->method());
19*67e74705SXin Li }
20*67e74705SXin Li 
21*67e74705SXin Li // CHECK: if (int a = 1)
22*67e74705SXin Li // CHECK:  while (int a = 1)
23*67e74705SXin Li // CHECK:  switch (int a = 1)
24*67e74705SXin Li 
test2()25*67e74705SXin Li void test2()
26*67e74705SXin Li {
27*67e74705SXin Li     if (int a = 1) { }
28*67e74705SXin Li     while (int a = 1) { }
29*67e74705SXin Li     switch (int a = 1) { }
30*67e74705SXin Li }
31*67e74705SXin Li 
32*67e74705SXin Li // CHECK: new (1) int;
33*67e74705SXin Li void *operator new (typeof(sizeof(1)), int, int = 2);
test3()34*67e74705SXin Li void test3() {
35*67e74705SXin Li   new (1) int;
36*67e74705SXin Li }
37*67e74705SXin Li 
38*67e74705SXin Li // CHECK: new X;
39*67e74705SXin Li struct X {
40*67e74705SXin Li   void *operator new (typeof(sizeof(1)), int = 2);
41*67e74705SXin Li };
test4()42*67e74705SXin Li void test4() { new X; }
43*67e74705SXin Li 
44*67e74705SXin Li // CHECK: for (int i = 2097, j = 42; false;)
test5()45*67e74705SXin Li void test5() {
46*67e74705SXin Li   for (int i = 2097, j = 42; false;) {}
47*67e74705SXin Li }
48*67e74705SXin Li 
49*67e74705SXin Li // CHECK: test6fn((int &)y);
50*67e74705SXin Li void test6fn(int& x);
test6()51*67e74705SXin Li void test6() {
52*67e74705SXin Li     unsigned int y = 0;
53*67e74705SXin Li     test6fn((int&)y);
54*67e74705SXin Li }
55*67e74705SXin Li 
56*67e74705SXin Li // CHECK: S s(1, 2);
57*67e74705SXin Li 
test7()58*67e74705SXin Li template <class S> void test7()
59*67e74705SXin Li {
60*67e74705SXin Li     S s( 1,2 );
61*67e74705SXin Li }
62*67e74705SXin Li 
63*67e74705SXin Li 
64*67e74705SXin Li // CHECK: t.~T();
65*67e74705SXin Li 
test8(T t)66*67e74705SXin Li template <typename T> void test8(T t) { t.~T(); }
67*67e74705SXin Li 
68*67e74705SXin Li 
69*67e74705SXin Li // CHECK:      enum E
70*67e74705SXin Li // CHECK-NEXT:  A,
71*67e74705SXin Li // CHECK-NEXT:  B,
72*67e74705SXin Li // CHECK-NEXT:  C
73*67e74705SXin Li // CHECK-NEXT:  };
74*67e74705SXin Li // CHECK-NEXT: {{^[ ]+}}E a = A;
75*67e74705SXin Li 
76*67e74705SXin Li struct test9
77*67e74705SXin Li {
ftest978*67e74705SXin Li     void f()
79*67e74705SXin Li     {
80*67e74705SXin Li         enum E { A, B, C };
81*67e74705SXin Li         E a = A;
82*67e74705SXin Li     }
83*67e74705SXin Li };
84*67e74705SXin Li 
85*67e74705SXin Li namespace test10 {
86*67e74705SXin Li   namespace M {
87*67e74705SXin Li     template<typename T>
88*67e74705SXin Li     struct X {
89*67e74705SXin Li       enum { value };
90*67e74705SXin Li     };
91*67e74705SXin Li   }
92*67e74705SXin Li }
93*67e74705SXin Li 
94*67e74705SXin Li typedef int INT;
95*67e74705SXin Li 
96*67e74705SXin Li // CHECK: test11
97*67e74705SXin Li // CHECK-NEXT: return test10::M::X<INT>::value;
test11()98*67e74705SXin Li int test11() {
99*67e74705SXin Li   return test10::M::X<INT>::value;
100*67e74705SXin Li }
101*67e74705SXin Li 
102*67e74705SXin Li 
103*67e74705SXin Li struct DefaultArgClass
104*67e74705SXin Li {
DefaultArgClassDefaultArgClass105*67e74705SXin Li   DefaultArgClass(int a = 1) {}
DefaultArgClassDefaultArgClass106*67e74705SXin Li   DefaultArgClass(int a, int b, int c = 1) {}
107*67e74705SXin Li };
108*67e74705SXin Li 
109*67e74705SXin Li struct NoArgClass
110*67e74705SXin Li {
NoArgClassNoArgClass111*67e74705SXin Li   NoArgClass() {}
112*67e74705SXin Li };
113*67e74705SXin Li 
114*67e74705SXin Li struct VirualDestrClass
115*67e74705SXin Li {
116*67e74705SXin Li   VirualDestrClass(int arg);
117*67e74705SXin Li   virtual ~VirualDestrClass();
118*67e74705SXin Li };
119*67e74705SXin Li 
120*67e74705SXin Li struct ConstrWithCleanupsClass
121*67e74705SXin Li {
122*67e74705SXin Li   ConstrWithCleanupsClass(const VirualDestrClass& cplx = VirualDestrClass(42));
123*67e74705SXin Li };
124*67e74705SXin Li 
125*67e74705SXin Li // CHECK: test12
126*67e74705SXin Li // CHECK-NEXT: DefaultArgClass useDefaultArg;
127*67e74705SXin Li // CHECK-NEXT: DefaultArgClass overrideDefaultArg(1);
128*67e74705SXin Li // CHECK-NEXT: DefaultArgClass(1, 2);
129*67e74705SXin Li // CHECK-NEXT: DefaultArgClass(1, 2, 3);
130*67e74705SXin Li // CHECK-NEXT: NoArgClass noArg;
131*67e74705SXin Li // CHECK-NEXT: ConstrWithCleanupsClass cwcNoArg;
132*67e74705SXin Li // CHECK-NEXT: ConstrWithCleanupsClass cwcOverrideArg(48);
133*67e74705SXin Li // CHECK-NEXT: ConstrWithCleanupsClass cwcExplicitArg(VirualDestrClass(56));
test12()134*67e74705SXin Li void test12() {
135*67e74705SXin Li   DefaultArgClass useDefaultArg;
136*67e74705SXin Li   DefaultArgClass overrideDefaultArg(1);
137*67e74705SXin Li   DefaultArgClass tempWithDefaultArg = DefaultArgClass(1, 2);
138*67e74705SXin Li   DefaultArgClass tempWithExplictArg = DefaultArgClass(1, 2, 3);
139*67e74705SXin Li   NoArgClass noArg;
140*67e74705SXin Li   ConstrWithCleanupsClass cwcNoArg;
141*67e74705SXin Li   ConstrWithCleanupsClass cwcOverrideArg(48);
142*67e74705SXin Li   ConstrWithCleanupsClass cwcExplicitArg(VirualDestrClass(56));
143*67e74705SXin Li }
144*67e74705SXin Li 
145*67e74705SXin Li // CHECK: void test13() {
146*67e74705SXin Li // CHECK:   _Atomic(int) i;
147*67e74705SXin Li // CHECK:   __c11_atomic_init(&i, 0);
148*67e74705SXin Li // CHECK:   __c11_atomic_load(&i, 0);
149*67e74705SXin Li // CHECK: }
test13()150*67e74705SXin Li void test13() {
151*67e74705SXin Li   _Atomic(int) i;
152*67e74705SXin Li   __c11_atomic_init(&i, 0);
153*67e74705SXin Li   __c11_atomic_load(&i, 0);
154*67e74705SXin Li }
155*67e74705SXin Li 
156*67e74705SXin Li 
157*67e74705SXin Li // CHECK: void test14() {
158*67e74705SXin Li // CHECK:     struct X {
159*67e74705SXin Li // CHECK:         union {
160*67e74705SXin Li // CHECK:             int x;
161*67e74705SXin Li // CHECK:         } x;
162*67e74705SXin Li // CHECK:     };
163*67e74705SXin Li // CHECK: }
test14()164*67e74705SXin Li void test14() {
165*67e74705SXin Li   struct X { union { int x; } x; };
166*67e74705SXin Li }
167*67e74705SXin Li 
168*67e74705SXin Li 
169*67e74705SXin Li // CHECK: float test15() {
170*67e74705SXin Li // CHECK:     return __builtin_asinf(1.F);
171*67e74705SXin Li // CHECK: }
172*67e74705SXin Li // CHECK-NOT: extern "C"
test15()173*67e74705SXin Li float test15() {
174*67e74705SXin Li   return __builtin_asinf(1.0F);
175*67e74705SXin Li }
176*67e74705SXin Li 
177*67e74705SXin Li namespace PR18776 {
178*67e74705SXin Li struct A {
179*67e74705SXin Li   operator void *();
180*67e74705SXin Li   explicit operator bool();
181*67e74705SXin Li   A operator&(A);
182*67e74705SXin Li };
183*67e74705SXin Li 
184*67e74705SXin Li // CHECK: struct A
185*67e74705SXin Li // CHECK-NEXT: {{^[ ]*operator}} void *();
186*67e74705SXin Li // CHECK-NEXT: {{^[ ]*explicit}} operator bool();
187*67e74705SXin Li 
188*67e74705SXin Li void bar(void *);
189*67e74705SXin Li 
foo()190*67e74705SXin Li void foo() {
191*67e74705SXin Li   A a, b;
192*67e74705SXin Li   bar(a & b);
193*67e74705SXin Li // CHECK: bar(a & b);
194*67e74705SXin Li   if (a & b)
195*67e74705SXin Li // CHECK: if (a & b)
196*67e74705SXin Li     return;
197*67e74705SXin Li }
198*67e74705SXin Li };
199*67e74705SXin Li 
200*67e74705SXin Li namespace {
test(int i)201*67e74705SXin Li void test(int i) {
202*67e74705SXin Li   switch (i) {
203*67e74705SXin Li     case 1:
204*67e74705SXin Li       // CHECK: {{\[\[clang::fallthrough\]\]}}
205*67e74705SXin Li       [[clang::fallthrough]];
206*67e74705SXin Li     case 2:
207*67e74705SXin Li       break;
208*67e74705SXin Li   }
209*67e74705SXin Li }
210*67e74705SXin Li }
211*67e74705SXin Li 
212*67e74705SXin Li namespace {
213*67e74705SXin Li // CHECK: struct {{\[\[gnu::visibility\(\"hidden\"\)\]\]}} S;
214*67e74705SXin Li struct [[gnu::visibility("hidden")]] S;
215*67e74705SXin Li }
216*67e74705SXin Li 
217*67e74705SXin Li // CHECK: struct CXXFunctionalCastExprPrint fce = CXXFunctionalCastExprPrint{};
218*67e74705SXin Li struct CXXFunctionalCastExprPrint {} fce = CXXFunctionalCastExprPrint{};
219*67e74705SXin Li 
220*67e74705SXin Li // CHECK: struct CXXTemporaryObjectExprPrint toe = CXXTemporaryObjectExprPrint{};
221*67e74705SXin Li struct CXXTemporaryObjectExprPrint { CXXTemporaryObjectExprPrint(); } toe = CXXTemporaryObjectExprPrint{};
222*67e74705SXin Li 
223*67e74705SXin Li namespace PR24872 {
224*67e74705SXin Li // CHECK: template <typename T> struct Foo : T {
225*67e74705SXin Li // CHECK: using T::operator-;
226*67e74705SXin Li template <typename T> struct Foo : T {
227*67e74705SXin Li   using T::operator-;
228*67e74705SXin Li };
229*67e74705SXin Li }
230*67e74705SXin Li 
231*67e74705SXin Li namespace dont_crash_on_auto_vars {
232*67e74705SXin Li struct T { enum E {X = 12ll }; };
233*67e74705SXin Li struct S {
234*67e74705SXin Li   struct  { int I; } ADecl;
235*67e74705SXin Li   static const auto Y = T::X;
236*67e74705SXin Li };
237*67e74705SXin Li //CHECK: static const auto Y = T::X;
238*67e74705SXin Li constexpr auto var = T::X;
239*67e74705SXin Li //CHECK: constexpr auto var = T::X;
240*67e74705SXin Li }
241