1*67e74705SXin Li // Check that delete exprs call the sized deallocation function if
2*67e74705SXin Li // -fsized-deallocation is passed in both C++11 and C++14.
3*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s
4*67e74705SXin Li // RUN: %clang_cc1 -std=c++14 -fsized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s
5*67e74705SXin Li
6*67e74705SXin Li // Check that we don't used sized deallocation without -fsized-deallocation and
7*67e74705SXin Li // C++14.
8*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNSIZED
9*67e74705SXin Li // RUN: %clang_cc1 -std=c++14 %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNSIZED
10*67e74705SXin Li
11*67e74705SXin Li // CHECK-UNSIZED-NOT: _ZdlPvm
12*67e74705SXin Li // CHECK-UNSIZED-NOT: _ZdaPvm
13*67e74705SXin Li
14*67e74705SXin Li typedef decltype(sizeof(0)) size_t;
15*67e74705SXin Li
16*67e74705SXin Li typedef int A;
17*67e74705SXin Li struct B { int n; };
~CC18*67e74705SXin Li struct C { ~C() {} };
~DD19*67e74705SXin Li struct D { D(); virtual ~D() {} };
20*67e74705SXin Li struct E {
21*67e74705SXin Li void *operator new(size_t);
22*67e74705SXin Li void *operator new[](size_t);
23*67e74705SXin Li void operator delete(void *) noexcept;
24*67e74705SXin Li void operator delete[](void *) noexcept;
25*67e74705SXin Li };
26*67e74705SXin Li struct F {
27*67e74705SXin Li void *operator new(size_t);
28*67e74705SXin Li void *operator new[](size_t);
29*67e74705SXin Li void operator delete(void *, size_t) noexcept;
30*67e74705SXin Li void operator delete[](void *, size_t) noexcept;
31*67e74705SXin Li };
32*67e74705SXin Li
33*67e74705SXin Li template<typename T> T get();
34*67e74705SXin Li
35*67e74705SXin Li template<typename T>
del()36*67e74705SXin Li void del() {
37*67e74705SXin Li ::delete get<T*>();
38*67e74705SXin Li ::delete[] get<T*>();
39*67e74705SXin Li delete get<T*>();
40*67e74705SXin Li delete[] get<T*>();
41*67e74705SXin Li }
42*67e74705SXin Li
43*67e74705SXin Li template void del<A>();
44*67e74705SXin Li template void del<B>();
45*67e74705SXin Li template void del<C>();
46*67e74705SXin Li template void del<D>();
47*67e74705SXin Li template void del<E>();
48*67e74705SXin Li template void del<F>();
49*67e74705SXin Li
D()50*67e74705SXin Li D::D() {}
51*67e74705SXin Li
52*67e74705SXin Li // CHECK-LABEL: define weak_odr void @_Z3delIiEvv()
53*67e74705SXin Li // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
54*67e74705SXin Li // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
55*67e74705SXin Li //
56*67e74705SXin Li // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
57*67e74705SXin Li // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
58*67e74705SXin Li
59*67e74705SXin Li // CHECK-LABEL: declare void @_ZdlPvm(i8*
60*67e74705SXin Li
61*67e74705SXin Li // CHECK-LABEL: define weak_odr void @_Z3delI1BEvv()
62*67e74705SXin Li // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
63*67e74705SXin Li // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
64*67e74705SXin Li //
65*67e74705SXin Li // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
66*67e74705SXin Li // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
67*67e74705SXin Li
68*67e74705SXin Li // CHECK-LABEL: define weak_odr void @_Z3delI1CEvv()
69*67e74705SXin Li // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
70*67e74705SXin Li // CHECK: mul i64 1, %{{[^ ]*}}
71*67e74705SXin Li // CHECK: add i64 %{{[^ ]*}}, 8
72*67e74705SXin Li // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
73*67e74705SXin Li //
74*67e74705SXin Li // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
75*67e74705SXin Li // CHECK: mul i64 1, %{{[^ ]*}}
76*67e74705SXin Li // CHECK: add i64 %{{[^ ]*}}, 8
77*67e74705SXin Li // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
78*67e74705SXin Li
79*67e74705SXin Li // CHECK-LABEL: declare void @_ZdaPvm(i8*
80*67e74705SXin Li
81*67e74705SXin Li // CHECK-LABEL: define weak_odr void @_Z3delI1DEvv()
82*67e74705SXin Li // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)
83*67e74705SXin Li // CHECK: mul i64 8, %{{[^ ]*}}
84*67e74705SXin Li // CHECK: add i64 %{{[^ ]*}}, 8
85*67e74705SXin Li // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
86*67e74705SXin Li //
87*67e74705SXin Li // CHECK-NOT: Zdl
88*67e74705SXin Li // CHECK: call void %{{.*}}
89*67e74705SXin Li // CHECK-NOT: Zdl
90*67e74705SXin Li // CHECK: mul i64 8, %{{[^ ]*}}
91*67e74705SXin Li // CHECK: add i64 %{{[^ ]*}}, 8
92*67e74705SXin Li // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
93*67e74705SXin Li
94*67e74705SXin Li // CHECK-LABEL: define weak_odr void @_Z3delI1EEvv()
95*67e74705SXin Li // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
96*67e74705SXin Li // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
97*67e74705SXin Li //
98*67e74705SXin Li // CHECK: call void @_ZN1EdlEPv(i8* %{{[^ ]*}})
99*67e74705SXin Li // CHECK: call void @_ZN1EdaEPv(i8* %{{[^ ]*}})
100*67e74705SXin Li
101*67e74705SXin Li // CHECK-LABEL: define weak_odr void @_Z3delI1FEvv()
102*67e74705SXin Li // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
103*67e74705SXin Li // CHECK: mul i64 1, %{{[^ ]*}}
104*67e74705SXin Li // CHECK: add i64 %{{[^ ]*}}, 8
105*67e74705SXin Li // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
106*67e74705SXin Li //
107*67e74705SXin Li // CHECK: call void @_ZN1FdlEPvm(i8* %{{[^ ]*}}, i64 1)
108*67e74705SXin Li // CHECK: mul i64 1, %{{[^ ]*}}
109*67e74705SXin Li // CHECK: add i64 %{{[^ ]*}}, 8
110*67e74705SXin Li // CHECK: call void @_ZN1FdaEPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
111*67e74705SXin Li
112*67e74705SXin Li
113*67e74705SXin Li // CHECK-LABEL: define linkonce_odr void @_ZN1DD0Ev(%{{[^ ]*}}* %this)
114*67e74705SXin Li // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)
115