[clang] 977d8a4 - [clang][Sema] Fixed Compound Literal is not Constant Expression (#143852)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 17 06:20:45 PDT 2025
Author: Vincent
Date: 2025-06-17T09:20:41-04:00
New Revision: 977d8a4bcd83797217433709201922b9deb97ae2
URL: https://github.com/llvm/llvm-project/commit/977d8a4bcd83797217433709201922b9deb97ae2
DIFF: https://github.com/llvm/llvm-project/commit/977d8a4bcd83797217433709201922b9deb97ae2.diff
LOG: [clang][Sema] Fixed Compound Literal is not Constant Expression (#143852)
Added a check for a compound literal hiding inside a function.
fixes #87867
Added:
clang/test/Sema/gh87867.c
Modified:
clang/docs/ReleaseNotes.rst
clang/include/clang/Sema/Scope.h
clang/lib/Sema/SemaExpr.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 03641f5d0ea0d..6f28dbd03ca2a 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -692,6 +692,8 @@ Bug Fixes in This Version
``#include`` directive. (#GH138094)
- Fixed a crash during constant evaluation involving invalid lambda captures
(#GH138832)
+- Fixed compound literal is not constant expression inside initializer list
+ (#GH87867)
- Fixed a crash when instantiating an invalid dependent friend template specialization.
(#GH139052)
- Fixed a crash with an invalid member function parameter list with a default
diff --git a/clang/include/clang/Sema/Scope.h b/clang/include/clang/Sema/Scope.h
index ad12a3d73413b..07b9e1bc10f5a 100644
--- a/clang/include/clang/Sema/Scope.h
+++ b/clang/include/clang/Sema/Scope.h
@@ -427,6 +427,17 @@ class Scope {
return false;
}
+ /// isInObjcMethodScope - Return true if this scope is, or is contained, in an
+ /// C function body.
+ bool isInCFunctionScope() const {
+ for (const Scope *S = this; S; S = S->getParent()) {
+ if (S->isFunctionScope())
+ return true;
+ }
+
+ return false;
+ }
+
/// isInObjcMethodScope - Return true if this scope is, or is contained in, an
/// Objective-C method body. Note that this method is not constant time.
bool isInObjcMethodScope() const {
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 413eff4aa294a..ebc43157d4c2b 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -7176,6 +7176,7 @@ Sema::BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo,
// void func(char *para[(int [1]){ 0 }[0]);
const Scope *S = getCurScope();
bool IsFileScope = !CurContext->isFunctionOrMethod() &&
+ !S->isInCFunctionScope() &&
(!S || !S->isFunctionPrototypeScope());
// In C, compound literals are l-values for some reason.
diff --git a/clang/test/Sema/gh87867.c b/clang/test/Sema/gh87867.c
new file mode 100644
index 0000000000000..0568c734424ca
--- /dev/null
+++ b/clang/test/Sema/gh87867.c
@@ -0,0 +1,33 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c23 %s
+
+// Compound literal doesn't need a constant expression inside a initializer-list if it is already inside a function
+// see: https://github.com/llvm/llvm-project/issues/87867
+int foo(int *a, int b) {
+ return 0;
+}
+
+int x;
+struct{int t;} a = (struct {
+ typeof(foo(&(struct { int t; }){.t = x}.t, 0)) t; // expected-error {{initializer element is not a compile-time constant}}
+}){0};
+
+void inside_a_func(){
+ int x;
+ (void)(struct {
+ typeof(foo(&(struct { int t; }){.t = x}.t, 0)) t;
+ }){0};
+}
+
+// see: https://github.com/llvm/llvm-project/issues/143613
+#define bitcast(type, value) \
+ (((union{ typeof(value) src; type dst; }){ (value) }).dst)
+
+double placeholder = 10.0;
+double bar = bitcast(double, placeholder); // expected-error {{initializer element is not a compile-time constant}}
+
+int main(void)
+{
+ int foo = 4;
+ foo = bitcast(int, bitcast(double, foo));
+ return 0;
+}
More information about the cfe-commits
mailing list