blob: 1d021a759fea1f89fb4cc9b2053b0960ccd4c0f8 [file] [log] [blame]
Reid Kleckner7270ef52015-03-19 17:03:58 +00001// RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNSIZED
2// RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu -o - -DINLIB | FileCheck %s --check-prefix=CHECK --check-prefix=CHECKUND
Larisse Voufoe990a3f2015-02-18 01:04:10 +00003// 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
Reid Kleckner7270ef52015-03-19 17:03:58 +00004// RUN: %clang_cc1 -std=c++11 -fsized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNSIZED
5// RUN: %clang_cc1 -std=c++11 -fsized-deallocation %s -emit-llvm -triple x86_64-linux-gnu -o - -DINLIB | FileCheck %s --check-prefix=CHECK --check-prefix=CHECKUND
Larisse Voufoe990a3f2015-02-18 01:04:10 +00006// 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 +00007// 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 +00008// 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 +00009
10// CHECK-UNSIZED-NOT: _ZdlPvm
11// CHECK-UNSIZED-NOT: _ZdaPvm
12
13typedef decltype(sizeof(0)) size_t;
14
Reid Kleckner7270ef52015-03-19 17:03:58 +000015#ifdef INLIB
16void operator delete(void *, size_t) noexcept;
17void operator delete[](void *, size_t) noexcept;
18#endif
19
Richard Smith1cdec012013-09-29 04:40:38 +000020typedef int A;
21struct B { int n; };
22struct C { ~C() {} };
23struct D { D(); virtual ~D() {} };
24struct E {
25 void *operator new(size_t);
26 void *operator new[](size_t);
27 void operator delete(void *) noexcept;
28 void operator delete[](void *) noexcept;
29};
30struct F {
31 void *operator new(size_t);
32 void *operator new[](size_t);
33 void operator delete(void *, size_t) noexcept;
34 void operator delete[](void *, size_t) noexcept;
35};
36
37template<typename T> T get();
38
39template<typename T>
40void del() {
41 ::delete get<T*>();
42 ::delete[] get<T*>();
Richard Smithf03bd302013-12-05 08:30:59 +000043 delete get<T*>();
44 delete[] get<T*>();
Richard Smith1cdec012013-09-29 04:40:38 +000045}
46
47template void del<A>();
48template void del<B>();
49template void del<C>();
50template void del<D>();
51template void del<E>();
52template void del<F>();
53
54D::D() {}
55
56// CHECK-LABEL: define weak_odr void @_Z3delIiEvv()
57// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
58// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000059//
60// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
61// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000062
Reid Kleckner66abf2f2015-02-19 21:01:34 +000063// CHECKDEF-LABEL: define linkonce void @_ZdlPvm(i8*, i64) #{{[0-9]+}} comdat
Larisse Voufo5526f4f2015-02-14 05:42:57 +000064// CHECKDEF: call void @_ZdlPv(i8* %0)
Reid Kleckner7270ef52015-03-19 17:03:58 +000065// CHECKUND-LABEL: declare void @_ZdlPvm(i8*
Richard Smithb47c36f2013-11-05 09:12:18 +000066
Richard Smith1cdec012013-09-29 04:40:38 +000067// CHECK-LABEL: define weak_odr void @_Z3delI1BEvv()
68// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
69// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000070//
71// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
72// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000073
74// CHECK-LABEL: define weak_odr void @_Z3delI1CEvv()
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 %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000079//
80// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
81// CHECK: mul i64 1, %{{[^ ]*}}
82// CHECK: add i64 %{{[^ ]*}}, 8
83// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000084
Reid Kleckner66abf2f2015-02-19 21:01:34 +000085// CHECKDEF-LABEL: define linkonce void @_ZdaPvm(i8*, i64) #{{[0-9]+}} comdat
Larisse Voufo5526f4f2015-02-14 05:42:57 +000086// CHECKDEF: call void @_ZdaPv(i8* %0)
Reid Kleckner7270ef52015-03-19 17:03:58 +000087// CHECKUND-LABEL: declare void @_ZdaPvm(i8*
Richard Smithb47c36f2013-11-05 09:12:18 +000088
Richard Smith1cdec012013-09-29 04:40:38 +000089// CHECK-LABEL: define weak_odr void @_Z3delI1DEvv()
90// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)
91// CHECK: mul i64 8, %{{[^ ]*}}
92// CHECK: add i64 %{{[^ ]*}}, 8
93// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000094//
Reid Kleckner7270ef52015-03-19 17:03:58 +000095// CHECK-NOT: Zdl
Richard Smithf03bd302013-12-05 08:30:59 +000096// CHECK: call void %{{.*}}
97// CHECK-NOT: Zdl
98// CHECK: mul i64 8, %{{[^ ]*}}
99// CHECK: add i64 %{{[^ ]*}}, 8
100// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +0000101
102// CHECK-LABEL: define weak_odr void @_Z3delI1EEvv()
103// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
104// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +0000105//
106// CHECK: call void @_ZN1EdlEPv(i8* %{{[^ ]*}})
107// CHECK: call void @_ZN1EdaEPv(i8* %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +0000108
109// CHECK-LABEL: define weak_odr void @_Z3delI1FEvv()
110// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
111// CHECK: mul i64 1, %{{[^ ]*}}
112// CHECK: add i64 %{{[^ ]*}}, 8
113// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +0000114//
115// CHECK: call void @_ZN1FdlEPvm(i8* %{{[^ ]*}}, i64 1)
116// CHECK: mul i64 1, %{{[^ ]*}}
117// CHECK: add i64 %{{[^ ]*}}, 8
118// CHECK: call void @_ZN1FdaEPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +0000119
Richard Smith1cdec012013-09-29 04:40:38 +0000120
121// CHECK-LABEL: define linkonce_odr void @_ZN1DD0Ev(%{{[^ ]*}}* %this)
122// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)