// RUN: %clang_cc1 -triple x86_64-apple-darwin10 %s -emit-llvm -o - | FileCheck %s void t1(int *a) { delete a; } struct S { int a; }; // POD types. void t3(S *s) { delete s; } // Non-POD struct T { ~T(); int a; }; // CHECK: define void @_Z2t4P1T void t4(T *t) { // CHECK: call void @_ZN1TD1Ev // CHECK-NEXT: bitcast // CHECK-NEXT: call void @_ZdlPv delete t; } // PR5102 template class A { operator T *() const; }; void f() { A a; delete a; } namespace test0 { struct A { void *operator new(__SIZE_TYPE__ sz); void operator delete(void *p) { ::operator delete(p); } ~A() {} }; // CHECK: define void @_ZN5test04testEPNS_1AE( void test(A *a) { // CHECK: call void @_ZN5test01AD1Ev // CHECK-NEXT: bitcast // CHECK-NEXT: call void @_ZN5test01AdlEPv delete a; } // CHECK: define linkonce_odr void @_ZN5test01AD1Ev // CHECK: define linkonce_odr void @_ZN5test01AdlEPv } namespace test1 { struct A { int x; ~A(); }; // CHECK: define void @_ZN5test14testEPA10_A20_NS_1AE( void test(A (*arr)[10][20]) { delete [] arr; // CHECK: icmp eq [10 x [20 x [[S:%.*]]]]* [[PTR:%.*]], null // CHECK-NEXT: br i1 // CHECK: [[ARR:%.*]] = getelementptr inbounds [10 x [20 x [[S]]]]* [[PTR]], i32 0, i32 0, i32 0 // CHECK-NEXT: bitcast {{.*}} to i8* // CHECK-NEXT: [[ALLOC:%.*]] = getelementptr inbounds {{.*}}, i64 -8 // CHECK-NEXT: bitcast i8* [[ALLOC]] to i64* // CHECK-NEXT: load // CHECK-NEXT: store i64 {{.*}}, i64* [[IDX:%.*]] // CHECK: load i64* [[IDX]] // CHECK-NEXT: icmp ne {{.*}}, 0 // CHECK-NEXT: br i1 // CHECK: load i64* [[IDX]] // CHECK-NEXT: [[I:%.*]] = sub i64 {{.*}}, 1 // CHECK-NEXT: getelementptr inbounds [[S]]* [[ARR]], i64 [[I]] // CHECK-NEXT: call void @_ZN5test11AD1Ev( // CHECK-NEXT: br label // CHECK: load i64* [[IDX]] // CHECK-NEXT: sub // CHECK-NEXT: store {{.*}}, i64* [[IDX]] // CHECK-NEXT: br label // CHECK: call void @_ZdaPv(i8* [[ALLOC]]) } } namespace test2 { // CHECK: define void @_ZN5test21fEPb void f(bool *b) { // CHECK: call void @_ZdlPv(i8* delete b; // CHECK: call void @_ZdaPv(i8* delete [] b; } } namespace test3 { void f(int a[10][20]) { // CHECK: call void @_ZdaPv(i8* delete a; } }