Am Freitag, dem 27.02.2026 um 19:40 +0100 schrieb David Brown:
> On 27/02/2026 18:51, Martin Uecker via Gcc wrote:
> > Am Freitag, dem 27.02.2026 um 12:42 -0500 schrieb Yair Lenga via Gcc:
> > > Greetings!
> > >
> > > I'm happy to see discussion (including opposing/disagreeing opinions
> > > !) on my proposal.
> > >
> > > Wanted to cover one of the side-item in separate email - specifically
> > > keeping -Wvla-larger-than not impacted by the proposed [[gnu::vla]]
> > >
> > > In my projects, we use -Wvla and -Wvla-larger-than=512000 (~1MB, given
>
> 512000 bytes is about half a MB, surely?
>
> > > each of our threads is configured for 5MB thread. This is the same
> > > setting we for frame-larger-than.
> > >
> > > Common scenario we have is:
> > >
> > > // In header.h
> > > #define MAX_POINTS 25000
> > >
> > > // In code
> > > int foo(void)
> > > {
> > > int n = MAX_POINTS ;
> > > ALLOW_VLA(int v[n+1] ) ; // ALLOW_VLA uses Pragma to ignore
> > > -Wvla
> > > }
> > >
> > > The "ALLOW_VLA" indicate that the usage was reviewed - and approved.
> >
> > Out of curiosity, what would are the criteria for this being allowed
> > or not? Or in other words, what is the actual use case you are
> > trying to address?
> >
> > BTW: this code would always cause a warning with -Wvla-larger-than=, so
> > I assume it actually looks a bit different.
> >
>
> No, it does not trigger a warning with those values. (It will if
> someone changes MAX_POINTS to 250000, but that's the point of the
> -Wvla-larger-than=512000.)
You are right, thank you. I was somehow confusing this with
something else.
>
>
> <https://godbolt.org/z/xPo7ocWfr>
>
>
> One thing I have noticed about all this is the weird error messages.
> With the code "foo" above, but the -Wvla warning enabled, the error
> message is :
>
> """
> warning: ISO C90 forbids variable length array 'v' [-Wla]
> """
>
> That is despite using -std=c23.
>
> Even stranger, it changes when using "const int n = MAX_POINTS;" (in
> code like this, "n" should be declared "const") :
>
> """
> warning: ISO C90 forbids array 'v' whose size cannot be evaluated [-Wla]
> """
>
> The same warning is given if "const int n = MAX_POINTS;" is moved to
> file-scope - even though that requires that the initialiser for "n" can
> not only be evaluated, but must be a constant expression and the
> compiler knows the value of "n" can never be changed (without UB).
>
>
>
> So there is scope for improvement on the wording of the warnings here!
I agree. Do you have a suggestion?
Martin
>
>
>
> With C23, it would (IMHO) be more natural to use "constexpr int" rather
> than #define for MAX_POINTS and also for the "n", rendering the array
> "v" a normal array rather than a VLA. Prior to C23, my preference for
> these kinds of values is "enum { MAX_POINTS = 25000 };" and perhaps even
> "enum { n = MAX_POINTS };" - again, that gives normal C arrays and not VLAs.
>
> I am at a loss to understand why someone would want to make the VLA
> stand out here and be covered by a warning, when slight changes to the
> definition of "n" give the same effects but with a normal C array.
>
> David
>
>
>
> > Martin
> >
> >
> > > Common issue that we have is that the header.h is modified -> #define
> > > MAX_POINTS 250000. The compiler does not warn on the VLA use - because
> > > we tagged it safe. Keeping -Wvla-larger-than=500KB allow us to be
> > > notified when of places where VLA usage is valid, but exceeds the
> > > threshold.
> > >
> > > Hope this use case is clean - and explain why I believe
> > > -Wvla-larger-than should NOT be impacted with the proposed [[gnu::lva]
> > >
> > > Regards,
> > > Yair
> >