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:
parent
30d06b7d30
commit
34efa5c2a8
3 changed files with 97 additions and 4 deletions
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
86
gcc/testsuite/gcc.dg/Wvla-parameter-8.c
Normal file
86
gcc/testsuite/gcc.dg/Wvla-parameter-8.c
Normal 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);
|
||||
}
|
Loading…
Add table
Reference in a new issue