| // 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 nofreeobj noundef align 8 dead_on_return dereferenceable(16) %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 |