llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: None (llvmbot)

<details>
<summary>Changes</summary>

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;
+}

``````````

</details>


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

Reply via email to