blob: 78cc71325436bdf226fb78b00dac17a00e6a2e9d [file] [log] [blame]
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00001// Check that delete exprs call the sized deallocation function if
2// -fsized-deallocation is passed in both C++11 and C++14.
3// RUN: %clang_cc1 -std=c++11 -fsized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s
4// RUN: %clang_cc1 -std=c++14 -fsized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s
5
6// Check that we don't used sized deallocation without -fsized-deallocation and
7// C++14.
Richard Smithb47c36f2013-11-05 09:12:18 +00008// RUN: %clang_cc1 -std=c++11 %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNSIZED
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00009// RUN: %clang_cc1 -std=c++14 %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNSIZED
Richard Smith1cdec012013-09-29 04:40:38 +000010
11// CHECK-UNSIZED-NOT: _ZdlPvm
12// CHECK-UNSIZED-NOT: _ZdaPvm
13
14typedef decltype(sizeof(0)) size_t;
15
16typedef int A;
17struct B { int n; };
18struct C { ~C() {} };
19struct D { D(); virtual ~D() {} };
20struct E {
21 void *operator new(size_t);
22 void *operator new[](size_t);
23 void operator delete(void *) noexcept;
24 void operator delete[](void *) noexcept;
25};
26struct F {
27 void *operator new(size_t);
28 void *operator new[](size_t);
29 void operator delete(void *, size_t) noexcept;
30 void operator delete[](void *, size_t) noexcept;
31};
32
33template<typename T> T get();
34
35template<typename T>
36void del() {
37 ::delete get<T*>();
38 ::delete[] get<T*>();
Richard Smithf03bd302013-12-05 08:30:59 +000039 delete get<T*>();
40 delete[] get<T*>();
Richard Smith1cdec012013-09-29 04:40:38 +000041}
42
43template void del<A>();
44template void del<B>();
45template void del<C>();
46template void del<D>();
47template void del<E>();
48template void del<F>();
49
50D::D() {}
51
52// CHECK-LABEL: define weak_odr void @_Z3delIiEvv()
53// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
54// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000055//
56// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
57// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000058
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +000059// CHECK-LABEL: declare void @_ZdlPvm(i8*
Richard Smithb47c36f2013-11-05 09:12:18 +000060
Richard Smith1cdec012013-09-29 04:40:38 +000061// CHECK-LABEL: define weak_odr void @_Z3delI1BEvv()
62// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
63// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000064//
65// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
66// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000067
68// CHECK-LABEL: define weak_odr void @_Z3delI1CEvv()
69// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
70// CHECK: mul i64 1, %{{[^ ]*}}
71// CHECK: add i64 %{{[^ ]*}}, 8
72// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000073//
74// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
75// CHECK: mul i64 1, %{{[^ ]*}}
76// CHECK: add i64 %{{[^ ]*}}, 8
77// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000078
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +000079// CHECK-LABEL: declare void @_ZdaPvm(i8*
Richard Smithb47c36f2013-11-05 09:12:18 +000080
Richard Smith1cdec012013-09-29 04:40:38 +000081// CHECK-LABEL: define weak_odr void @_Z3delI1DEvv()
82// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)
83// CHECK: mul i64 8, %{{[^ ]*}}
84// CHECK: add i64 %{{[^ ]*}}, 8
85// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000086//
Reid Kleckner7270ef52015-03-19 17:03:58 +000087// CHECK-NOT: Zdl
Richard Smithf03bd302013-12-05 08:30:59 +000088// CHECK: call void %{{.*}}
89// CHECK-NOT: Zdl
90// CHECK: mul i64 8, %{{[^ ]*}}
91// CHECK: add i64 %{{[^ ]*}}, 8
92// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000093
94// CHECK-LABEL: define weak_odr void @_Z3delI1EEvv()
95// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
96// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000097//
98// CHECK: call void @_ZN1EdlEPv(i8* %{{[^ ]*}})
99// CHECK: call void @_ZN1EdaEPv(i8* %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +0000100
101// CHECK-LABEL: define weak_odr void @_Z3delI1FEvv()
102// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
103// CHECK: mul i64 1, %{{[^ ]*}}
104// CHECK: add i64 %{{[^ ]*}}, 8
105// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +0000106//
107// CHECK: call void @_ZN1FdlEPvm(i8* %{{[^ ]*}}, i64 1)
108// CHECK: mul i64 1, %{{[^ ]*}}
109// CHECK: add i64 %{{[^ ]*}}, 8
110// CHECK: call void @_ZN1FdaEPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +0000111
Richard Smith1cdec012013-09-29 04:40:38 +0000112
113// CHECK-LABEL: define linkonce_odr void @_ZN1DD0Ev(%{{[^ ]*}}* %this)
114// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)