https://github.com/nataliakokoromyti updated https://github.com/llvm/llvm-project/pull/174082
>From 5a794906cc3fd8b26cc68a4e9513b853f7a147a8 Mon Sep 17 00:00:00 2001 From: Natalia Kokoromyti <[email protected]> Date: Wed, 31 Dec 2025 03:04:19 -0800 Subject: [PATCH] [clang][bytecode] Check if block is initialized before invoking destructor. Fixes #173950 --- clang/lib/AST/ByteCode/Compiler.cpp | 6 ++++-- clang/test/AST/ByteCode/typeid.cpp | 13 +++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) 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<Emitter>::visitDecl(const VarDecl *VD, auto &GD = GlobalBlock->getBlockDesc<GlobalInlineDescriptor>(); GD.InitState = GlobalInitState::InitializerFailed; - GlobalBlock->invokeDtor(); + if (GlobalBlock->isInitialized()) + GlobalBlock->invokeDtor(); } } @@ -4862,7 +4863,8 @@ bool Compiler<Emitter>::visitDeclAndReturn(const VarDecl *VD, const Expr *Init, auto &GD = GlobalBlock->getBlockDesc<GlobalInlineDescriptor>(); 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); +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
