[clang] 7976ac9 - [clang][bytecode] Check if block is initialized before invoking destructor (#174082)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 2 07:49:49 PST 2026
Author: nataliakokoromyti
Date: 2026-01-02T16:49:44+01:00
New Revision: 7976ac990000a58a7474269a3ca95e16aed8c35b
URL: https://github.com/llvm/llvm-project/commit/7976ac990000a58a7474269a3ca95e16aed8c35b
DIFF: https://github.com/llvm/llvm-project/commit/7976ac990000a58a7474269a3ca95e16aed8c35b.diff
LOG: [clang][bytecode] Check if block is initialized before invoking destructor (#174082)
Fixes #173950.
The bytecode interpreter was crashing when evaluating typeid() on
references to dynamically allocated objects. For example, this would
cause an assertion failure:
static A &a = *new A;
const std::type_info &a_ti = typeid(a);
The problem was that when initialization failed, the code tried to call
invokeDtor() on blocks that were never marked as initialized. This
caused the assertion "IsInitialized" to fail. With this fix, we first
check if the block is actually initialized before trying to invoke its
destructor.
The test case I added reproduces the original crash and with the fix, it
now passes.
Added:
Modified:
clang/lib/AST/ByteCode/Compiler.cpp
clang/test/AST/ByteCode/typeid.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index 67980676dcd30..4518c587ceca7 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -4803,7 +4803,8 @@ VarCreationState Compiler<Emitter>::visitDecl(const VarDecl *VD,
auto &GD = GlobalBlock->getBlockDesc<GlobalInlineDescriptor>();
GD.InitState = GlobalInitState::InitializerFailed;
- GlobalBlock->invokeDtor();
+ if (GlobalBlock->isInitialized())
+ GlobalBlock->invokeDtor();
}
}
@@ -4864,7 +4865,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);
+}
More information about the cfe-commits
mailing list