[clang] [clang] Compound Literal Statement Constant Expression Assertion Fix (PR #139479)
via cfe-commits
cfe-commits at lists.llvm.org
Sun May 11 16:04:49 PDT 2025
https://github.com/Mr-Anyone created https://github.com/llvm/llvm-project/pull/139479
Compound literals initializer-list should be a constant expression if it is defined outside the body of a function.
Emit error instead of falling through tripping assertion error.
fixes #139160
>From 43bb454e741e74fe164f1988b3056a377b080269 Mon Sep 17 00:00:00 2001
From: Vincent <llvm at viceroygroup.ca>
Date: Sun, 11 May 2025 19:01:34 -0400
Subject: [PATCH] [clang] Compound Literal Statement Constant Expression
Assertion Fix
Compound literals initializer-list should be a constant expression if it is defined outside the body of a function.
Emit error instead of falling through tripping assertion error.
fixes #139160
---
clang/lib/Sema/SemaExpr.cpp | 11 +++++++++++
clang/test/SemaCXX/cxx2a-consteval.cpp | 22 ++++++++++++++++++++++
2 files changed, 33 insertions(+)
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index deb8d2edfc5c9..e06b6fc233fcc 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -7220,6 +7220,17 @@ Sema::BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo,
if (auto ILE = dyn_cast<InitListExpr>(LiteralExpr))
for (unsigned i = 0, j = ILE->getNumInits(); i != j; i++) {
Expr *Init = ILE->getInit(i);
+ // C99 6.5.2.5
+ // "If the compound literal occurs outside the body of a function, the
+ // initializer list shall consist of constant expressions."
+ if (!Init->isTypeDependent() && !Init->isValueDependent() &&
+ !Init->getType()->isDependentType())
+ if (!Init->isConstantInitializer(Context, false)) {
+ Diag(Init->getExprLoc(), diag::err_init_element_not_constant)
+ << Init->getSourceBitField();
+ return ExprError();
+ }
+
ILE->setInit(i, ConstantExpr::Create(Context, Init));
}
diff --git a/clang/test/SemaCXX/cxx2a-consteval.cpp b/clang/test/SemaCXX/cxx2a-consteval.cpp
index d9d144cafdbcc..d9932e4dd8241 100644
--- a/clang/test/SemaCXX/cxx2a-consteval.cpp
+++ b/clang/test/SemaCXX/cxx2a-consteval.cpp
@@ -1300,3 +1300,25 @@ void foo() {
}
}
+
+// https://github.com/llvm/llvm-project/issues/139160
+namespace GH139160{
+ // original test case taken from Github
+ struct A {int x[1]; };
+ A f(); // expected-note {{declared here}}
+ typedef int *t[];
+ consteval int* f(int* x) { return x; }
+
+ int ** x = (t){f(f().x)}; // expected-error {{call to consteval function 'GH139160::f' is not a constant expression}}
+ // expected-note at -1 {{non-constexpr function 'f' cannot be used in a constant expression}}
+ // expected-error at -2 {{initializer element is not a compile-time constant}}
+
+ struct B {int value, value_two;};
+ B make_struct() {return {10, 20};} // expected-note {{declared here}}
+ consteval int get_value(B container) {return container.value;}
+ B result = (B){10, get_value(make_struct())}; // expected-error {{initializer element is not a compile-time constant}}
+ // expected-error at -1 {{call to consteval function 'GH139160::get_value' is not a constant expression}}
+ // expected-note at -2 {{non-constexpr function 'make_struct' cannot be used in a constant expression}}
+};
+
+
More information about the cfe-commits
mailing list