blob: ccd1cf994af6122696b6cc3f447a622975ac5a39 [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
Richard Smith1cdec012013-09-29 04:40:38 +00006
7// CHECK-UNSIZED-NOT: _ZdlPvm
8// CHECK-UNSIZED-NOT: _ZdaPvm
9
10typedef decltype(sizeof(0)) size_t;
11
12typedef int A;
13struct B { int n; };
14struct C { ~C() {} };
15struct D { D(); virtual ~D() {} };
16struct E {
17 void *operator new(size_t);
18 void *operator new[](size_t);
19 void operator delete(void *) noexcept;
20 void operator delete[](void *) noexcept;
21};
22struct F {
23 void *operator new(size_t);
24 void *operator new[](size_t);
25 void operator delete(void *, size_t) noexcept;
26 void operator delete[](void *, size_t) noexcept;
27};
28
29template<typename T> T get();
30
31template<typename T>
32void del() {
33 ::delete get<T*>();
34 ::delete[] get<T*>();
Richard Smithf03bd302013-12-05 08:30:59 +000035 delete get<T*>();
36 delete[] get<T*>();
Richard Smith1cdec012013-09-29 04:40:38 +000037}
38
39template void del<A>();
40template void del<B>();
41template void del<C>();
42template void del<D>();
43template void del<E>();
44template void del<F>();
45
46D::D() {}
47
48// CHECK-LABEL: define weak_odr void @_Z3delIiEvv()
49// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
50// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000051//
52// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
53// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000054
Larisse Voufo5526f4f2015-02-14 05:42:57 +000055// CHECKDEF-LABEL: define linkonce void @_ZdlPvm(i8*
56// CHECKDEF: call void @_ZdlPv(i8* %0)
57// CHECKUND-LABEL: declare void @_ZdlPvm(i8*
Richard Smithb47c36f2013-11-05 09:12:18 +000058
Richard Smith1cdec012013-09-29 04:40:38 +000059// CHECK-LABEL: define weak_odr void @_Z3delI1BEvv()
60// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
61// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000062//
63// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
64// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000065
66// CHECK-LABEL: define weak_odr void @_Z3delI1CEvv()
67// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
68// CHECK: mul i64 1, %{{[^ ]*}}
69// CHECK: add i64 %{{[^ ]*}}, 8
70// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000071//
72// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
73// CHECK: mul i64 1, %{{[^ ]*}}
74// CHECK: add i64 %{{[^ ]*}}, 8
75// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000076
Larisse Voufo5526f4f2015-02-14 05:42:57 +000077// CHECKDEF-LABEL: define linkonce void @_ZdaPvm(i8*
78// CHECKDEF: call void @_ZdaPv(i8* %0)
79// CHECKUND-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//
87// CHECK-NOT: Zdl
88// 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)