On Sat, May 30, 2026 at 11:20:45PM +0200, Martin Uecker wrote:
> Bootstrapped and regression tested on x86_64.
>
> c: fix false positive for -Wvla-parameter [PR98539]
>
> In case of VLAs tat are multi-dimensional arrays with unspecified sizes,
> the test in the warning code did not work correctly. Fix this by
> explicitely checking that there are specified or unspecified size
> expressions to determine the presence of a VLA.
>
> PR c/98539
>
> gcc/c-family/ChangeLog:
> * c-warn.cc (warn_parm_array_mismatch): Check number of size
> expressions.
>
> gcc/testsuite/ChangeLog:
> + gcc.dg/pr98539.c: New test.
>
> diff --git a/gcc/c-family/c-warn.cc b/gcc/c-family/c-warn.cc
> index 07d15c0b09c..76cbc8d7366 100644
> --- a/gcc/c-family/c-warn.cc
> +++ b/gcc/c-family/c-warn.cc
> @@ -3479,9 +3479,22 @@ warn_parm_array_mismatch (location_t origloc, rdwr_map
> *cur_idx,
> cura->ptrarg = parmpos;
> }
>
> +
> + unsigned newbnds = 0;
> + unsigned newunspec = 0;
> +
> + if (newa->internal_p)
> + newbnds = newa->vla_bounds (&newunspec) + newunspec;
> +
> + unsigned curbnds = 0;
> + unsigned curunspec = 0;
> +
> + if (cura->internal_p)
> + curbnds = cura->vla_bounds (&curunspec) + curunspec;
Isn't this and the earlier line compile time UB (one + operand
modifying {new,cur}unspec variable, another one reading it,
so different result between
{
unsigned tmp = curunspec;
curbnds = cura->vla_bounds (&curunspec) + tmp;
}
and
{
unsigned tmp = cura->vla_bounds (&curunspec);
curbnds = tmp + curunspec;
}
?
So, shouldn't that be
{
curbnds = cura->vla_bounds (&curunspec);
curbnds += curunspec;
}
?
Jakub