blob: 642e1e07f6cdf51d1b2509b3069b598d4eb9b9a4 [file] [log] [blame]
Richard Smithb47c36f2013-11-05 09:12:18 +00001// RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s
2// RUN: %clang_cc1 -std=c++11 -fsized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s
3// RUN: %clang_cc1 -std=c++11 %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNSIZED
Richard Smith1cdec012013-09-29 04:40:38 +00004
5// CHECK-UNSIZED-NOT: _ZdlPvm
6// CHECK-UNSIZED-NOT: _ZdaPvm
7
8typedef decltype(sizeof(0)) size_t;
9
10typedef int A;
11struct B { int n; };
12struct C { ~C() {} };
13struct D { D(); virtual ~D() {} };
14struct E {
15 void *operator new(size_t);
16 void *operator new[](size_t);
17 void operator delete(void *) noexcept;
18 void operator delete[](void *) noexcept;
19};
20struct F {
21 void *operator new(size_t);
22 void *operator new[](size_t);
23 void operator delete(void *, size_t) noexcept;
24 void operator delete[](void *, size_t) noexcept;
25};
26
27template<typename T> T get();
28
29template<typename T>
30void del() {
31 ::delete get<T*>();
32 ::delete[] get<T*>();
33}
34
35template void del<A>();
36template void del<B>();
37template void del<C>();
38template void del<D>();
39template void del<E>();
40template void del<F>();
41
42D::D() {}
43
44// CHECK-LABEL: define weak_odr void @_Z3delIiEvv()
45// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
46// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
47
Richard Smithb47c36f2013-11-05 09:12:18 +000048// CHECK-LABEL: define linkonce void @_ZdlPvm(i8*
49// CHECK: call void @_ZdlPv(i8* %0)
50
Richard Smith1cdec012013-09-29 04:40:38 +000051// CHECK-LABEL: define weak_odr void @_Z3delI1BEvv()
52// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
53// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
54
55// CHECK-LABEL: define weak_odr void @_Z3delI1CEvv()
56// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
57// CHECK: mul i64 1, %{{[^ ]*}}
58// CHECK: add i64 %{{[^ ]*}}, 8
59// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
60
Richard Smithb47c36f2013-11-05 09:12:18 +000061// CHECK-LABEL: define linkonce void @_ZdaPvm(i8*
62// CHECK: call void @_ZdaPv(i8* %0)
63
Richard Smith1cdec012013-09-29 04:40:38 +000064// CHECK-LABEL: define weak_odr void @_Z3delI1DEvv()
65// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)
66// CHECK: mul i64 8, %{{[^ ]*}}
67// CHECK: add i64 %{{[^ ]*}}, 8
68// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
69
70// CHECK-LABEL: define weak_odr void @_Z3delI1EEvv()
71// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
72// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
73
74// CHECK-LABEL: define weak_odr void @_Z3delI1FEvv()
75// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
76// CHECK: mul i64 1, %{{[^ ]*}}
77// CHECK: add i64 %{{[^ ]*}}, 8
78// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
79
80// CHECK-LABEL: define void @_Z10member_delv()
81// CHECK-NOT: Zdl
82// CHECK: call void %{{[^ ]*}}(%{{[^ ]*}}* %
83// CHECK-NOT: Zdl
84// CHECK: }
85void member_del() {
86 delete get<D*>();
87}
88
89// CHECK-LABEL: define linkonce_odr void @_ZN1DD0Ev(%{{[^ ]*}}* %this)
90// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)