diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp index 4daab0702f147..0398f267c1be6 100644 --- a/clang/lib/AST/ByteCode/Compiler.cpp +++ b/clang/lib/AST/ByteCode/Compiler.cpp @@ -4801,7 +4801,8 @@ VarCreationState Compiler::visitDecl(const VarDecl *VD, auto &GD = GlobalBlock->getBlockDesc(); GD.InitState = GlobalInitState::InitializerFailed; - GlobalBlock->invokeDtor(); + if (GlobalBlock->isInitialized()) + GlobalBlock->invokeDtor(); } } @@ -4862,7 +4863,8 @@ bool Compiler::visitDeclAndReturn(const VarDecl *VD, const Expr *Init, auto &GD = GlobalBlock->getBlockDesc(); GD.InitState = GlobalInitState::InitializerFailed; - GlobalBlock->invokeDtor(); + if (GlobalBlock->isInitialized()) + GlobalBlock->invokeDtor(); } return false; } diff --git a/clang/test/AST/ByteCode/typeid.cpp b/clang/test/AST/ByteCode/typeid.cpp index aca18d4e25277..f4183691993d8 100644 --- a/clang/test/AST/ByteCode/typeid.cpp +++ b/clang/test/AST/ByteCode/typeid.cpp @@ -72,3 +72,16 @@ namespace TypeidPtrRegression { } } + +// Regression test for assertion failure in invokeDtor(). GH-173950 +namespace GH173950 { + struct A { + virtual void f(); + }; + + static A &a = *new A; + extern A &a; + + // This used to crash with: Assertion `IsInitialized' failed in invokeDtor() + const std::type_info &a_ti = typeid(a); +}