1
- // RUN: %clang_cc1 -std=c++2a -emit-llvm %s -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefixes=CHECK,CHECK-ITANIUM,CHECK-64BIT
2
- // RUN: %clang_cc1 -std=c++2a -emit-llvm %s -triple x86_64-windows -o - | FileCheck %s --check-prefixes=CHECK,CHECK-MSABI,CHECK-MSABI64,CHECK-64BIT
3
- // RUN: %clang_cc1 -std=c++2a -emit-llvm %s -triple i386-windows -o - | FileCheck %s --check-prefixes=CHECK,CHECK-MSABI,CHECK-MSABI32,CHECK-32BIT
1
+ // RUN: %clang_cc1 -std=c++2a -fexceptions - emit-llvm %s -triple x86_64-linux-gnu -o - | FileCheck %s --check-prefixes=CHECK,CHECK-ITANIUM,CHECK-64BIT
2
+ // RUN: %clang_cc1 -std=c++2a -fexceptions - emit-llvm %s -triple x86_64-windows -o - | FileCheck %s --check-prefixes=CHECK,CHECK-MSABI,CHECK-MSABI64,CHECK-64BIT
3
+ // RUN: %clang_cc1 -std=c++2a -fexceptions - emit-llvm %s -triple i386-windows -o - | FileCheck %s --check-prefixes=CHECK,CHECK-MSABI,CHECK-MSABI32,CHECK-32BIT
4
4
5
5
// PR46908: ensure the IR passes the verifier with optimizations enabled.
6
- // RUN: %clang_cc1 -std=c++2a -emit-llvm-only %s -triple x86_64-linux-gnu -O2
7
- // RUN: %clang_cc1 -std=c++2a -emit-llvm-only %s -triple x86_64-windows -O2
8
- // RUN: %clang_cc1 -std=c++2a -emit-llvm-only %s -triple i386-windows -O2
6
+ // RUN: %clang_cc1 -std=c++2a -fexceptions - emit-llvm-only %s -triple x86_64-linux-gnu -O2
7
+ // RUN: %clang_cc1 -std=c++2a -fexceptions - emit-llvm-only %s -triple x86_64-windows -O2
8
+ // RUN: %clang_cc1 -std=c++2a -fexceptions - emit-llvm-only %s -triple i386-windows -O2
9
9
10
10
namespace std {
11
11
using size_t = decltype (sizeof (0 ));
@@ -102,6 +102,41 @@ void delete_D(D *d) { delete d; }
102
102
// CHECK-NOT: call
103
103
// CHECK: }
104
104
105
+ struct J {
106
+ J (); // might throw
107
+ void operator delete (J *, std::destroying_delete_t );
108
+ };
109
+
110
+ // CHECK-ITANIUM-LABEL: define {{.*}}@_Z1j
111
+ // CHECK-MSABI-LABEL: define {{.*}}@"?j@@
112
+ J *j () {
113
+ // CHECK-ITANIUM: invoke {{.*}}@_ZN1JC1Ev(
114
+ // CHECK-ITANIUM: call {{.*}}@_ZdlPv(
115
+ // CHECK-NOT: }
116
+ // CHECK-MSABI: invoke {{.*}}@"??0J@@Q{{AE|EAA}}@XZ"(
117
+ // CHECK-MSABI: call {{.*}}@"??3@YAXP{{E?}}AX@Z"(
118
+ return new J;
119
+ // CHECK: }
120
+ }
121
+
122
+ struct K {
123
+ K (); // might throw
124
+ void operator delete (void *);
125
+ void operator delete (K *, std::destroying_delete_t );
126
+ };
127
+
128
+ // CHECK-ITANIUM-LABEL: define {{.*}}@_Z1k
129
+ // CHECK-MSABI-LABEL: define {{.*}}@"?k@@
130
+ K *k () {
131
+ // CHECK-ITANIUM: invoke {{.*}}@_ZN1KC1Ev(
132
+ // CHECK-ITANIUM: call {{.*}}@_ZN1KdlEPv(
133
+ // CHECK-NOT: }
134
+ // CHECK-MSABI: invoke {{.*}}@"??0K@@Q{{AE|EAA}}@XZ"(
135
+ // CHECK-MSABI: call {{.*}}@"??3K@@SAXP{{E?}}AX@Z"(
136
+ return new K;
137
+ // CHECK: }
138
+ }
139
+
105
140
struct E { void *data; };
106
141
struct F { void operator delete (F *, std::destroying_delete_t , std::size_t , std::align_val_t ); void *data; };
107
142
struct alignas (16 ) G : E, F { void *data; };
@@ -127,8 +162,8 @@ H::~H() { call_in_dtor(); }
127
162
// CHECK-ITANIUM-NOT: call
128
163
// CHECK-ITANIUM: }
129
164
130
- // CHECK-MSABI64: define {{.*}} @"??_GH@@UEAAPEAXI@Z"(
131
- // CHECK-MSABI32: define {{.*}} @"??_GH@@UAEPAXI@Z"(
165
+ // CHECK-MSABI64-LABEL : define {{.*}} @"??_GH@@UEAAPEAXI@Z"(
166
+ // CHECK-MSABI32-LABEL : define {{.*}} @"??_GH@@UAEPAXI@Z"(
132
167
// CHECK-MSABI-NOT: call{{ }}
133
168
// CHECK-MSABI: load i32
134
169
// CHECK-MSABI: icmp eq i32 {{.*}}, 0
@@ -158,8 +193,8 @@ I::~I() { call_in_dtor(); }
158
193
// CHECK-ITANIUM-NOT: call
159
194
// CHECK-ITANIUM: }
160
195
161
- // CHECK-MSABI64: define {{.*}} @"??_GI@@UEAAPEAXI@Z"(
162
- // CHECK-MSABI32: define {{.*}} @"??_GI@@UAEPAXI@Z"(
196
+ // CHECK-MSABI64-LABEL : define {{.*}} @"??_GI@@UEAAPEAXI@Z"(
197
+ // CHECK-MSABI32-LABEL : define {{.*}} @"??_GI@@UAEPAXI@Z"(
163
198
// CHECK-MSABI-NOT: call{{ }}
164
199
// CHECK-MSABI: load i32
165
200
// CHECK-MSABI: icmp eq i32 {{.*}}, 0
0 commit comments