[clang] b056c86 - [clang][bytecode] Disallow reading from non-constant, array-typed `CompoundLiteralExpr`s (#195675)
via cfe-commits
cfe-commits at lists.llvm.org
Thu May 7 07:50:55 PDT 2026
Author: Timm Baeder
Date: 2026-05-07T16:50:50+02:00
New Revision: b056c86a4c5b9d20eafdb21131ff2e574bf05f07
URL: https://github.com/llvm/llvm-project/commit/b056c86a4c5b9d20eafdb21131ff2e574bf05f07
DIFF: https://github.com/llvm/llvm-project/commit/b056c86a4c5b9d20eafdb21131ff2e574bf05f07.diff
LOG: [clang][bytecode] Disallow reading from non-constant, array-typed `CompoundLiteralExpr`s (#195675)
Like the current interpreter does.
Added:
Modified:
clang/lib/AST/ByteCode/Interp.cpp
clang/test/SemaTemplate/constexpr-instantiate.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp
index 30b54f5dab236..0ac6d2f7737fc 100644
--- a/clang/lib/AST/ByteCode/Interp.cpp
+++ b/clang/lib/AST/ByteCode/Interp.cpp
@@ -832,6 +832,34 @@ bool CheckLoad(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
return false;
if (isConstexprUnknown(Ptr))
return false;
+
+ if (!Ptr.isArrayRoot()) {
+ // According to GCC info page:
+ //
+ // 6.28 Compound Literals
+ //
+ // As an optimization, G++ sometimes gives array compound literals
+ // longer lifetimes: when the array either appears outside a function or
+ // has a const-qualified type. If foo and its initializer had elements
+ // of type char *const rather than char *, or if foo were a global
+ // variable, the array would have static storage duration. But it is
+ // probably safest just to avoid the use of array compound literals in
+ // C++ code.
+ //
+ // Obey that rule by checking constness for converted array types.
+ const Descriptor *Desc = Ptr.getFieldDesc();
+ if (const auto *CLE =
+ dyn_cast_if_present<CompoundLiteralExpr>(Desc->asExpr())) {
+ if (QualType CLETy = CLE->getType();
+ CLETy->isArrayType() && !CLETy.isConstant(S.getASTContext())) {
+ S.FFDiag(S.Current->getLocation(OpPC),
+ diag::note_invalid_subexpr_in_const_expr)
+ << S.Current->getRange(OpPC);
+ S.Note(CLE->getExprLoc(), diag::note_declared_at);
+ return false;
+ }
+ }
+ }
return true;
}
diff --git a/clang/test/SemaTemplate/constexpr-instantiate.cpp b/clang/test/SemaTemplate/constexpr-instantiate.cpp
index 0a34f63553aae..31723344c4840 100644
--- a/clang/test/SemaTemplate/constexpr-instantiate.cpp
+++ b/clang/test/SemaTemplate/constexpr-instantiate.cpp
@@ -1,4 +1,5 @@
// RUN: %clang_cc1 -std=c++11 -verify %s
+// RUN: %clang_cc1 -std=c++11 -verify %s -fexperimental-new-constant-interpreter
namespace UseBeforeDefinition {
struct A {
More information about the cfe-commits
mailing list