diff --git a/clang/lib/CodeGen/CGCleanup.cpp b/clang/lib/CodeGen/CGCleanup.cpp --- a/clang/lib/CodeGen/CGCleanup.cpp +++ b/clang/lib/CodeGen/CGCleanup.cpp @@ -782,7 +782,7 @@ if (!RequiresNormalCleanup) { // Mark CPP scope end for passed-by-value Arg temp // per Windows ABI which is "normally" Cleanup in callee - if (IsEHa && getInvokeDest()) { + if (IsEHa && getInvokeDest() && Builder.GetInsertBlock()) { if (Personality.isMSVCXXPersonality()) EmitSehCppScopeEnd(); } @@ -1031,6 +1031,8 @@ if (!Personality.isMSVCPersonality()) { EHStack.pushTerminate(); PushedTerminate = true; + } else if (IsEHa && getInvokeDest()) { + EmitSehCppScopeEnd(); } // We only actually emit the cleanup code if the cleanup is either diff --git a/clang/test/CodeGen/windows-seh-EHa-CppCatchReturn.cpp b/clang/test/CodeGen/windows-seh-EHa-CppCatchReturn.cpp --- a/clang/test/CodeGen/windows-seh-EHa-CppCatchReturn.cpp +++ b/clang/test/CodeGen/windows-seh-EHa-CppCatchReturn.cpp @@ -12,3 +12,20 @@ return; } } + +__declspec(noreturn) void bar(); +class baz { +public: + ~baz(); +}; + +// CHECK: define dso_local void @"?qux@@YAXXZ +// CHECK: invoke void @llvm.seh.scope.begin() +// CHECK-NOT: llvm.seh.try +// CHECK-NOT: llvm.seh.scope.end + +// We don't need to generate llvm.seh.scope.end for unreachable. +void qux() { + baz a; + bar(); +}