[llvm-branch-commits] [clang] release/22.x: [clang][c23] Avoid assertion on an invalid static constexpr variable (#175927) (PR #175960)

2026-01-15 Thread Cullen Rhodes via llvm-branch-commits

https://github.com/c-rhodes closed 
https://github.com/llvm/llvm-project/pull/175960
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] release/22.x: [clang][c23] Avoid assertion on an invalid static constexpr variable (#175927) (PR #175960)

2026-01-15 Thread Cullen Rhodes via llvm-branch-commits

c-rhodes wrote:

merged 967834a63c0f2c35f974c202aaf0157be253dfc5

https://github.com/llvm/llvm-project/pull/175960
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] release/22.x: [clang][c23] Avoid assertion on an invalid static constexpr variable (#175927) (PR #175960)

2026-01-14 Thread Aaron Ballman via llvm-branch-commits

https://github.com/AaronBallman approved this pull request.

LGTM for backporting

https://github.com/llvm/llvm-project/pull/175960
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] release/22.x: [clang][c23] Avoid assertion on an invalid static constexpr variable (#175927) (PR #175960)

2026-01-14 Thread via llvm-branch-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: None (llvmbot)


Changes

Backport 5b0270cb72f707f55e2ff5e97fc938afb3b81053

Requested by: @Fznamznon

---
Full diff: https://github.com/llvm/llvm-project/pull/175960.diff


2 Files Affected:

- (modified) clang/lib/Sema/SemaDecl.cpp (+4-1) 
- (modified) clang/test/Sema/constexpr.c (+8) 


``diff
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index f9580b34aaec6..d67220a2f170d 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -14156,7 +14156,10 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr 
*Init, bool DirectInit) {
 // C99 6.7.8p4: All the expressions in an initializer for an object that 
has
 // static storage duration shall be constant expressions or string 
literals.
 } else if (VDecl->getStorageClass() == SC_Static) {
-  CheckForConstantInitializer(Init);
+  // Avoid evaluating the initializer twice for constexpr variables. It 
will
+  // be evaluated later.
+  if (!VDecl->isConstexpr())
+CheckForConstantInitializer(Init);
 
   // C89 is stricter than C99 for aggregate initializers.
   // C89 6.5.7p3: All the expressions [...] in an initializer list
diff --git a/clang/test/Sema/constexpr.c b/clang/test/Sema/constexpr.c
index b5b62863cfdad..ae01c71e09b06 100644
--- a/clang/test/Sema/constexpr.c
+++ b/clang/test/Sema/constexpr.c
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -std=c23 -verify -triple x86_64 -pedantic -Wno-conversion 
-Wno-constant-conversion -Wno-div-by-zero %s
+// RUN: %clang_cc1 -std=c23 -verify -triple x86_64 -pedantic -Wno-conversion 
-Wno-constant-conversion -Wno-div-by-zero 
-fexperimental-new-constant-interpreter %s
 
 // Check that constexpr only applies to variables.
 constexpr void f0() {} // expected-error {{'constexpr' can only be used in 
variable declarations}}
@@ -416,3 +417,10 @@ void gh173847_test() {
   constexpr double d_const = gh173847_double(2.0); // 
expected-error {{constexpr variable 'd_const' must be initialized by a constant 
expression}}
   constexpr long double ld_const = gh173847_long_double(2.0L); // 
expected-error {{constexpr variable 'ld_const' must be initialized by a 
constant expression}}
 }
+
+int gh173605(int x) {
+  static constexpr int c = c; // expected-error {{constexpr variable 'c' must 
be initialized by a constant expression}}\
+  // expected-note {{read of object outside its 
lifetime is not allowed in a constant expression}}
+  static int justincase = justincase; // expected-error {{initializer element 
is not a compile-time constant}}
+  return x;
+}

``




https://github.com/llvm/llvm-project/pull/175960
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] release/22.x: [clang][c23] Avoid assertion on an invalid static constexpr variable (#175927) (PR #175960)

2026-01-14 Thread via llvm-branch-commits

https://github.com/llvmbot created 
https://github.com/llvm/llvm-project/pull/175960

Backport 5b0270cb72f707f55e2ff5e97fc938afb3b81053

Requested by: @Fznamznon

>From 37a2056adf2f39227c482d5a5ef856bd1501d4d0 Mon Sep 17 00:00:00 2001
From: Mariya Podchishchaeva 
Date: Wed, 14 Jan 2026 15:37:53 +0100
Subject: [PATCH] [clang][c23] Avoid assertion on an invalid static constexpr
 variable (#175927)

In C static variables should have constant expressions in initializers
so we were checking this twice for constexpr variables and failing with
an assertion that was makes sure we don't do it.
This patch postpones the check just like it is done for file
scope constexpr variables in C already.

Fixes https://github.com/llvm/llvm-project/issues/173605

(cherry picked from commit 5b0270cb72f707f55e2ff5e97fc938afb3b81053)
---
 clang/lib/Sema/SemaDecl.cpp | 5 -
 clang/test/Sema/constexpr.c | 8 
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index f9580b34aaec6..d67220a2f170d 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -14156,7 +14156,10 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr 
*Init, bool DirectInit) {
 // C99 6.7.8p4: All the expressions in an initializer for an object that 
has
 // static storage duration shall be constant expressions or string 
literals.
 } else if (VDecl->getStorageClass() == SC_Static) {
-  CheckForConstantInitializer(Init);
+  // Avoid evaluating the initializer twice for constexpr variables. It 
will
+  // be evaluated later.
+  if (!VDecl->isConstexpr())
+CheckForConstantInitializer(Init);
 
   // C89 is stricter than C99 for aggregate initializers.
   // C89 6.5.7p3: All the expressions [...] in an initializer list
diff --git a/clang/test/Sema/constexpr.c b/clang/test/Sema/constexpr.c
index b5b62863cfdad..ae01c71e09b06 100644
--- a/clang/test/Sema/constexpr.c
+++ b/clang/test/Sema/constexpr.c
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -std=c23 -verify -triple x86_64 -pedantic -Wno-conversion 
-Wno-constant-conversion -Wno-div-by-zero %s
+// RUN: %clang_cc1 -std=c23 -verify -triple x86_64 -pedantic -Wno-conversion 
-Wno-constant-conversion -Wno-div-by-zero 
-fexperimental-new-constant-interpreter %s
 
 // Check that constexpr only applies to variables.
 constexpr void f0() {} // expected-error {{'constexpr' can only be used in 
variable declarations}}
@@ -416,3 +417,10 @@ void gh173847_test() {
   constexpr double d_const = gh173847_double(2.0); // 
expected-error {{constexpr variable 'd_const' must be initialized by a constant 
expression}}
   constexpr long double ld_const = gh173847_long_double(2.0L); // 
expected-error {{constexpr variable 'ld_const' must be initialized by a 
constant expression}}
 }
+
+int gh173605(int x) {
+  static constexpr int c = c; // expected-error {{constexpr variable 'c' must 
be initialized by a constant expression}}\
+  // expected-note {{read of object outside its 
lifetime is not allowed in a constant expression}}
+  static int justincase = justincase; // expected-error {{initializer element 
is not a compile-time constant}}
+  return x;
+}

___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] release/22.x: [clang][c23] Avoid assertion on an invalid static constexpr variable (#175927) (PR #175960)

2026-01-14 Thread via llvm-branch-commits

llvmbot wrote:

@a-tarasyuk What do you think about merging this PR to the release branch?

https://github.com/llvm/llvm-project/pull/175960
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [clang] release/22.x: [clang][c23] Avoid assertion on an invalid static constexpr variable (#175927) (PR #175960)

2026-01-14 Thread via llvm-branch-commits

https://github.com/llvmbot milestoned 
https://github.com/llvm/llvm-project/pull/175960
___
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits