// 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