c: Less warnings for parameters declared as arrays [PR98536]
To avoid false positivies, tune the warnings for parameters declared as arrays with size expressions. Do not warn when more bounds are specified in the declaration than before. PR c/98536 gcc/c-family/: * c-warn.cc (warn_parm_array_mismatch): Do not warn if more bounds are specified. gcc/testsuite: * gcc.dg/Wvla-parameter-4.c: Adapt test. * gcc.dg/attr-access-2.c: Adapt test.
This commit is contained in:
parent
54be338589
commit
39f413fc4b
3 changed files with 3 additions and 32 deletions
|
@ -3599,23 +3599,13 @@ warn_parm_array_mismatch (location_t origloc, tree fndecl, tree newparms)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (newunspec != curunspec)
|
||||
if (newunspec > curunspec)
|
||||
{
|
||||
location_t warnloc = newloc, noteloc = origloc;
|
||||
const char *warnparmstr = newparmstr.c_str ();
|
||||
const char *noteparmstr = curparmstr.c_str ();
|
||||
unsigned warnunspec = newunspec, noteunspec = curunspec;
|
||||
|
||||
if (newunspec < curunspec)
|
||||
{
|
||||
/* If the new declaration has fewer unspecified bounds
|
||||
point the warning to the previous declaration to make
|
||||
it clear that that's the one to change. Otherwise,
|
||||
point it to the new decl. */
|
||||
std::swap (warnloc, noteloc);
|
||||
std::swap (warnparmstr, noteparmstr);
|
||||
std::swap (warnunspec, noteunspec);
|
||||
}
|
||||
if (warning_n (warnloc, OPT_Wvla_parameter, warnunspec,
|
||||
"argument %u of type %s declared with "
|
||||
"%u unspecified variable bound",
|
||||
|
@ -3643,14 +3633,10 @@ warn_parm_array_mismatch (location_t origloc, tree fndecl, tree newparms)
|
|||
}
|
||||
|
||||
/* Iterate over the lists of VLA variable bounds, comparing each
|
||||
pair for equality, and diagnosing mismatches. The case of
|
||||
the lists having different lengths is handled above so at
|
||||
this point they do . */
|
||||
for (tree newvbl = newa->size, curvbl = cura->size; newvbl;
|
||||
pair for equality, and diagnosing mismatches. */
|
||||
for (tree newvbl = newa->size, curvbl = cura->size; newvbl && curvbl;
|
||||
newvbl = TREE_CHAIN (newvbl), curvbl = TREE_CHAIN (curvbl))
|
||||
{
|
||||
gcc_assert (curvbl);
|
||||
|
||||
tree newpos = TREE_PURPOSE (newvbl);
|
||||
tree curpos = TREE_PURPOSE (curvbl);
|
||||
|
||||
|
|
|
@ -12,11 +12,6 @@ typedef int IA3[3];
|
|||
/* Verify the warning points to the declaration with more unspecified
|
||||
bounds, guiding the user to specify them rather than making them all
|
||||
unspecified. */
|
||||
void* f_pIA3ax (IA3 *x[*]); // { dg-warning "argument 1 of type 'int \\\(\\\*\\\[\\\*]\\\)\\\[3]' .aka '\[^\n\r\}\]+'. declared with 1 unspecified variable bound" }
|
||||
void* f_pIA3ax (IA3 *x[*]);
|
||||
void* f_pIA3ax (IA3 *x[n]); // { dg-message "subsequently declared as 'int \\\(\\\*\\\[n]\\\)\\\[3]' with 0 unspecified variable bounds" "note" }
|
||||
void* f_pIA3ax (IA3 *x[n]) { return x; }
|
||||
|
||||
|
||||
void* f_pIA3an (IA3 *x[n]); // { dg-message "previously declared as 'int \\\(\\\*\\\[n]\\\)\\\[3]' with 0 unspecified variable bounds" "note" }
|
||||
void* f_pIA3an (IA3 *x[n]);
|
||||
|
|
|
@ -60,16 +60,6 @@ RW (2, 1) void f10 (int n, char a[n]) // { dg-warning "attribute 'access *\\\(
|
|||
// { dg-warning "argument 2 of type 'char\\\[n]' declared as a variable length array" "" { target *-*-* } .-1 }
|
||||
{ (void)&n; (void)&a; }
|
||||
|
||||
|
||||
/* The following is diagnosed to point out declarations with the T[*]
|
||||
form in headers where specifying the bound is just as important as
|
||||
in the definition (to detect bugs). */
|
||||
void f11 (int, char[*]); // { dg-warning "argument 2 of type 'char\\\[\\\*\\\]' declared with 1 unspecified variable bound" }
|
||||
void f11 (int m, char a[m]); // { dg-message "subsequently declared as 'char\\\[m]' with 0 unspecified variable bounds" "note" }
|
||||
RW (2, 1) void f11 (int n, char arr[n]) // { dg-message "subsequently declared as 'char\\\[n]' with 0 unspecified variable bounds" "note" }
|
||||
{ (void)&n; (void)&arr; }
|
||||
|
||||
|
||||
/* Verify that redeclaring a function with attribute access applying
|
||||
to an array parameter of any form is not diagnosed. */
|
||||
void f12__ (int, int[]) RW (2, 1);
|
||||
|
|
Loading…
Add table
Reference in a new issue