[clang] [C23] Fix compound literals within function prototype (PR #132097)

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Wed Mar 19 14:46:00 PDT 2025


================
@@ -849,13 +849,11 @@ namespace CompoundLiterals {
   }
   static_assert(get5() == 5, "");
 
-  constexpr int get6(int f = (int[]){1,2,6}[2]) { // ref-note {{subexpression not valid in a constant expression}} \
-                                                  // ref-note {{declared here}}
+  constexpr int get6(int f = (int[]){1,2,6}[2]) {
----------------
AaronBallman wrote:

Thanks, I'll add more tests.

> `constinit int* a1 = f(); // error: pointer points to local variable`

Yes, this should fail (and it does).

> `constexpr int f2(int *x, int (*y)[*(x=(int[]){1,2,3})]) {`

You are a bad person who should feel bad. :-D I do think that should evaluate to 1 (but only when calling `f2(0)`), but that's a pile of VLA code which we don't always handle well, especially in C++. I think a non-VLA example that's similar would be:
```
  constexpr int f2(int *x =(int[]){1,2,3}) {
    return x[0];
  }
  constexpr int g = f2(); // Should evaluate to 1?
  static_assert(g == 1, "");
```
which does behave how you'd expect.

The VLA example says `object backing the pointer x will be destroyed at the end of the full-expression` which may be a C++'ism not impacted by the C wording?


https://github.com/llvm/llvm-project/pull/132097


More information about the cfe-commits mailing list