================
@@ -4522,6 +4523,38 @@ static CompleteObject findCompleteObject(EvalInfo &Info, 
const Expr *E,
 
         BaseVal = MTE->getOrCreateValue(false);
         assert(BaseVal && "got reference to unevaluated temporary");
+      } else if (const CompoundLiteralExpr *CLE =
+                     dyn_cast_or_null<CompoundLiteralExpr>(Base)) {
+        // In C99, a CompoundLiteralExpr is an lvalue, and we defer evaluating
+        // the initializer until now for such expressions. Such an expression
+        // can't be an ICE in C, so this only matters for fold.
+        if (LValType.isVolatileQualified()) {
+          Info.FFDiag(E);
+          return CompleteObject();
+        }
+
+        // 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.
+        if (QualType CLETy = CLE->getType(); CLETy->isArrayType() &&
+                                             !LValType->isArrayType() &&
----------------
kadircet wrote:

oops, I was looking at the wrong terminal, we do have failures without this:
```
********************
FAIL: Clang :: SemaCXX/constant-expression-cxx11.cpp (3207 of 22469)
******************** TEST 'Clang :: SemaCXX/constant-expression-cxx11.cpp' 
FAILED ********************
Exit Code: 1

Command Output (stderr):
--
/usr/local/google/home/kadircet/repos/llvm/build/bin/clang -cc1 
-internal-isystem 
/usr/local/google/home/kadircet/repos/llvm/build/lib/clang/21/include 
-nostdsysteminc -std=c++23 -isystem 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaCXX/Inputs 
-fsyntax-only -verify=expected,cxx20_23,cxx23              -triple x86_64-linux 
-Wno-string-plus-int -Wno-pointer-arith -Wno-zero-length-array 
-Wno-c99-designator -fcxx-exceptions -pedantic 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaCXX/constant-expression-cxx11.cpp
 -Wno-comment -Wno-tautological-pointer-compare -Wno-bool-conversion # RUN: at 
line 1
+ /usr/local/google/home/kadircet/repos/llvm/build/bin/clang -cc1 
-internal-isystem 
/usr/local/google/home/kadircet/repos/llvm/build/lib/clang/21/include 
-nostdsysteminc -std=c++23 -isystem 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaCXX/Inputs 
-fsyntax-only -verify=expected,cxx20_23,cxx23 -triple x86_64-linux 
-Wno-string-plus-int -Wno-pointer-arith -Wno-zero-length-array 
-Wno-c99-designator -fcxx-exceptions -pedantic 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaCXX/constant-expression-cxx11.cpp
 -Wno-comment -Wno-tautological-pointer-compare -Wno-bool-conversion
error: diagnostics with 'error' severity expected but not seen:
  File 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaCXX/constant-expression-cxx11.cpp
 Line 1670 'expected-error': static assertion expression is not an integral 
constant expression
  File 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaCXX/constant-expression-cxx11.cpp
 Line 1673 (directive at 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaCXX/constant-expression-cxx11.cpp:1674)
 'expected-error': static assertion expression is not an integral constant 
expression
error: diagnostics with 'note' severity expected but not seen:
  File 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaCXX/constant-expression-cxx11.cpp
 Line 1670 (directive at 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaCXX/constant-expression-cxx11.cpp:1671)
 'expected-note': subexpression not valid
  File 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaCXX/constant-expression-cxx11.cpp
 Line 1669 (directive at 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaCXX/constant-expression-cxx11.cpp:1672)
 'expected-note': declared here
  File 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaCXX/constant-expression-cxx11.cpp
 Line 1673 (directive at 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaCXX/constant-expression-cxx11.cpp:1675)
 'expected-note': subexpression not valid
  File 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaCXX/constant-expression-cxx11.cpp
 Line 1673 (directive at 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaCXX/constant-expression-cxx11.cpp:1676)
 'expected-note': declared here
6 errors generated.

--

********************
FAIL: Clang :: SemaTemplate/constexpr-instantiate.cpp (13593 of 22469)
******************** TEST 'Clang :: SemaTemplate/constexpr-instantiate.cpp' 
FAILED ********************
Exit Code: 1

Command Output (stderr):
--
/usr/local/google/home/kadircet/repos/llvm/build/bin/clang -cc1 
-internal-isystem 
/usr/local/google/home/kadircet/repos/llvm/build/lib/clang/21/include 
-nostdsysteminc -std=c++11 -verify 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaTemplate/constexpr-instantiate.cpp
 # RUN: at line 1
+ /usr/local/google/home/kadircet/repos/llvm/build/bin/clang -cc1 
-internal-isystem 
/usr/local/google/home/kadircet/repos/llvm/build/lib/clang/21/include 
-nostdsysteminc -std=c++11 -verify 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaTemplate/constexpr-instantiate.cpp
error: 'expected-error' diagnostics expected but not seen:
  File 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaTemplate/constexpr-instantiate.cpp
 Line 222 (directive at 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaTemplate/constexpr-instantiate.cpp:223):
 must be initialized by a constant expression
  File 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaTemplate/constexpr-instantiate.cpp
 Line 236: narrow
error: 'expected-note' diagnostics expected but not seen:
  File 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaTemplate/constexpr-instantiate.cpp
 Line 222: not valid in a constant expression
  File 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaTemplate/constexpr-instantiate.cpp
 Line 222: declared here
  File 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaTemplate/constexpr-instantiate.cpp
 Line 236: instantiation of
  File 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaTemplate/constexpr-instantiate.cpp
 Line 236: cast
  File 
/usr/local/google/home/kadircet/repos/llvm/clang/test/SemaTemplate/constexpr-instantiate.cpp
 Line 237: instantiation of
7 errors generated.

--

********************
```

https://github.com/llvm/llvm-project/pull/137163
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to