PR c/97413 - bogus error on function declaration with many VLA arguments
authorMartin Sebor <msebor@redhat.com>
Wed, 14 Oct 2020 21:18:19 +0000 (15:18 -0600)
committerMartin Sebor <msebor@redhat.com>
Wed, 14 Oct 2020 21:18:19 +0000 (15:18 -0600)
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
gcc/c-family/c-attribs.c
gcc/testsuite/gcc.dg/Wvla-parameter-8.c [new file with mode: 0644]

index 94b9e02699fbdad4e448c84dad6bcc445c6004c7..3bdb2ffda8186348ebff89f49ea02f69841379a3 100644 (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)
index c779d13f02308d85850ceb3bc8545b2e0a33c92a..8283e959c8962b0fd90b8a08e11b9e67b2e917ad 100644 (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
diff --git a/gcc/testsuite/gcc.dg/Wvla-parameter-8.c b/gcc/testsuite/gcc.dg/Wvla-parameter-8.c
new file mode 100644 (file)
index 0000000..69e10f7
--- /dev/null
@@ -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);
+}