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

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 20 04:48:22 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:

> With the VLA example, there are a few different weird interactions here... but the primary silly thing I'm doing is abusing VLAs to modify argument values.

Yeah, which we already seem to get wrong: https://godbolt.org/z/Y4xEGWhM3

> On top of that, we have to consider the question of the lifetime of compound literals defined inside the array bound.

I think that's what `object backing the pointer x will be destroyed at the end of the full-expression` is about in your previous VLA example. There is an `ExprWithCleanups` node for the assignment operator and that is a `FullExpr`. So I think we do get that correct -- I'll add it as a test case with comments explaining why it's rejected.

> But maybe we should just reject this sort of thing in C++ more aggressively, like gcc does, so we don't have to figure out all these weird cases.

I tend to agree we should be far more restrictive with VLAs in C++ than we are today. But I also think that's a different PR than this one. WDYT?

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


More information about the cfe-commits mailing list