PR c/97413 - bogus error on function declaration with many VLA arguments

gcc/ChangeLog:

	PR c/97413
	* attribs.c (init_attr_rdwr_indices): Unwrap extra list layer.

gcc/c-family/ChangeLog:

	PR c/97413
	* c-attribs.c (build_attr_access_from_parms): Wrap chain of VLA
	bounds in an extra list.

gcc/testsuite/ChangeLog:

	PR c/97413
	* gcc.dg/Wvla-parameter-8.c: New test.
This commit is contained in:
Martin Sebor 2020-10-14 15:18:19 -06:00
parent 30d06b7d30
commit 34efa5c2a8
3 changed files with 97 additions and 4 deletions

View file

@ -2049,6 +2049,8 @@ init_attr_rdwr_indices (rdwr_map *rwm, tree attrs)
/* The (optional) list of VLA bounds. */
tree vblist = TREE_CHAIN (mode);
if (vblist)
vblist = TREE_VALUE (vblist);
mode = TREE_VALUE (mode);
if (TREE_CODE (mode) != STRING_CST)

View file

@ -4547,10 +4547,11 @@ handle_access_attribute (tree node[3], tree name, tree args,
result in the following attribute access:
value: "+^2[*],$0$1^3[*],$1$1"
chain: <0, x> <1, y>
list: < <0, x> <1, y> >
where each <node> on the chain corresponds to one VLA bound for each
of the two parameters. */
where the list has a single value which itself is is a list each
of whose <node>s corresponds to one VLA bound for each of the two
parameters. */
tree
build_attr_access_from_parms (tree parms, bool skip_voidptr)
@ -4654,13 +4655,17 @@ build_attr_access_from_parms (tree parms, bool skip_voidptr)
if (!spec.length ())
return NULL_TREE;
/* Attribute access takes a two or three arguments. Wrap VBLIST in
another list in case it has more nodes than would otherwise fit. */
vblist = build_tree_list (NULL_TREE, vblist);
/* Build a single attribute access with the string describing all
array arguments and an optional list of any non-parameter VLA
bounds in order. */
tree str = build_string (spec.length (), spec.c_str ());
tree attrargs = tree_cons (NULL_TREE, str, vblist);
tree name = get_identifier ("access");
return tree_cons (name, attrargs, NULL_TREE);
return build_tree_list (name, attrargs);
}
/* Handle a "nothrow" attribute; arguments as in

View file

@ -0,0 +1,86 @@
/* PR c/97413 - bogus error on function declaration with many VLA arguments:
wrong number of arguments specified for 'access' attribute
{ dg-do compile }
{ dg-options "-Wall" } */
extern int n;
void f1 (int[n]);
void f2 (int[n], int[n]);
void f3 (int[n], int[n], int[n]);
void f4 (int[n], int[n], int[n], int[n]);
void f5 (int[n], int[n], int[n], int[n], int[n]);
void f6 (int[n], int[n], int[n], int[n], int[n], int[n]);
void f7 (int[n], int[n], int[n], int[n], int[n], int[n], int[n]);
void f8 (int[n], int[n], int[n], int[n], int[n], int[n], int[n], int[n]);
void f9 (int[n], int[n], int[n], int[n], int[n], int[n], int[n], int[n],
int[n]);
void f10 (int[n], int[n], int[n], int[n], int[n], int[n], int[n], int[n],
int[n], int[n]);
void f1 (int[n]);
void f2 (int[n], int[n]);
void f3 (int[n], int[n], int[n]);
void f4 (int[n], int[n], int[n], int[n]);
void f5 (int[n], int[n], int[n], int[n], int[n]);
void f6 (int[n], int[n], int[n], int[n], int[n], int[n]);
void f7 (int[n], int[n], int[n], int[n], int[n], int[n], int[n]);
void f8 (int[n], int[n], int[n], int[n], int[n], int[n], int[n], int[n]);
void f9 (int[n], int[n], int[n], int[n], int[n], int[n], int[n], int[n],
int[n]);
void f10 (int[n], int[n], int[n], int[n], int[n], int[n], int[n], int[n],
int[n], int[n]);
void g (int n)
{
typedef int A[n];
void g1 (A);
void g2 (A, A);
void g3 (A, A, A);
void g4 (A, A, A, A);
void g5 (A, A, A, A, A);
void g6 (A, A, A, A, A, A);
void g7 (A, A, A, A, A, A, A);
void g8 (A, A, A, A, A, A, A, A);
void g9 (A, A, A, A, A, A, A, A, A);
void g10 (A, A, A, A, A, A, A, A, A, A);
void g1 (A);
void g2 (A, A);
void g3 (A, A, A);
void g4 (A, A, A, A);
void g5 (A, A, A, A, A);
void g6 (A, A, A, A, A, A);
void g7 (A, A, A, A, A, A, A);
void g8 (A, A, A, A, A, A, A, A);
void g9 (A, A, A, A, A, A, A, A, A);
void g10 (A, A, A, A, A, A, A, A, A, A);
typedef int B[n][n + 1][n + 2][n + 3][n + 4][n + 5][n + 7];
void h1 (B);
void h2 (B, B);
void h3 (B, B, B);
void h4 (B, B, B, B);
void h5 (B, B, B, B, B);
void h6 (B, B, B, B, B, B);
void h7 (B, B, B, B, B, B, B);
void h8 (B, B, B, B, B, B, B, B);
void h9 (B, B, B, B, B, B, B, B, B);
void h10 (B, B, B, B, B, B, B, B, B, B);
void h1 (B);
void h2 (B, B);
void h3 (B, B, B);
void h4 (B, B, B, B);
void h5 (B, B, B, B, B);
void h6 (B, B, B, B, B, B);
void h7 (B, B, B, B, B, B, B);
void h8 (B, B, B, B, B, B, B, B);
void h9 (B, B, B, B, B, B, B, B, B);
void h10 (B, B, B, B, B, B, B, B, B, B);
}