1 // RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECKUND
2 // 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
3 // 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
4 // 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
5 // RUN: %clang_cc1 -std=c++11 %s -emit-llvm -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefix=CHECK-UNSIZED
6 // RUN: %clang_cc1 -std=c++1y %s -emit-llvm -triple x86_64-linux-gnu -fno-sized-deallocation -o - | FileCheck %s --check-prefix=CHECK-UNSIZED
7 
8 // CHECK-UNSIZED-NOT: _ZdlPvm
9 // CHECK-UNSIZED-NOT: _ZdaPvm
10 
11 typedef decltype(sizeof(0)) size_t;
12 
13 typedef int A;
14 struct B { int n; };
15 struct C { ~C() {} };
16 struct D { D(); virtual ~D() {} };
17 struct 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 };
23 struct 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 
30 template<typename T> T get();
31 
32 template<typename T>
33 void del() {
34   ::delete get<T*>();
35   ::delete[] get<T*>();
36   delete get<T*>();
37   delete[] get<T*>();
38 }
39 
40 template void del<A>();
41 template void del<B>();
42 template void del<C>();
43 template void del<D>();
44 template void del<E>();
45 template void del<F>();
46 
47 D::D() {}
48 
49 // CHECK-LABEL: define weak_odr void @_Z3delIiEvv()
50 // CHECKUND: br i1 icmp ne (void (i8*, i64)* @_ZdlPvm, void (i8*, i64)* null),
51 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
52 // CHECKUND: call void @_ZdlPv(i8* %{{[^ ]*}})
53 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
54 //
55 // CHECKUND: br i1 icmp ne (void (i8*, i64)* @_ZdlPvm, void (i8*, i64)* null),
56 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
57 // CHECKUND: call void @_ZdlPv(i8* %{{[^ ]*}})
58 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
59 
60 // CHECKDEF-LABEL: define linkonce void @_ZdlPvm(i8*, i64) #{{[0-9]+}} comdat
61 // CHECKDEF: call void @_ZdlPv(i8* %0)
62 // CHECKUND-LABEL: declare extern_weak void @_ZdlPvm(i8*
63 
64 // CHECK-LABEL: define weak_odr void @_Z3delI1BEvv()
65 // CHECKUND: br i1 icmp ne (void (i8*, i64)* @_ZdlPvm, void (i8*, i64)* null),
66 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
67 // CHECKUND: call void @_ZdlPv(i8* %{{[^ ]*}})
68 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
69 //
70 // CHECKUND: br i1 icmp ne (void (i8*, i64)* @_ZdlPvm, void (i8*, i64)* null),
71 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
72 // CHECKUND: call void @_ZdlPv(i8* %{{[^ ]*}})
73 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
74 
75 // CHECK-LABEL: define weak_odr void @_Z3delI1CEvv()
76 // CHECKUND: br i1 icmp ne (void (i8*, i64)* @_ZdlPvm, void (i8*, i64)* null),
77 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
78 // CHECKUND: call void @_ZdlPv(i8* %{{[^ ]*}})
79 // CHECKUND: br i1 icmp ne (void (i8*, i64)* @_ZdaPvm, void (i8*, i64)* null),
80 // CHECK: mul i64 1, %{{[^ ]*}}
81 // CHECK: add i64 %{{[^ ]*}}, 8
82 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
83 // CHECKUND: call void @_ZdaPv(i8* %{{[^ ]*}})
84 //
85 // CHECKUND: br i1 icmp ne (void (i8*, i64)* @_ZdlPvm, void (i8*, i64)* null),
86 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
87 // CHECKUND: call void @_ZdlPv(i8* %{{[^ ]*}})
88 // CHECKUND: br i1 icmp ne (void (i8*, i64)* @_ZdaPvm, void (i8*, i64)* null),
89 // CHECK: mul i64 1, %{{[^ ]*}}
90 // CHECK: add i64 %{{[^ ]*}}, 8
91 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
92 // CHECKUND: call void @_ZdaPv(i8* %{{[^ ]*}})
93 
94 // CHECKDEF-LABEL: define linkonce void @_ZdaPvm(i8*, i64) #{{[0-9]+}} comdat
95 // CHECKDEF: call void @_ZdaPv(i8* %0)
96 // CHECKUND-LABEL: declare extern_weak void @_ZdaPvm(i8*
97 
98 // CHECK-LABEL: define weak_odr void @_Z3delI1DEvv()
99 // CHECKUND: br i1 icmp ne (void (i8*, i64)* @_ZdlPvm, void (i8*, i64)* null),
100 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)
101 // CHECKUND: call void @_ZdlPv(i8* %{{[^ ]*}})
102 // CHECKUND: br i1 icmp ne (void (i8*, i64)* @_ZdaPvm, void (i8*, i64)* null),
103 // CHECK: mul i64 8, %{{[^ ]*}}
104 // CHECK: add i64 %{{[^ ]*}}, 8
105 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
106 // CHECKUND: call void @_ZdaPv(i8* %{{[^ ]*}})
107 //
108 // CHECKUND: br i1 icmp ne (void (i8*, i64)* @_ZdlPvm, void (i8*, i64)* null),
109 // CHECKDEF-NOT: Zdl
110 // CHECK: call void %{{.*}}
111 // CHECK-NOT: Zdl
112 // CHECKUND: br i1 icmp ne (void (i8*, i64)* @_ZdaPvm, void (i8*, i64)* null),
113 // CHECK: mul i64 8, %{{[^ ]*}}
114 // CHECK: add i64 %{{[^ ]*}}, 8
115 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
116 // CHECKUND: call void @_ZdaPv(i8* %{{[^ ]*}})
117 
118 // CHECK-LABEL: define weak_odr void @_Z3delI1EEvv()
119 // CHECKUND: br i1 icmp ne (void (i8*, i64)* @_ZdlPvm, void (i8*, i64)* null),
120 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
121 // CHECKUND: call void @_ZdlPv(i8* %{{[^ ]*}})
122 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
123 //
124 // CHECK: call void @_ZN1EdlEPv(i8* %{{[^ ]*}})
125 // CHECK: call void @_ZN1EdaEPv(i8* %{{[^ ]*}})
126 
127 // CHECK-LABEL: define weak_odr void @_Z3delI1FEvv()
128 // CHECKUND: br i1 icmp ne (void (i8*, i64)* @_ZdlPvm, void (i8*, i64)* null),
129 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
130 // CHECKUND: call void @_ZdlPv(i8* %{{[^ ]*}})
131 // CHECKUND: br i1 icmp ne (void (i8*, i64)* @_ZdaPvm, void (i8*, i64)* null),
132 // CHECK: mul i64 1, %{{[^ ]*}}
133 // CHECK: add i64 %{{[^ ]*}}, 8
134 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
135 // CHECKUND: call void @_ZdaPv(i8* %{{[^ ]*}})
136 //
137 // CHECK: call void @_ZN1FdlEPvm(i8* %{{[^ ]*}}, i64 1)
138 // CHECK: mul i64 1, %{{[^ ]*}}
139 // CHECK: add i64 %{{[^ ]*}}, 8
140 // CHECK: call void @_ZN1FdaEPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}})
141 
142 
143 // CHECK-LABEL: define linkonce_odr void @_ZN1DD0Ev(%{{[^ ]*}}* %this)
144 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)
145