blob: 7fd3ece3e02ce75b5d97980773296bf18d204ae5 [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*>();
Richard Smithf03bd302013-12-05 08:30:59 +000033 delete get<T*>();
34 delete[] get<T*>();
Richard Smith1cdec012013-09-29 04:40:38 +000035}
36
37template void del<A>();
38template void del<B>();
39template void del<C>();
40template void del<D>();
41template void del<E>();
42template void del<F>();
43
44D::D() {}
45
46// CHECK-LABEL: define weak_odr void @_Z3delIiEvv()
47// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
48// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000049//
50// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
51// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000052
Richard Smithb47c36f2013-11-05 09:12:18 +000053// CHECK-LABEL: define linkonce void @_ZdlPvm(i8*
54// CHECK: call void @_ZdlPv(i8* %0)
55
Richard Smith1cdec012013-09-29 04:40:38 +000056// CHECK-LABEL: define weak_odr void @_Z3delI1BEvv()
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
63// CHECK-LABEL: define weak_odr void @_Z3delI1CEvv()
64// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
65// CHECK: mul i64 1, %{{[^ ]*}}
66// CHECK: add i64 %{{[^ ]*}}, 8
67// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000068//
69// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
70// CHECK: mul i64 1, %{{[^ ]*}}
71// CHECK: add i64 %{{[^ ]*}}, 8
72// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000073
Richard Smithb47c36f2013-11-05 09:12:18 +000074// CHECK-LABEL: define linkonce void @_ZdaPvm(i8*
75// CHECK: call void @_ZdaPv(i8* %0)
76
Richard Smith1cdec012013-09-29 04:40:38 +000077// CHECK-LABEL: define weak_odr void @_Z3delI1DEvv()
78// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)
79// CHECK: mul i64 8, %{{[^ ]*}}
80// CHECK: add i64 %{{[^ ]*}}, 8
81// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000082//
83// CHECK-NOT: Zdl
84// CHECK: call void %{{.*}}
85// CHECK-NOT: Zdl
86// CHECK: mul i64 8, %{{[^ ]*}}
87// CHECK: add i64 %{{[^ ]*}}, 8
88// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000089
90// CHECK-LABEL: define weak_odr void @_Z3delI1EEvv()
91// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
92// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +000093//
94// CHECK: call void @_ZN1EdlEPv(i8* %{{[^ ]*}})
95// CHECK: call void @_ZN1EdaEPv(i8* %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +000096
97// CHECK-LABEL: define weak_odr void @_Z3delI1FEvv()
98// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
99// CHECK: mul i64 1, %{{[^ ]*}}
100// CHECK: add i64 %{{[^ ]*}}, 8
101// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smithf03bd302013-12-05 08:30:59 +0000102//
103// CHECK: call void @_ZN1FdlEPvm(i8* %{{[^ ]*}}, i64 1)
104// CHECK: mul i64 1, %{{[^ ]*}}
105// CHECK: add i64 %{{[^ ]*}}, 8
106// CHECK: call void @_ZN1FdaEPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
Richard Smith1cdec012013-09-29 04:40:38 +0000107
Richard Smith1cdec012013-09-29 04:40:38 +0000108
109// CHECK-LABEL: define linkonce_odr void @_ZN1DD0Ev(%{{[^ ]*}}* %this)
110// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)