================ @@ -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