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