diff options
author | Martin Sebor <msebor@redhat.com> | 2020-10-14 15:18:19 -0600 |
---|---|---|
committer | Martin Sebor <msebor@redhat.com> | 2020-10-14 15:18:19 -0600 |
commit | 34efa5c2a84a8c7c7beb855dec24a321eebcbd6b (patch) | |
tree | b89ec4413e427a639d87da436bb0efa97626a70d /gcc | |
parent | 30d06b7d30792bc621202af2099c21fc24157856 (diff) | |
download | gcc-34efa5c2a84a8c7c7beb855dec24a321eebcbd6b.zip gcc-34efa5c2a84a8c7c7beb855dec24a321eebcbd6b.tar.gz gcc-34efa5c2a84a8c7c7beb855dec24a321eebcbd6b.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/attribs.c | 2 | ||||
-rw-r--r-- | gcc/c-family/c-attribs.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/Wvla-parameter-8.c | 86 |
3 files changed, 97 insertions, 4 deletions
diff --git a/gcc/attribs.c b/gcc/attribs.c index 94b9e02..3bdb2ff 100644 --- a/gcc/attribs.c +++ b/gcc/attribs.c @@ -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) diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c index c779d13..8283e95 100644 --- a/gcc/c-family/c-attribs.c +++ b/gcc/c-family/c-attribs.c @@ -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 diff --git a/gcc/testsuite/gcc.dg/Wvla-parameter-8.c b/gcc/testsuite/gcc.dg/Wvla-parameter-8.c new file mode 100644 index 0000000..69e10f7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wvla-parameter-8.c @@ -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); +} |