blob: 9f26fa5e93748a734a8d9263150e9b45b75da2a1 [file] [log] [blame]
Larisse Voufo5526f4f2015-02-14 05:42:57 +00001// RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECKUND
Larisse Voufoe990a3f2015-02-18 01:04:10 +00002// RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu -fdefine-sized-deallocation -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECKDEF
Larisse Voufo5526f4f2015-02-14 05:42:57 +00003// RUN: %clang_cc1 -std=c++11 -fsized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECKUND
Larisse Voufoe990a3f2015-02-18 01:04:10 +00004// RUN: %clang_cc1 -std=c++11 -fsized-deallocation -fdefine-sized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECKDEF
Richard Smithb47c36f2013-11-05 09:12:18 +00005// RUN: %clang_cc1 -std=c++11 %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNSIZED
Larisse Voufo89088232015-02-20 02:07:22 +00006// RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu -fno-sized-deallocation -o - | FileCheck %s --check-prefix=CHECK-UNSIZED
Richard Smith1cdec012013-09-29 04:40:38 +00007
8// CHECK-UNSIZED-NOT: _ZdlPvm
9// CHECK-UNSIZED-NOT: _ZdaPvm
10
11typedef decltype(sizeof(0)) size_t;
12
13typedef int A;
14struct B { int n; };
15struct C { ~C() {} };
16struct D { D(); virtual ~D() {} };
17struct E {
18 void *operator new(size_t);
19 void *operator new[](size_t);
20 void operator delete(void *) noexcept;
21 void operator delete[](void *) noexcept;
22};
23struct F {
24 void *operator new(size_t);
25 void *operator new[](size_t);
26 void operator delete(void *, size_t) noexcept;
27 void operator delete[](void *, size_t) noexcept;
28};
29
30template<typename T> T get();
31
32template<typename T>
33void del() {
34 ::delete get<T*>();
35 ::delete[] get<T*>();
Richard Smithf03bd302013-12-05 08:30:59 +000036 delete get<T*>();
37 delete[] get<T*>();
Richard Smith1cdec012013-09-29 04:40:38 +000038}
39
40template void del<A>();
41template void del<B>();
42template void del<C>();
43template void del<D>();
44template void del<E>();
45template void del<F>();
46
47D::D() {}
48
49// CHECK-LABEL: define weak_odr void @_Z3delIiEvv()
50// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
51// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000052//
53// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
54// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000055
Reid Kleckner66abf2f2015-02-19 21:01:34 +000056// CHECKDEF-LABEL: define linkonce void @_ZdlPvm(i8*, i64) #{{[0-9]+}} comdat
Larisse Voufo5526f4f2015-02-14 05:42:57 +000057// CHECKDEF: call void @_ZdlPv(i8* %0)
58// CHECKUND-LABEL: declare void @_ZdlPvm(i8*
Richard Smithb47c36f2013-11-05 09:12:18 +000059
Richard Smith1cdec012013-09-29 04:40:38 +000060// CHECK-LABEL: define weak_odr void @_Z3delI1BEvv()
61// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
62// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000063//
64// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
65// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000066
67// CHECK-LABEL: define weak_odr void @_Z3delI1CEvv()
68// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
69// CHECK: mul i64 1, %{{[^ ]*}}
70// CHECK: add i64 %{{[^ ]*}}, 8
71// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000072//
73// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
74// CHECK: mul i64 1, %{{[^ ]*}}
75// CHECK: add i64 %{{[^ ]*}}, 8
76// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000077
Reid Kleckner66abf2f2015-02-19 21:01:34 +000078// CHECKDEF-LABEL: define linkonce void @_ZdaPvm(i8*, i64) #{{[0-9]+}} comdat
Larisse Voufo5526f4f2015-02-14 05:42:57 +000079// CHECKDEF: call void @_ZdaPv(i8* %0)
80// CHECKUND-LABEL: declare void @_ZdaPvm(i8*
Richard Smithb47c36f2013-11-05 09:12:18 +000081
Richard Smith1cdec012013-09-29 04:40:38 +000082// CHECK-LABEL: define weak_odr void @_Z3delI1DEvv()
83// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)
84// CHECK: mul i64 8, %{{[^ ]*}}
85// CHECK: add i64 %{{[^ ]*}}, 8
86// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000087//
88// CHECK-NOT: Zdl
89// CHECK: call void %{{.*}}
90// CHECK-NOT: Zdl
91// CHECK: mul i64 8, %{{[^ ]*}}
92// CHECK: add i64 %{{[^ ]*}}, 8
93// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000094
95// CHECK-LABEL: define weak_odr void @_Z3delI1EEvv()
96// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
97// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000098//
99// CHECK: call void @_ZN1EdlEPv(i8* %{{[^ ]*}})
100// CHECK: call void @_ZN1EdaEPv(i8* %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +0000101
102// CHECK-LABEL: define weak_odr void @_Z3delI1FEvv()
103// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
104// CHECK: mul i64 1, %{{[^ ]*}}
105// CHECK: add i64 %{{[^ ]*}}, 8
106// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +0000107//
108// CHECK: call void @_ZN1FdlEPvm(i8* %{{[^ ]*}}, i64 1)
109// CHECK: mul i64 1, %{{[^ ]*}}
110// CHECK: add i64 %{{[^ ]*}}, 8
111// CHECK: call void @_ZN1FdaEPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +0000112
Richard Smith1cdec012013-09-29 04:40:38 +0000113
114// CHECK-LABEL: define linkonce_odr void @_ZN1DD0Ev(%{{[^ ]*}}* %this)
115// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)