[clang] [clang][bytecode] Check if block is initialized before invoking destructor (PR #174082)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 2 02:35:13 PST 2026
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 <nataliakokoromyti at gmail.com>
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);
+}
More information about the cfe-commits
mailing list