From 34efa5c2a84a8c7c7beb855dec24a321eebcbd6b Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Wed, 14 Oct 2020 15:18:19 -0600 Subject: [PATCH] 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. --- gcc/attribs.c | 2 + gcc/c-family/c-attribs.c | 13 +++-- gcc/testsuite/gcc.dg/Wvla-parameter-8.c | 86 +++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/Wvla-parameter-8.c 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 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 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); +} -- 2.7.4