// RUN: %clang_cc1 -triple x86_64-windows-msvc -std=c23 -fdefer-ts -fms-compatibility -emit-llvm %s -o - | FileCheck %s void g(); void h(); void f() { __try { _Defer h(); g(); } __finally { } } // CHECK-LABEL: define {{.*}} void @f() {{.*}} personality ptr @__C_specific_handler // CHECK: entry: // CHECK: invoke void @g() #4 // CHECK: to label %invoke.cont unwind label %ehcleanup // CHECK: invoke.cont: // CHECK: invoke void @h() #4 // CHECK: to label %invoke.cont1 unwind label %ehcleanup3 // CHECK: invoke.cont1: // CHECK: %0 = call ptr @llvm.localaddress() // CHECK: call void @"?fin$0@0@f@@"(i8 {{.*}} 0, ptr {{.*}} %0) // CHECK: ret void // CHECK: ehcleanup: // CHECK: %1 = cleanuppad within none [] // CHECK: invoke void @h() #4 [ "funclet"(token %1) ] // CHECK: to label %invoke.cont2 unwind label %ehcleanup3 // CHECK: invoke.cont2: // CHECK: cleanupret from %1 unwind label %ehcleanup3 // CHECK: ehcleanup3: // CHECK: %2 = cleanuppad within none [] // CHECK: %3 = call ptr @llvm.localaddress() // CHECK: call void @"?fin$0@0@f@@"(i8 {{.*}} 1, ptr {{.*}} %3) [ "funclet"(token %2) ] // CHECK: cleanupret from %2 unwind to caller // CHECK-LABEL: define {{.*}} void @"?fin$0@0@f@@"(i8 {{.*}} %abnormal_termination, ptr {{.*}} %frame_pointer) // CHECK: entry: // CHECK: %frame_pointer.addr = alloca ptr, align 8 // CHECK: %abnormal_termination.addr = alloca i8, align 1 // CHECK: store ptr %frame_pointer, ptr %frame_pointer.addr, align 8 // CHECK: store i8 %abnormal_termination, ptr %abnormal_termination.addr, align 1 // CHECK: ret void