1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=debug.DumpCFG -triple x86_64-apple-darwin12 -analyzer-config cfg-temporary-dtors=true -std=c++11 %s > %t 2>&1
2*67e74705SXin Li // RUN: FileCheck --input-file=%t %s
3*67e74705SXin Li
4*67e74705SXin Li // CHECK-LABEL: void checkWrap(int i)
5*67e74705SXin Li // CHECK: ENTRY
6*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
7*67e74705SXin Li // CHECK: [B1]
8*67e74705SXin Li // CHECK: Succs (21): B2 B3 B4 B5 B6 B7 B8 B9
9*67e74705SXin Li // CHECK: B10 B11 B12 B13 B14 B15 B16 B17 B18 B19
10*67e74705SXin Li // CHECK: B20 B21 B0
11*67e74705SXin Li // CHECK: [B0 (EXIT)]
12*67e74705SXin Li // CHECK-NEXT: Preds (21): B2 B3 B4 B5 B6 B7 B8 B9
13*67e74705SXin Li // CHECK-NEXT: B10 B11 B12 B13 B14 B15 B16 B17 B18 B19
14*67e74705SXin Li // CHECK-NEXT: B20 B21 B1
checkWrap(int i)15*67e74705SXin Li void checkWrap(int i) {
16*67e74705SXin Li switch(i) {
17*67e74705SXin Li case 0: break;
18*67e74705SXin Li case 1: break;
19*67e74705SXin Li case 2: break;
20*67e74705SXin Li case 3: break;
21*67e74705SXin Li case 4: break;
22*67e74705SXin Li case 5: break;
23*67e74705SXin Li case 6: break;
24*67e74705SXin Li case 7: break;
25*67e74705SXin Li case 8: break;
26*67e74705SXin Li case 9: break;
27*67e74705SXin Li case 10: break;
28*67e74705SXin Li case 11: break;
29*67e74705SXin Li case 12: break;
30*67e74705SXin Li case 13: break;
31*67e74705SXin Li case 14: break;
32*67e74705SXin Li case 15: break;
33*67e74705SXin Li case 16: break;
34*67e74705SXin Li case 17: break;
35*67e74705SXin Li case 18: break;
36*67e74705SXin Li case 19: break;
37*67e74705SXin Li }
38*67e74705SXin Li }
39*67e74705SXin Li
40*67e74705SXin Li // CHECK-LABEL: void checkDeclStmts()
41*67e74705SXin Li // CHECK: ENTRY
42*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
43*67e74705SXin Li // CHECK: [B1]
44*67e74705SXin Li // CHECK-NEXT: 1: int i;
45*67e74705SXin Li // CHECK-NEXT: 2: int j;
46*67e74705SXin Li // CHECK-NEXT: 3: 1
47*67e74705SXin Li // CHECK-NEXT: 4: int k = 1;
48*67e74705SXin Li // CHECK-NEXT: 5: int l;
49*67e74705SXin Li // CHECK-NEXT: 6: 2
50*67e74705SXin Li // CHECK-NEXT: 7: int m = 2;
51*67e74705SXin Li // CHECK-NEXT: CXXConstructExpr
52*67e74705SXin Li // CHECK-NEXT: 9: struct standalone myStandalone;
53*67e74705SXin Li // CHECK-NEXT: CXXConstructExpr
54*67e74705SXin Li // CHECK-NEXT: 11: struct (anonymous struct at {{.*}}) myAnon;
55*67e74705SXin Li // CHECK-NEXT: CXXConstructExpr
56*67e74705SXin Li // CHECK-NEXT: 13: struct named myNamed;
57*67e74705SXin Li // CHECK-NEXT: Preds (1): B2
58*67e74705SXin Li // CHECK-NEXT: Succs (1): B0
checkDeclStmts()59*67e74705SXin Li void checkDeclStmts() {
60*67e74705SXin Li int i, j;
61*67e74705SXin Li int k = 1, l, m = 2;
62*67e74705SXin Li
63*67e74705SXin Li struct standalone { int x, y; };
64*67e74705SXin Li struct standalone myStandalone;
65*67e74705SXin Li
66*67e74705SXin Li struct { int x, y; } myAnon;
67*67e74705SXin Li
68*67e74705SXin Li struct named { int x, y; } myNamed;
69*67e74705SXin Li
70*67e74705SXin Li static_assert(1, "abc");
71*67e74705SXin Li }
72*67e74705SXin Li
73*67e74705SXin Li // CHECK-LABEL: void F(EmptyE e)
74*67e74705SXin Li // CHECK: ENTRY
75*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
76*67e74705SXin Li // CHECK: [B1]
77*67e74705SXin Li // CHECK-NEXT: 1: e
78*67e74705SXin Li // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, enum EmptyE)
79*67e74705SXin Li // CHECK-NEXT: 3: [B1.2] (ImplicitCastExpr, IntegralCast, int)
80*67e74705SXin Li // CHECK-NEXT: T: switch [B1.3]
81*67e74705SXin Li // CHECK-NEXT: Preds (1): B2
82*67e74705SXin Li // CHECK-NEXT: Succs (1): B0
83*67e74705SXin Li // CHECK: [B0 (EXIT)]
84*67e74705SXin Li // CHECK-NEXT: Preds (1): B1
85*67e74705SXin Li enum EmptyE {};
F(EmptyE e)86*67e74705SXin Li void F(EmptyE e) {
87*67e74705SXin Li switch (e) {}
88*67e74705SXin Li }
89*67e74705SXin Li
90*67e74705SXin Li // CHECK-LABEL: void testBuiltinSize()
91*67e74705SXin Li // CHECK: ENTRY
92*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
93*67e74705SXin Li // CHECK: [B1]
94*67e74705SXin Li // CHECK-NEXT: 1: __builtin_object_size
95*67e74705SXin Li // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, BuiltinFnToFnPtr, unsigned long (*)(const void *, int))
96*67e74705SXin Li // CHECK-NEXT: 3: [B1.2](dummy(), 0)
97*67e74705SXin Li // CHECK-NEXT: 4: (void)[B1.3] (CStyleCastExpr, ToVoid, void)
98*67e74705SXin Li // CHECK-NEXT: Preds (1): B2
99*67e74705SXin Li // CHECK-NEXT: Succs (1): B0
100*67e74705SXin Li // CHECK: [B0 (EXIT)]
101*67e74705SXin Li // CHECK-NEXT: Preds (1): B1
testBuiltinSize()102*67e74705SXin Li void testBuiltinSize() {
103*67e74705SXin Li extern int *dummy();
104*67e74705SXin Li (void)__builtin_object_size(dummy(), 0);
105*67e74705SXin Li }
106*67e74705SXin Li
107*67e74705SXin Li
108*67e74705SXin Li class A {
109*67e74705SXin Li public:
A()110*67e74705SXin Li A() {}
~A()111*67e74705SXin Li ~A() {}
112*67e74705SXin Li };
113*67e74705SXin Li
114*67e74705SXin Li // CHECK-LABEL: void test_deletedtor()
115*67e74705SXin Li // CHECK: [B2 (ENTRY)]
116*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
117*67e74705SXin Li // CHECK: [B1]
118*67e74705SXin Li // CHECK-NEXT: 1: CFGNewAllocator(A *)
119*67e74705SXin Li // CHECK-NEXT: 2: (CXXConstructExpr, class A)
120*67e74705SXin Li // CHECK-NEXT: 3: new A([B1.2])
121*67e74705SXin Li // CHECK-NEXT: 4: A *a = new A();
122*67e74705SXin Li // CHECK-NEXT: 5: a
123*67e74705SXin Li // CHECK-NEXT: 6: [B1.5] (ImplicitCastExpr, LValueToRValue, class A *)
124*67e74705SXin Li // CHECK-NEXT: 7: [B1.6]->~A() (Implicit destructor)
125*67e74705SXin Li // CHECK-NEXT: 8: delete [B1.6]
126*67e74705SXin Li // CHECK-NEXT: Preds (1): B2
127*67e74705SXin Li // CHECK-NEXT: Succs (1): B0
128*67e74705SXin Li // CHECK: [B0 (EXIT)]
129*67e74705SXin Li // CHECK-NEXT: Preds (1): B1
test_deletedtor()130*67e74705SXin Li void test_deletedtor() {
131*67e74705SXin Li A *a = new A();
132*67e74705SXin Li delete a;
133*67e74705SXin Li }
134*67e74705SXin Li
135*67e74705SXin Li // CHECK-LABEL: void test_deleteArraydtor()
136*67e74705SXin Li // CHECK: [B2 (ENTRY)]
137*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
138*67e74705SXin Li // CHECK: [B1]
139*67e74705SXin Li // CHECK-NEXT: 1: 5
140*67e74705SXin Li // CHECK-NEXT: 2: CFGNewAllocator(A *)
141*67e74705SXin Li // CHECK-NEXT: 3: (CXXConstructExpr, class A)
142*67e74705SXin Li // CHECK-NEXT: 4: new A {{\[\[}}B1.1]]
143*67e74705SXin Li // CHECK-NEXT: 5: A *a = new A [5];
144*67e74705SXin Li // CHECK-NEXT: 6: a
145*67e74705SXin Li // CHECK-NEXT: 7: [B1.6] (ImplicitCastExpr, LValueToRValue, class A *)
146*67e74705SXin Li // CHECK-NEXT: 8: [B1.7]->~A() (Implicit destructor)
147*67e74705SXin Li // CHECK-NEXT: 9: delete [] [B1.7]
148*67e74705SXin Li // CHECK-NEXT: Preds (1): B2
149*67e74705SXin Li // CHECK-NEXT: Succs (1): B0
150*67e74705SXin Li // CHECK: [B0 (EXIT)]
151*67e74705SXin Li // CHECK-NEXT: Preds (1): B1
test_deleteArraydtor()152*67e74705SXin Li void test_deleteArraydtor() {
153*67e74705SXin Li A *a = new A[5];
154*67e74705SXin Li delete[] a;
155*67e74705SXin Li }
156*67e74705SXin Li
157*67e74705SXin Li
158*67e74705SXin Li namespace NoReturnSingleSuccessor {
159*67e74705SXin Li struct A {
160*67e74705SXin Li A();
161*67e74705SXin Li ~A();
162*67e74705SXin Li };
163*67e74705SXin Li
164*67e74705SXin Li struct B : public A {
165*67e74705SXin Li B();
166*67e74705SXin Li ~B() __attribute__((noreturn));
167*67e74705SXin Li };
168*67e74705SXin Li
169*67e74705SXin Li // CHECK-LABEL: int test1(int *x)
170*67e74705SXin Li // CHECK: 1: 1
171*67e74705SXin Li // CHECK-NEXT: 2: return
172*67e74705SXin Li // CHECK-NEXT: ~B() (Implicit destructor)
173*67e74705SXin Li // CHECK-NEXT: Preds (1)
174*67e74705SXin Li // CHECK-NEXT: Succs (1): B0
test1(int * x)175*67e74705SXin Li int test1(int *x) {
176*67e74705SXin Li B b;
177*67e74705SXin Li if (x)
178*67e74705SXin Li return 1;
179*67e74705SXin Li }
180*67e74705SXin Li
181*67e74705SXin Li // CHECK-LABEL: int test2(int *x)
182*67e74705SXin Li // CHECK: 1: 1
183*67e74705SXin Li // CHECK-NEXT: 2: return
184*67e74705SXin Li // CHECK-NEXT: destructor
185*67e74705SXin Li // CHECK-NEXT: Preds (1)
186*67e74705SXin Li // CHECK-NEXT: Succs (1): B0
test2(int * x)187*67e74705SXin Li int test2(int *x) {
188*67e74705SXin Li const A& a = B();
189*67e74705SXin Li if (x)
190*67e74705SXin Li return 1;
191*67e74705SXin Li }
192*67e74705SXin Li }
193*67e74705SXin Li
194*67e74705SXin Li // Test CFG support for "extending" an enum.
195*67e74705SXin Li // CHECK-LABEL: int test_enum_with_extension(enum MyEnum value)
196*67e74705SXin Li // CHECK: [B7 (ENTRY)]
197*67e74705SXin Li // CHECK-NEXT: Succs (1): B2
198*67e74705SXin Li // CHECK: [B1]
199*67e74705SXin Li // CHECK-NEXT: 1: x
200*67e74705SXin Li // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, int)
201*67e74705SXin Li // CHECK-NEXT: 3: return [B1.2];
202*67e74705SXin Li // CHECK-NEXT: Preds (5): B3 B4 B5 B6 B2(Unreachable)
203*67e74705SXin Li // CHECK-NEXT: Succs (1): B0
204*67e74705SXin Li // CHECK: [B2]
205*67e74705SXin Li // CHECK-NEXT: 1: 0
206*67e74705SXin Li // CHECK-NEXT: 2: int x = 0;
207*67e74705SXin Li // CHECK-NEXT: 3: value
208*67e74705SXin Li // CHECK-NEXT: 4: [B2.3] (ImplicitCastExpr, LValueToRValue, enum MyEnum)
209*67e74705SXin Li // CHECK-NEXT: 5: [B2.4] (ImplicitCastExpr, IntegralCast, int)
210*67e74705SXin Li // CHECK-NEXT: T: switch [B2.5]
211*67e74705SXin Li // CHECK-NEXT: Preds (1): B7
212*67e74705SXin Li // CHECK-NEXT: Succs (5): B3 B4 B5 B6 B1(Unreachable)
213*67e74705SXin Li // CHECK: [B3]
214*67e74705SXin Li // CHECK-NEXT: case D:
215*67e74705SXin Li // CHECK-NEXT: 1: 4
216*67e74705SXin Li // CHECK-NEXT: 2: x
217*67e74705SXin Li // CHECK-NEXT: 3: [B3.2] = [B3.1]
218*67e74705SXin Li // CHECK-NEXT: T: break;
219*67e74705SXin Li // CHECK-NEXT: Preds (1): B2
220*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
221*67e74705SXin Li // CHECK: [B4]
222*67e74705SXin Li // CHECK-NEXT: case C:
223*67e74705SXin Li // CHECK-NEXT: 1: 3
224*67e74705SXin Li // CHECK-NEXT: 2: x
225*67e74705SXin Li // CHECK-NEXT: 3: [B4.2] = [B4.1]
226*67e74705SXin Li // CHECK-NEXT: T: break;
227*67e74705SXin Li // CHECK-NEXT: Preds (1): B2
228*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
229*67e74705SXin Li // CHECK: [B5]
230*67e74705SXin Li // CHECK-NEXT: case B:
231*67e74705SXin Li // CHECK-NEXT: 1: 2
232*67e74705SXin Li // CHECK-NEXT: 2: x
233*67e74705SXin Li // CHECK-NEXT: 3: [B5.2] = [B5.1]
234*67e74705SXin Li // CHECK-NEXT: T: break;
235*67e74705SXin Li // CHECK-NEXT: Preds (1): B2
236*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
237*67e74705SXin Li // CHECK: [B6]
238*67e74705SXin Li // CHECK-NEXT: case A:
239*67e74705SXin Li // CHECK-NEXT: 1: 1
240*67e74705SXin Li // CHECK-NEXT: 2: x
241*67e74705SXin Li // CHECK-NEXT: 3: [B6.2] = [B6.1]
242*67e74705SXin Li // CHECK-NEXT: T: break;
243*67e74705SXin Li // CHECK-NEXT: Preds (1): B2
244*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
245*67e74705SXin Li // CHECK: [B0 (EXIT)]
246*67e74705SXin Li // CHECK-NEXT: Preds (1): B1
247*67e74705SXin Li enum MyEnum { A, B, C };
248*67e74705SXin Li static const enum MyEnum D = (enum MyEnum) 32;
249*67e74705SXin Li
test_enum_with_extension(enum MyEnum value)250*67e74705SXin Li int test_enum_with_extension(enum MyEnum value) {
251*67e74705SXin Li int x = 0;
252*67e74705SXin Li switch (value) {
253*67e74705SXin Li case A: x = 1; break;
254*67e74705SXin Li case B: x = 2; break;
255*67e74705SXin Li case C: x = 3; break;
256*67e74705SXin Li case D: x = 4; break;
257*67e74705SXin Li }
258*67e74705SXin Li return x;
259*67e74705SXin Li }
260*67e74705SXin Li
261*67e74705SXin Li // CHECK-LABEL: int test_enum_with_extension_default(enum MyEnum value)
262*67e74705SXin Li // CHECK: [B7 (ENTRY)]
263*67e74705SXin Li // CHECK-NEXT: Succs (1): B2
264*67e74705SXin Li // CHECK: [B1]
265*67e74705SXin Li // CHECK-NEXT: 1: x
266*67e74705SXin Li // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, int)
267*67e74705SXin Li // CHECK-NEXT: 3: return [B1.2];
268*67e74705SXin Li // CHECK-NEXT: Preds (4): B3 B4 B5 B6
269*67e74705SXin Li // CHECK-NEXT: Succs (1): B0
270*67e74705SXin Li // CHECK: [B2]
271*67e74705SXin Li // CHECK-NEXT: 1: 0
272*67e74705SXin Li // CHECK-NEXT: 2: int x = 0;
273*67e74705SXin Li // CHECK-NEXT: 3: value
274*67e74705SXin Li // CHECK-NEXT: 4: [B2.3] (ImplicitCastExpr, LValueToRValue, enum MyEnum)
275*67e74705SXin Li // CHECK-NEXT: 5: [B2.4] (ImplicitCastExpr, IntegralCast, int)
276*67e74705SXin Li // CHECK-NEXT: T: switch [B2.5]
277*67e74705SXin Li // CHECK-NEXT: Preds (1): B7
278*67e74705SXin Li // CHECK-NEXT: Succs (4): B4 B5 B6 B3(Unreachable)
279*67e74705SXin Li // CHECK: [B3]
280*67e74705SXin Li // CHECK-NEXT: default:
281*67e74705SXin Li // CHECK-NEXT: 1: 4
282*67e74705SXin Li // CHECK-NEXT: 2: x
283*67e74705SXin Li // CHECK-NEXT: 3: [B3.2] = [B3.1]
284*67e74705SXin Li // CHECK-NEXT: T: break;
285*67e74705SXin Li // CHECK-NEXT: Preds (1): B2(Unreachable)
286*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
287*67e74705SXin Li // CHECK: [B4]
288*67e74705SXin Li // CHECK-NEXT: case C:
289*67e74705SXin Li // CHECK-NEXT: 1: 3
290*67e74705SXin Li // CHECK-NEXT: 2: x
291*67e74705SXin Li // CHECK-NEXT: 3: [B4.2] = [B4.1]
292*67e74705SXin Li // CHECK-NEXT: T: break;
293*67e74705SXin Li // CHECK-NEXT: Preds (1): B2
294*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
295*67e74705SXin Li // CHECK: [B5]
296*67e74705SXin Li // CHECK-NEXT: case B:
297*67e74705SXin Li // CHECK-NEXT: 1: 2
298*67e74705SXin Li // CHECK-NEXT: 2: x
299*67e74705SXin Li // CHECK-NEXT: 3: [B5.2] = [B5.1]
300*67e74705SXin Li // CHECK-NEXT: T: break;
301*67e74705SXin Li // CHECK-NEXT: Preds (1): B2
302*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
303*67e74705SXin Li // CHECK: [B6]
304*67e74705SXin Li // CHECK-NEXT: case A:
305*67e74705SXin Li // CHECK-NEXT: 1: 1
306*67e74705SXin Li // CHECK-NEXT: 2: x
307*67e74705SXin Li // CHECK-NEXT: 3: [B6.2] = [B6.1]
308*67e74705SXin Li // CHECK-NEXT: T: break;
309*67e74705SXin Li // CHECK-NEXT: Preds (1): B2
310*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
311*67e74705SXin Li // CHECK: [B0 (EXIT)]
312*67e74705SXin Li // CHECK-NEXT: Preds (1): B1
test_enum_with_extension_default(enum MyEnum value)313*67e74705SXin Li int test_enum_with_extension_default(enum MyEnum value) {
314*67e74705SXin Li int x = 0;
315*67e74705SXin Li switch (value) {
316*67e74705SXin Li case A: x = 1; break;
317*67e74705SXin Li case B: x = 2; break;
318*67e74705SXin Li case C: x = 3; break;
319*67e74705SXin Li default: x = 4; break;
320*67e74705SXin Li }
321*67e74705SXin Li return x;
322*67e74705SXin Li }
323*67e74705SXin Li
324*67e74705SXin Li
325*67e74705SXin Li // CHECK-LABEL: void test_placement_new()
326*67e74705SXin Li // CHECK: [B2 (ENTRY)]
327*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
328*67e74705SXin Li // CHECK: [B1]
329*67e74705SXin Li // CHECK-NEXT: 1: int buffer[16];
330*67e74705SXin Li // CHECK-NEXT: 2: buffer
331*67e74705SXin Li // CHECK-NEXT: 3: [B1.2] (ImplicitCastExpr, ArrayToPointerDecay, int *)
332*67e74705SXin Li // CHECK-NEXT: 4: [B1.3] (ImplicitCastExpr, BitCast, void *)
333*67e74705SXin Li // CHECK-NEXT: 5: CFGNewAllocator(MyClass *)
334*67e74705SXin Li // CHECK-NEXT: 6: (CXXConstructExpr, class MyClass)
335*67e74705SXin Li // CHECK-NEXT: 7: new ([B1.4]) MyClass([B1.6])
336*67e74705SXin Li // CHECK-NEXT: 8: MyClass *obj = new (buffer) MyClass();
337*67e74705SXin Li // CHECK-NEXT: Preds (1): B2
338*67e74705SXin Li // CHECK-NEXT: Succs (1): B0
339*67e74705SXin Li // CHECK: [B0 (EXIT)]
340*67e74705SXin Li // CHECK-NEXT: Preds (1): B1
341*67e74705SXin Li
342*67e74705SXin Li extern void* operator new (unsigned long sz, void* v);
343*67e74705SXin Li extern void* operator new[] (unsigned long sz, void* ptr);
344*67e74705SXin Li
345*67e74705SXin Li class MyClass {
346*67e74705SXin Li public:
MyClass()347*67e74705SXin Li MyClass() {}
~MyClass()348*67e74705SXin Li ~MyClass() {}
349*67e74705SXin Li };
350*67e74705SXin Li
test_placement_new()351*67e74705SXin Li void test_placement_new() {
352*67e74705SXin Li int buffer[16];
353*67e74705SXin Li MyClass* obj = new (buffer) MyClass();
354*67e74705SXin Li }
355*67e74705SXin Li
356*67e74705SXin Li // CHECK-LABEL: void test_placement_new_array()
357*67e74705SXin Li // CHECK: [B2 (ENTRY)]
358*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
359*67e74705SXin Li // CHECK: [B1]
360*67e74705SXin Li // CHECK-NEXT: 1: int buffer[16];
361*67e74705SXin Li // CHECK-NEXT: 2: buffer
362*67e74705SXin Li // CHECK-NEXT: 3: [B1.2] (ImplicitCastExpr, ArrayToPointerDecay, int *)
363*67e74705SXin Li // CHECK-NEXT: 4: [B1.3] (ImplicitCastExpr, BitCast, void *)
364*67e74705SXin Li // CHECK-NEXT: 5: 5
365*67e74705SXin Li // CHECK-NEXT: 6: CFGNewAllocator(MyClass *)
366*67e74705SXin Li // CHECK-NEXT: 7: (CXXConstructExpr, class MyClass)
367*67e74705SXin Li // CHECK-NEXT: 8: new ([B1.4]) MyClass {{\[\[}}B1.5]]
368*67e74705SXin Li // CHECK-NEXT: 9: MyClass *obj = new (buffer) MyClass [5];
369*67e74705SXin Li // CHECK-NEXT: Preds (1): B2
370*67e74705SXin Li // CHECK-NEXT: Succs (1): B0
371*67e74705SXin Li // CHECK: [B0 (EXIT)]
372*67e74705SXin Li // CHECK-NEXT: Preds (1): B1
373*67e74705SXin Li
test_placement_new_array()374*67e74705SXin Li void test_placement_new_array() {
375*67e74705SXin Li int buffer[16];
376*67e74705SXin Li MyClass* obj = new (buffer) MyClass[5];
377*67e74705SXin Li }
378*67e74705SXin Li
379*67e74705SXin Li
380*67e74705SXin Li // CHECK-LABEL: void test_lifetime_extended_temporaries()
381*67e74705SXin Li // CHECK: [B1]
382*67e74705SXin Li struct LifetimeExtend { LifetimeExtend(int); ~LifetimeExtend(); };
383*67e74705SXin Li struct Aggregate { const LifetimeExtend a; const LifetimeExtend b; };
384*67e74705SXin Li struct AggregateRef { const LifetimeExtend &a; const LifetimeExtend &b; };
test_lifetime_extended_temporaries()385*67e74705SXin Li void test_lifetime_extended_temporaries() {
386*67e74705SXin Li // CHECK: LifetimeExtend(1);
387*67e74705SXin Li // CHECK-NEXT: : 1
388*67e74705SXin Li // CHECK-NEXT: ~LifetimeExtend()
389*67e74705SXin Li // CHECK-NOT: ~LifetimeExtend()
390*67e74705SXin Li {
391*67e74705SXin Li const LifetimeExtend &l = LifetimeExtend(1);
392*67e74705SXin Li 1;
393*67e74705SXin Li }
394*67e74705SXin Li // CHECK: LifetimeExtend(2)
395*67e74705SXin Li // CHECK-NEXT: ~LifetimeExtend()
396*67e74705SXin Li // CHECK-NEXT: : 2
397*67e74705SXin Li // CHECK-NOT: ~LifetimeExtend()
398*67e74705SXin Li {
399*67e74705SXin Li // No life-time extension.
400*67e74705SXin Li const int &l = (LifetimeExtend(2), 2);
401*67e74705SXin Li 2;
402*67e74705SXin Li }
403*67e74705SXin Li // CHECK: LifetimeExtend(3)
404*67e74705SXin Li // CHECK-NEXT: : 3
405*67e74705SXin Li // CHECK-NEXT: ~LifetimeExtend()
406*67e74705SXin Li // CHECK-NOT: ~LifetimeExtend()
407*67e74705SXin Li {
408*67e74705SXin Li // The last one is lifetime extended.
409*67e74705SXin Li const LifetimeExtend &l = (3, LifetimeExtend(3));
410*67e74705SXin Li 3;
411*67e74705SXin Li }
412*67e74705SXin Li // CHECK: LifetimeExtend(4)
413*67e74705SXin Li // CHECK-NEXT: ~LifetimeExtend()
414*67e74705SXin Li // CHECK-NEXT: ~LifetimeExtend()
415*67e74705SXin Li // CHECK-NEXT: : 4
416*67e74705SXin Li // CHECK-NOT: ~LifetimeExtend()
417*67e74705SXin Li {
418*67e74705SXin Li Aggregate a{LifetimeExtend(4), LifetimeExtend(4)};
419*67e74705SXin Li 4;
420*67e74705SXin Li }
421*67e74705SXin Li // CHECK: LifetimeExtend(5)
422*67e74705SXin Li // CHECK-NEXT: : 5
423*67e74705SXin Li // FIXME: We want to emit the destructors of the lifetime
424*67e74705SXin Li // extended variables here.
425*67e74705SXin Li // CHECK-NOT: ~LifetimeExtend()
426*67e74705SXin Li {
427*67e74705SXin Li AggregateRef a{LifetimeExtend(5), LifetimeExtend(5)};
428*67e74705SXin Li 5;
429*67e74705SXin Li }
430*67e74705SXin Li // FIXME: Add tests for lifetime extension via subobject
431*67e74705SXin Li // references (LifetimeExtend().some_member).
432*67e74705SXin Li }
433*67e74705SXin Li
434*67e74705SXin Li
435*67e74705SXin Li // CHECK-LABEL: int *PR18472()
436*67e74705SXin Li // CHECK: [B2 (ENTRY)]
437*67e74705SXin Li // CHECK-NEXT: Succs (1): B1
438*67e74705SXin Li // CHECK: [B1]
439*67e74705SXin Li // CHECK-NEXT: 1: 0
440*67e74705SXin Li // CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, NullToPointer, PR18472_t)
441*67e74705SXin Li // CHECK-NEXT: 3: (PR18472_t)[B1.2] (CStyleCastExpr, NoOp, PR18472_t)
442*67e74705SXin Li // CHECK-NEXT: 4: CFGNewAllocator(int *)
443*67e74705SXin Li // CHECK-NEXT: 5: new (([B1.3])) int
444*67e74705SXin Li // CHECK-NEXT: 6: return [B1.5];
445*67e74705SXin Li // CHECK-NEXT: Preds (1): B2
446*67e74705SXin Li // CHECK-NEXT: Succs (1): B0
447*67e74705SXin Li // CHECK: [B0 (EXIT)]
448*67e74705SXin Li // CHECK-NEXT: Preds (1): B1
449*67e74705SXin Li
450*67e74705SXin Li extern "C" typedef int *PR18472_t;
451*67e74705SXin Li void *operator new (unsigned long, PR18472_t);
PR18472()452*67e74705SXin Li template <class T> T *PR18472() {
453*67e74705SXin Li return new (((PR18472_t) 0)) T;
454*67e74705SXin Li }
PR18472_helper()455*67e74705SXin Li void PR18472_helper() {
456*67e74705SXin Li PR18472<int>();
457*67e74705SXin Li }
458*67e74705SXin Li
459