1*67e74705SXin Li // RUN: %clang_cc1 %s -triple=thumbv7-apple-ios6.0 -fno-use-cxa-atexit -target-abi apcs-gnu -emit-llvm -o - -fexceptions | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li // CHECK: @_ZZN5test74testEvE1x = internal global i32 0, align 4 4*67e74705SXin Li // CHECK: @_ZGVZN5test74testEvE1x = internal global i32 0 5*67e74705SXin Li // CHECK: @_ZZN5test84testEvE1x = internal global [[TEST8A:.*]] zeroinitializer, align 1 6*67e74705SXin Li // CHECK: @_ZGVZN5test84testEvE1x = internal global i32 0 7*67e74705SXin Li 8*67e74705SXin Li typedef typeof(sizeof(int)) size_t; 9*67e74705SXin Li 10*67e74705SXin Li class foo { 11*67e74705SXin Li public: 12*67e74705SXin Li foo(); 13*67e74705SXin Li virtual ~foo(); 14*67e74705SXin Li }; 15*67e74705SXin Li 16*67e74705SXin Li class bar : public foo { 17*67e74705SXin Li public: 18*67e74705SXin Li bar(); 19*67e74705SXin Li }; 20*67e74705SXin Li 21*67e74705SXin Li // The global dtor needs the right calling conv with -fno-use-cxa-atexit 22*67e74705SXin Li // rdar://7817590 23*67e74705SXin Li bar baz; 24*67e74705SXin Li 25*67e74705SXin Li // PR9593 26*67e74705SXin Li // Make sure atexit(3) is used for global dtors. 27*67e74705SXin Li 28*67e74705SXin Li // CHECK: call [[BAR:%.*]]* @_ZN3barC1Ev( 29*67e74705SXin Li // CHECK-NEXT: call i32 @atexit(void ()* @__dtor_baz) 30*67e74705SXin Li 31*67e74705SXin Li // CHECK-NOT: @_GLOBAL__D_a() 32*67e74705SXin Li // CHECK-LABEL: define internal void @__dtor_baz() 33*67e74705SXin Li // CHECK: call [[BAR]]* @_ZN3barD1Ev([[BAR]]* @baz) 34*67e74705SXin Li 35*67e74705SXin Li // Destructors and constructors must return this. 36*67e74705SXin Li namespace test1 { 37*67e74705SXin Li void foo(); 38*67e74705SXin Li 39*67e74705SXin Li struct A { Atest1::A40*67e74705SXin Li A(int i) { foo(); } ~Atest1::A41*67e74705SXin Li ~A() { foo(); } bartest1::A42*67e74705SXin Li void bar() { foo(); } 43*67e74705SXin Li }; 44*67e74705SXin Li 45*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test14testEv() test()46*67e74705SXin Li void test() { 47*67e74705SXin Li // CHECK: [[AV:%.*]] = alloca [[A:%.*]], align 1 48*67e74705SXin Li // CHECK: call [[A]]* @_ZN5test11AC1Ei([[A]]* [[AV]], i32 10) 49*67e74705SXin Li // CHECK: invoke void @_ZN5test11A3barEv([[A]]* [[AV]]) 50*67e74705SXin Li // CHECK: call [[A]]* @_ZN5test11AD1Ev([[A]]* [[AV]]) 51*67e74705SXin Li // CHECK: ret void 52*67e74705SXin Li A a = 10; 53*67e74705SXin Li a.bar(); 54*67e74705SXin Li } 55*67e74705SXin Li 56*67e74705SXin Li // CHECK: define linkonce_odr [[A]]* @_ZN5test11AC1Ei([[A]]* returned %this, i32 %i) unnamed_addr 57*67e74705SXin Li // CHECK: [[THIS:%.*]] = alloca [[A]]*, align 4 58*67e74705SXin Li // CHECK: store [[A]]* {{.*}}, [[A]]** [[THIS]] 59*67e74705SXin Li // CHECK: [[THIS1:%.*]] = load [[A]]*, [[A]]** [[THIS]] 60*67e74705SXin Li // CHECK: {{%.*}} = call [[A]]* @_ZN5test11AC2Ei( 61*67e74705SXin Li // CHECK: ret [[A]]* [[THIS1]] 62*67e74705SXin Li 63*67e74705SXin Li // CHECK: define linkonce_odr [[A]]* @_ZN5test11AD1Ev([[A]]* returned %this) unnamed_addr 64*67e74705SXin Li // CHECK: [[THIS:%.*]] = alloca [[A]]*, align 4 65*67e74705SXin Li // CHECK: store [[A]]* {{.*}}, [[A]]** [[THIS]] 66*67e74705SXin Li // CHECK: [[THIS1:%.*]] = load [[A]]*, [[A]]** [[THIS]] 67*67e74705SXin Li // CHECK: {{%.*}} = call [[A]]* @_ZN5test11AD2Ev( 68*67e74705SXin Li // CHECK: ret [[A]]* [[THIS1]] 69*67e74705SXin Li } 70*67e74705SXin Li 71*67e74705SXin Li // Awkward virtual cases. 72*67e74705SXin Li namespace test2 { 73*67e74705SXin Li void foo(); 74*67e74705SXin Li 75*67e74705SXin Li struct A { 76*67e74705SXin Li int x; 77*67e74705SXin Li 78*67e74705SXin Li A(int); ~Atest2::A79*67e74705SXin Li virtual ~A() { foo(); } 80*67e74705SXin Li }; 81*67e74705SXin Li 82*67e74705SXin Li struct B { 83*67e74705SXin Li int y; 84*67e74705SXin Li int z; 85*67e74705SXin Li 86*67e74705SXin Li B(int); ~Btest2::B87*67e74705SXin Li virtual ~B() { foo(); } 88*67e74705SXin Li }; 89*67e74705SXin Li 90*67e74705SXin Li struct C : A, virtual B { 91*67e74705SXin Li int q; 92*67e74705SXin Li Ctest2::C93*67e74705SXin Li C(int i) : A(i), B(i) { foo(); } ~Ctest2::C94*67e74705SXin Li ~C() { foo(); } 95*67e74705SXin Li }; 96*67e74705SXin Li test()97*67e74705SXin Li void test() { 98*67e74705SXin Li C c = 10; 99*67e74705SXin Li } 100*67e74705SXin Li 101*67e74705SXin Li // Tests at eof 102*67e74705SXin Li } 103*67e74705SXin Li 104*67e74705SXin Li namespace test3 { 105*67e74705SXin Li struct A { 106*67e74705SXin Li int x; 107*67e74705SXin Li ~A(); 108*67e74705SXin Li }; 109*67e74705SXin Li a()110*67e74705SXin Li void a() { 111*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test31aEv() 112*67e74705SXin Li // CHECK: call i8* @_Znam(i32 48) 113*67e74705SXin Li // CHECK: store i32 4 114*67e74705SXin Li // CHECK: store i32 10 115*67e74705SXin Li A *x = new A[10]; 116*67e74705SXin Li } 117*67e74705SXin Li b(int n)118*67e74705SXin Li void b(int n) { 119*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test31bEi( 120*67e74705SXin Li // CHECK: [[N:%.*]] = load i32, i32* 121*67e74705SXin Li // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 4) 122*67e74705SXin Li // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8) 123*67e74705SXin Li // CHECK: [[OR:%.*]] = or i1 124*67e74705SXin Li // CHECK: [[SZ:%.*]] = select i1 [[OR]] 125*67e74705SXin Li // CHECK: call i8* @_Znam(i32 [[SZ]]) 126*67e74705SXin Li // CHECK: store i32 4 127*67e74705SXin Li // CHECK: store i32 [[N]] 128*67e74705SXin Li A *x = new A[n]; 129*67e74705SXin Li } 130*67e74705SXin Li c()131*67e74705SXin Li void c() { 132*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test31cEv() 133*67e74705SXin Li // CHECK: call i8* @_Znam(i32 808) 134*67e74705SXin Li // CHECK: store i32 4 135*67e74705SXin Li // CHECK: store i32 200 136*67e74705SXin Li A (*x)[20] = new A[10][20]; 137*67e74705SXin Li } 138*67e74705SXin Li d(int n)139*67e74705SXin Li void d(int n) { 140*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test31dEi( 141*67e74705SXin Li // CHECK: [[N:%.*]] = load i32, i32* 142*67e74705SXin Li // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 80) 143*67e74705SXin Li // CHECK: [[NE:%.*]] = mul i32 [[N]], 20 144*67e74705SXin Li // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8) 145*67e74705SXin Li // CHECK: [[SZ:%.*]] = select 146*67e74705SXin Li // CHECK: call i8* @_Znam(i32 [[SZ]]) 147*67e74705SXin Li // CHECK: store i32 4 148*67e74705SXin Li // CHECK: store i32 [[NE]] 149*67e74705SXin Li A (*x)[20] = new A[n][20]; 150*67e74705SXin Li } 151*67e74705SXin Li e(A * x)152*67e74705SXin Li void e(A *x) { 153*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test31eEPNS_1AE( 154*67e74705SXin Li // CHECK: icmp eq {{.*}}, null 155*67e74705SXin Li // CHECK: getelementptr {{.*}}, i32 -8 156*67e74705SXin Li // CHECK: getelementptr {{.*}}, i32 4 157*67e74705SXin Li // CHECK: bitcast {{.*}} to i32* 158*67e74705SXin Li // CHECK: load 159*67e74705SXin Li // CHECK: invoke {{.*}} @_ZN5test31AD1Ev 160*67e74705SXin Li // CHECK: call void @_ZdaPv 161*67e74705SXin Li delete [] x; 162*67e74705SXin Li } 163*67e74705SXin Li f(A (* x)[20])164*67e74705SXin Li void f(A (*x)[20]) { 165*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test31fEPA20_NS_1AE( 166*67e74705SXin Li // CHECK: icmp eq {{.*}}, null 167*67e74705SXin Li // CHECK: getelementptr {{.*}}, i32 -8 168*67e74705SXin Li // CHECK: getelementptr {{.*}}, i32 4 169*67e74705SXin Li // CHECK: bitcast {{.*}} to i32* 170*67e74705SXin Li // CHECK: load 171*67e74705SXin Li // CHECK: invoke {{.*}} @_ZN5test31AD1Ev 172*67e74705SXin Li // CHECK: call void @_ZdaPv 173*67e74705SXin Li delete [] x; 174*67e74705SXin Li } 175*67e74705SXin Li } 176*67e74705SXin Li 177*67e74705SXin Li namespace test4 { 178*67e74705SXin Li struct A { 179*67e74705SXin Li int x; 180*67e74705SXin Li void operator delete[](void *, size_t sz); 181*67e74705SXin Li }; 182*67e74705SXin Li a()183*67e74705SXin Li void a() { 184*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test41aEv() 185*67e74705SXin Li // CHECK: call i8* @_Znam(i32 48) 186*67e74705SXin Li // CHECK: store i32 4 187*67e74705SXin Li // CHECK: store i32 10 188*67e74705SXin Li A *x = new A[10]; 189*67e74705SXin Li } 190*67e74705SXin Li b(int n)191*67e74705SXin Li void b(int n) { 192*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test41bEi( 193*67e74705SXin Li // CHECK: [[N:%.*]] = load i32, i32* 194*67e74705SXin Li // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 4) 195*67e74705SXin Li // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8) 196*67e74705SXin Li // CHECK: [[SZ:%.*]] = select 197*67e74705SXin Li // CHECK: call i8* @_Znam(i32 [[SZ]]) 198*67e74705SXin Li // CHECK: store i32 4 199*67e74705SXin Li // CHECK: store i32 [[N]] 200*67e74705SXin Li A *x = new A[n]; 201*67e74705SXin Li } 202*67e74705SXin Li c()203*67e74705SXin Li void c() { 204*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test41cEv() 205*67e74705SXin Li // CHECK: call i8* @_Znam(i32 808) 206*67e74705SXin Li // CHECK: store i32 4 207*67e74705SXin Li // CHECK: store i32 200 208*67e74705SXin Li A (*x)[20] = new A[10][20]; 209*67e74705SXin Li } 210*67e74705SXin Li d(int n)211*67e74705SXin Li void d(int n) { 212*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test41dEi( 213*67e74705SXin Li // CHECK: [[N:%.*]] = load i32, i32* 214*67e74705SXin Li // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 80) 215*67e74705SXin Li // CHECK: [[NE:%.*]] = mul i32 [[N]], 20 216*67e74705SXin Li // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8) 217*67e74705SXin Li // CHECK: [[SZ:%.*]] = select 218*67e74705SXin Li // CHECK: call i8* @_Znam(i32 [[SZ]]) 219*67e74705SXin Li // CHECK: store i32 4 220*67e74705SXin Li // CHECK: store i32 [[NE]] 221*67e74705SXin Li A (*x)[20] = new A[n][20]; 222*67e74705SXin Li } 223*67e74705SXin Li e(A * x)224*67e74705SXin Li void e(A *x) { 225*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test41eEPNS_1AE( 226*67e74705SXin Li // CHECK: [[ALLOC:%.*]] = getelementptr inbounds {{.*}}, i32 -8 227*67e74705SXin Li // CHECK: getelementptr inbounds {{.*}}, i32 4 228*67e74705SXin Li // CHECK: bitcast 229*67e74705SXin Li // CHECK: [[T0:%.*]] = load i32, i32* 230*67e74705SXin Li // CHECK: [[T1:%.*]] = mul i32 4, [[T0]] 231*67e74705SXin Li // CHECK: [[T2:%.*]] = add i32 [[T1]], 8 232*67e74705SXin Li // CHECK: call void @_ZN5test41AdaEPvm(i8* [[ALLOC]], i32 [[T2]]) 233*67e74705SXin Li delete [] x; 234*67e74705SXin Li } 235*67e74705SXin Li f(A (* x)[20])236*67e74705SXin Li void f(A (*x)[20]) { 237*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test41fEPA20_NS_1AE( 238*67e74705SXin Li // CHECK: [[ALLOC:%.*]] = getelementptr inbounds {{.*}}, i32 -8 239*67e74705SXin Li // CHECK: getelementptr inbounds {{.*}}, i32 4 240*67e74705SXin Li // CHECK: bitcast 241*67e74705SXin Li // CHECK: [[T0:%.*]] = load i32, i32* 242*67e74705SXin Li // CHECK: [[T1:%.*]] = mul i32 4, [[T0]] 243*67e74705SXin Li // CHECK: [[T2:%.*]] = add i32 [[T1]], 8 244*67e74705SXin Li // CHECK: call void @_ZN5test41AdaEPvm(i8* [[ALLOC]], i32 [[T2]]) 245*67e74705SXin Li delete [] x; 246*67e74705SXin Li } 247*67e74705SXin Li } 248*67e74705SXin Li 249*67e74705SXin Li // <rdar://problem/8386802>: don't crash 250*67e74705SXin Li namespace test5 { 251*67e74705SXin Li struct A { 252*67e74705SXin Li ~A(); 253*67e74705SXin Li }; 254*67e74705SXin Li 255*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test54testEPNS_1AE test(A * a)256*67e74705SXin Li void test(A *a) { 257*67e74705SXin Li // CHECK: [[PTR:%.*]] = alloca [[A:%.*]]*, align 4 258*67e74705SXin Li // CHECK-NEXT: store [[A]]* {{.*}}, [[A]]** [[PTR]], align 4 259*67e74705SXin Li // CHECK-NEXT: [[TMP:%.*]] = load [[A]]*, [[A]]** [[PTR]], align 4 260*67e74705SXin Li // CHECK-NEXT: call [[A]]* @_ZN5test51AD1Ev([[A]]* [[TMP]]) 261*67e74705SXin Li // CHECK-NEXT: ret void 262*67e74705SXin Li a->~A(); 263*67e74705SXin Li } 264*67e74705SXin Li } 265*67e74705SXin Li 266*67e74705SXin Li namespace test6 { 267*67e74705SXin Li struct A { 268*67e74705SXin Li virtual ~A(); 269*67e74705SXin Li }; 270*67e74705SXin Li 271*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test64testEPNS_1AE test(A * a)272*67e74705SXin Li void test(A *a) { 273*67e74705SXin Li // CHECK: [[AVAR:%.*]] = alloca [[A:%.*]]*, align 4 274*67e74705SXin Li // CHECK-NEXT: store [[A]]* {{.*}}, [[A]]** [[AVAR]], align 4 275*67e74705SXin Li // CHECK-NEXT: [[V:%.*]] = load [[A]]*, [[A]]** [[AVAR]], align 4 276*67e74705SXin Li // CHECK-NEXT: [[ISNULL:%.*]] = icmp eq [[A]]* [[V]], null 277*67e74705SXin Li // CHECK-NEXT: br i1 [[ISNULL]] 278*67e74705SXin Li // CHECK: [[T0:%.*]] = bitcast [[A]]* [[V]] to void ([[A]]*)*** 279*67e74705SXin Li // CHECK-NEXT: [[T1:%.*]] = load void ([[A]]*)**, void ([[A]]*)*** [[T0]] 280*67e74705SXin Li // CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds void ([[A]]*)*, void ([[A]]*)** [[T1]], i64 1 281*67e74705SXin Li // CHECK-NEXT: [[T3:%.*]] = load void ([[A]]*)*, void ([[A]]*)** [[T2]] 282*67e74705SXin Li // CHECK-NEXT: call void [[T3]]([[A]]* [[V]]) 283*67e74705SXin Li // CHECK-NEXT: br label 284*67e74705SXin Li // CHECK: ret void 285*67e74705SXin Li delete a; 286*67e74705SXin Li } 287*67e74705SXin Li } 288*67e74705SXin Li 289*67e74705SXin Li namespace test7 { 290*67e74705SXin Li int foo(); 291*67e74705SXin Li 292*67e74705SXin Li // Static and guard tested at top of file 293*67e74705SXin Li 294*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test74testEv() {{.*}} personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) test()295*67e74705SXin Li void test() { 296*67e74705SXin Li // CHECK: [[T0:%.*]] = load atomic i8, i8* bitcast (i32* @_ZGVZN5test74testEvE1x to i8*) acquire, align 4 297*67e74705SXin Li // CHECK-NEXT: [[T1:%.*]] = and i8 [[T0]], 1 298*67e74705SXin Li // CHECK-NEXT: [[T2:%.*]] = icmp eq i8 [[T1]], 0 299*67e74705SXin Li // CHECK-NEXT: br i1 [[T2]] 300*67e74705SXin Li // -> fallthrough, end 301*67e74705SXin Li // CHECK: [[T3:%.*]] = call i32 @__cxa_guard_acquire(i32* @_ZGVZN5test74testEvE1x) 302*67e74705SXin Li // CHECK-NEXT: [[T4:%.*]] = icmp ne i32 [[T3]], 0 303*67e74705SXin Li // CHECK-NEXT: br i1 [[T4]] 304*67e74705SXin Li // -> fallthrough, end 305*67e74705SXin Li // CHECK: [[INIT:%.*]] = invoke i32 @_ZN5test73fooEv() 306*67e74705SXin Li // CHECK: store i32 [[INIT]], i32* @_ZZN5test74testEvE1x, align 4 307*67e74705SXin Li // CHECK-NEXT: call void @__cxa_guard_release(i32* @_ZGVZN5test74testEvE1x) 308*67e74705SXin Li // CHECK-NEXT: br label 309*67e74705SXin Li // -> end 310*67e74705SXin Li // end: 311*67e74705SXin Li // CHECK: ret void 312*67e74705SXin Li static int x = foo(); 313*67e74705SXin Li 314*67e74705SXin Li // CHECK: landingpad { i8*, i32 } 315*67e74705SXin Li // CHECK-NEXT: cleanup 316*67e74705SXin Li // CHECK: call void @__cxa_guard_abort(i32* @_ZGVZN5test74testEvE1x) 317*67e74705SXin Li // CHECK: resume { i8*, i32 } 318*67e74705SXin Li } 319*67e74705SXin Li } 320*67e74705SXin Li 321*67e74705SXin Li namespace test8 { 322*67e74705SXin Li struct A { 323*67e74705SXin Li A(); 324*67e74705SXin Li ~A(); 325*67e74705SXin Li }; 326*67e74705SXin Li 327*67e74705SXin Li // Static and guard tested at top of file 328*67e74705SXin Li 329*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test84testEv() {{.*}} personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) test()330*67e74705SXin Li void test() { 331*67e74705SXin Li // CHECK: [[T0:%.*]] = load atomic i8, i8* bitcast (i32* @_ZGVZN5test84testEvE1x to i8*) acquire, align 4 332*67e74705SXin Li // CHECK-NEXT: [[T1:%.*]] = and i8 [[T0]], 1 333*67e74705SXin Li // CHECK-NEXT: [[T2:%.*]] = icmp eq i8 [[T1]], 0 334*67e74705SXin Li // CHECK-NEXT: br i1 [[T2]] 335*67e74705SXin Li // -> fallthrough, end 336*67e74705SXin Li // CHECK: [[T3:%.*]] = call i32 @__cxa_guard_acquire(i32* @_ZGVZN5test84testEvE1x) 337*67e74705SXin Li // CHECK-NEXT: [[T4:%.*]] = icmp ne i32 [[T3]], 0 338*67e74705SXin Li // CHECK-NEXT: br i1 [[T4]] 339*67e74705SXin Li // -> fallthrough, end 340*67e74705SXin Li // CHECK: [[INIT:%.*]] = invoke [[TEST8A]]* @_ZN5test81AC1Ev([[TEST8A]]* @_ZZN5test84testEvE1x) 341*67e74705SXin Li 342*67e74705SXin Li // FIXME: Here we register a global destructor that 343*67e74705SXin Li // unconditionally calls the destructor. That's what we've always 344*67e74705SXin Li // done for -fno-use-cxa-atexit here, but that's really not 345*67e74705SXin Li // semantically correct at all. 346*67e74705SXin Li 347*67e74705SXin Li // CHECK: call void @__cxa_guard_release(i32* @_ZGVZN5test84testEvE1x) 348*67e74705SXin Li // CHECK-NEXT: br label 349*67e74705SXin Li // -> end 350*67e74705SXin Li // end: 351*67e74705SXin Li // CHECK: ret void 352*67e74705SXin Li static A x; 353*67e74705SXin Li 354*67e74705SXin Li // CHECK: landingpad { i8*, i32 } 355*67e74705SXin Li // CHECK-NEXT: cleanup 356*67e74705SXin Li // CHECK: call void @__cxa_guard_abort(i32* @_ZGVZN5test84testEvE1x) 357*67e74705SXin Li // CHECK: resume { i8*, i32 } 358*67e74705SXin Li } 359*67e74705SXin Li } 360*67e74705SXin Li 361*67e74705SXin Li // rdar://12836470 362*67e74705SXin Li // Use a larger-than-mandated array cookie when allocating an 363*67e74705SXin Li // array whose type is overaligned. 364*67e74705SXin Li namespace test9 { 365*67e74705SXin Li class __attribute__((aligned(16))) A { 366*67e74705SXin Li float data[4]; 367*67e74705SXin Li public: 368*67e74705SXin Li A(); 369*67e74705SXin Li ~A(); 370*67e74705SXin Li }; 371*67e74705SXin Li testNew(unsigned n)372*67e74705SXin Li A *testNew(unsigned n) { 373*67e74705SXin Li return new A[n]; 374*67e74705SXin Li } 375*67e74705SXin Li // CHECK: define [[TEST9:%.*]]* @_ZN5test97testNewEj(i32 376*67e74705SXin Li // CHECK: [[N_VAR:%.*]] = alloca i32, align 4 377*67e74705SXin Li // CHECK: [[N:%.*]] = load i32, i32* [[N_VAR]], align 4 378*67e74705SXin Li // CHECK-NEXT: [[T0:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[N]], i32 16) 379*67e74705SXin Li // CHECK-NEXT: [[O0:%.*]] = extractvalue { i32, i1 } [[T0]], 1 380*67e74705SXin Li // CHECK-NEXT: [[T1:%.*]] = extractvalue { i32, i1 } [[T0]], 0 381*67e74705SXin Li // CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 16) 382*67e74705SXin Li // CHECK-NEXT: [[O1:%.*]] = extractvalue { i32, i1 } [[T2]], 1 383*67e74705SXin Li // CHECK-NEXT: [[OVERFLOW:%.*]] = or i1 [[O0]], [[O1]] 384*67e74705SXin Li // CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 0 385*67e74705SXin Li // CHECK-NEXT: [[T4:%.*]] = select i1 [[OVERFLOW]], i32 -1, i32 [[T3]] 386*67e74705SXin Li // CHECK-NEXT: [[ALLOC:%.*]] = call i8* @_Znam(i32 [[T4]]) 387*67e74705SXin Li // CHECK-NEXT: [[T0:%.*]] = bitcast i8* [[ALLOC]] to i32* 388*67e74705SXin Li // CHECK-NEXT: store i32 16, i32* [[T0]] 389*67e74705SXin Li // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i32, i32* [[T0]], i32 1 390*67e74705SXin Li // CHECK-NEXT: store i32 [[N]], i32* [[T1]] 391*67e74705SXin Li // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i8, i8* [[ALLOC]], i32 16 392*67e74705SXin Li // CHECK-NEXT: bitcast i8* [[T0]] to [[TEST9]]* 393*67e74705SXin Li // Array allocation follows. 394*67e74705SXin Li testDelete(A * array)395*67e74705SXin Li void testDelete(A *array) { 396*67e74705SXin Li delete[] array; 397*67e74705SXin Li } 398*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test910testDeleteEPNS_1AE( 399*67e74705SXin Li // CHECK: [[BEGIN:%.*]] = load [[TEST9]]*, [[TEST9]]** 400*67e74705SXin Li // CHECK-NEXT: [[T0:%.*]] = icmp eq [[TEST9]]* [[BEGIN]], null 401*67e74705SXin Li // CHECK-NEXT: br i1 [[T0]], 402*67e74705SXin Li // CHECK: [[T0:%.*]] = bitcast [[TEST9]]* [[BEGIN]] to i8* 403*67e74705SXin Li // CHECK-NEXT: [[ALLOC:%.*]] = getelementptr inbounds i8, i8* [[T0]], i32 -16 404*67e74705SXin Li // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i8, i8* [[ALLOC]], i32 4 405*67e74705SXin Li // CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to i32* 406*67e74705SXin Li // CHECK-NEXT: [[N:%.*]] = load i32, i32* [[T1]] 407*67e74705SXin Li // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[TEST9]], [[TEST9]]* [[BEGIN]], i32 [[N]] 408*67e74705SXin Li // CHECK-NEXT: [[T0:%.*]] = icmp eq [[TEST9]]* [[BEGIN]], [[END]] 409*67e74705SXin Li // CHECK-NEXT: br i1 [[T0]], 410*67e74705SXin Li // Array deallocation follows. 411*67e74705SXin Li } 412*67e74705SXin Li 413*67e74705SXin Li // CHECK: define linkonce_odr [[C:%.*]]* @_ZTv0_n12_N5test21CD1Ev( 414*67e74705SXin Li // CHECK: call [[C]]* @_ZN5test21CD1Ev( 415*67e74705SXin Li // CHECK: ret [[C]]* undef 416*67e74705SXin Li 417*67e74705SXin Li // CHECK-LABEL: define linkonce_odr void @_ZTv0_n12_N5test21CD0Ev( 418*67e74705SXin Li // CHECK: call void @_ZN5test21CD0Ev( 419*67e74705SXin Li // CHECK: ret void 420