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 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
51 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
52 //
53 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
54 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
55 
56 // CHECKDEF-LABEL: define linkonce void @_ZdlPvm(i8*, i64) #{{[0-9]+}} comdat
57 // CHECKDEF: call void @_ZdlPv(i8* %0)
58 // CHECKUND-LABEL: declare void @_ZdlPvm(i8*
59 
60 // CHECK-LABEL: define weak_odr void @_Z3delI1BEvv()
61 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
62 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
63 //
64 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4)
65 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
66 
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 %{{[^ ]*}})
72 //
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 %{{[^ ]*}})
77 
78 // CHECKDEF-LABEL: define linkonce void @_ZdaPvm(i8*, i64) #{{[0-9]+}} comdat
79 // CHECKDEF: call void @_ZdaPv(i8* %0)
80 // CHECKUND-LABEL: declare void @_ZdaPvm(i8*
81 
82 // 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 %{{[^ ]*}})
87 //
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 %{{[^ ]*}})
94 
95 // CHECK-LABEL: define weak_odr void @_Z3delI1EEvv()
96 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1)
97 // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}})
98 //
99 // CHECK: call void @_ZN1EdlEPv(i8* %{{[^ ]*}})
100 // CHECK: call void @_ZN1EdaEPv(i8* %{{[^ ]*}})
101 
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 %{{[^ ]*}})
107 //
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 %{{[^ ]*}})
112 
113 
114 // CHECK-LABEL: define linkonce_odr void @_ZN1DD0Ev(%{{[^ ]*}}* %this)
115 // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8)
116