blob: 089d966c869690919cae70b8bf45888934ee1542 [file] [edit]
// RUN: %clang_cc1 -triple x86_64-pc-windows-msvc -fms-extensions -fexceptions -emit-llvm -o - %s | FileCheck %s
class span_a {
public:
char data_;
int size_;
};
long g(span_a input);
void f(span_a input) {
__try {
} __except (g(input)) {
}
}
// CHECK-LABEL: define dso_local void @"?f@@YAXVspan_a@@@Z"(i64 %input.coerce)
// CHECK: entry:
// CHECK: call void (...) @llvm.localescape(ptr %input)
// CHECK-LABEL: define internal noundef i32 @"?filt$0@0@f@@"(ptr noundef %exception_pointers
// CHECK: entry:
// CHECK: %frame_pointer.addr = alloca ptr, align 8
// CHECK: %exception_pointers.addr = alloca ptr, align 8
// CHECK: %0 = call ptr @llvm.eh.recoverfp(ptr @"?f@@YAXVspan_a@@@Z", ptr %frame_pointer)
// CHECK: %input = call ptr @llvm.localrecover(ptr @"?f@@YAXVspan_a@@@Z", ptr %0, i32 0)
typedef __SIZE_TYPE__ size_t;
class span_b {
public:
char data_;
size_t size_;
};
long g(span_b input);
void f(span_b input) {
__try {
} __except (g(input)) {
}
}
// CHECK-LABEL: define dso_local void @"?f@@YAXVspan_b@@@Z"(ptr noundef dead_on_return %input)
// CHECK: entry:
// CHECK: %input.spill = alloca ptr, align 8
// CHECK: call void (...) @llvm.localescape(ptr %input.spill)
// CHECK-LABEL: define internal noundef i32 @"?filt$0@0@f@@.1"(ptr noundef %exception_pointers
// CHECK: entry:
// CHECK: %frame_pointer.addr = alloca ptr, align 8
// CHECK: %exception_pointers.addr = alloca ptr, align 8
// CHECK: %0 = call ptr @llvm.eh.recoverfp(ptr @"?f@@YAXVspan_b@@@Z", ptr %frame_pointer)
// CHECK: %1 = call ptr @llvm.localrecover(ptr @"?f@@YAXVspan_b@@@Z", ptr %0, i32 0)
// CHECK: %input = load ptr, ptr %1, align 8