[clang] a2dc8b4 - [clang][bytecode] Fix a crash with invalid function frames (#230524)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 9 22:22:25 PDT 2026
Author: Timm Baeder
Date: 2026-10-10T07:22:18+02:00
New Revision: a2dc8b4436c8b00643c81e0efa54f16f8f5bedac
URL: https://github.com/llvm/llvm-project/commit/a2dc8b4436c8b00643c81e0efa54f16f8f5bedac
DIFF: https://github.com/llvm/llvm-project/commit/a2dc8b4436c8b00643c81e0efa54f16f8f5bedac.diff
LOG: [clang][bytecode] Fix a crash with invalid function frames (#230524)
This happens with the fake frames we create for the `TrivialCopy`
opcode.
Added:
Modified:
clang/lib/AST/ByteCode/InterpFrame.cpp
clang/test/AST/ByteCode/cxx20.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/InterpFrame.cpp b/clang/lib/AST/ByteCode/InterpFrame.cpp
index 413f2b51713b5..c04a70cc49f7c 100644
--- a/clang/lib/AST/ByteCode/InterpFrame.cpp
+++ b/clang/lib/AST/ByteCode/InterpFrame.cpp
@@ -279,6 +279,11 @@ SourceInfo InterpFrame::getSource(CodePtr PC) const {
if (Func && !funcHasUsableBody(Func) && Caller)
return Caller->getSource(getRetOpPC());
+ // If we have a frame for an invalid function, check the caller.
+ // This happens for the fake function frame we create in TrivialCopy.
+ if (Func && !Func->isValid())
+ return Caller->getSource(getRetOpPC());
+
// Similarly, if the resulting source location is invalid anyway,
// point to the caller instead.
SourceInfo Result = Func->getSource(PC);
diff --git a/clang/test/AST/ByteCode/cxx20.cpp b/clang/test/AST/ByteCode/cxx20.cpp
index c5ade52a66b40..47d2fad17f4dc 100644
--- a/clang/test/AST/ByteCode/cxx20.cpp
+++ b/clang/test/AST/ByteCode/cxx20.cpp
@@ -1544,3 +1544,23 @@ namespace InvalidVirtualCall {
// both-note {{declared here}}
};
}
+
+namespace FailInTrivialCopy {
+
+ struct S {
+ S &operator=(const S &) = default;
+ int val; // ref-note {{subobject declared here}}
+ };
+
+ constexpr bool foo() {
+ S s1; // expected-note {{declared here}}
+ S s2{42};
+ s2 = s1; // expected-note {{read of uninitialized object}} \
+ // ref-note {{subobject 'val' is not initialized}} \
+ // both-note {{in call to}}
+ return true;
+ }
+
+ static_assert(foo(), ""); // both-error {{not an integral constant expression}} \
+ // both-note {{in call to}}
+}
More information about the cfe-commits
mailing list