PR middle-end/97861 - ICE on an invalid redeclaration of a function with attribute...
authorMartin Sebor <msebor@redhat.com>
Fri, 20 Nov 2020 21:35:25 +0000 (14:35 -0700)
committerMartin Sebor <msebor@redhat.com>
Fri, 20 Nov 2020 21:35:25 +0000 (14:35 -0700)
gcc/c-family/ChangeLog:
* c-warn.c (warn_parm_array_mismatch): Bail on invalid redeclarations
with fewer arguments.

gcc/testsuite/ChangeLog:
* gcc.dg/attr-access-4.c: New test.

gcc/c-family/c-warn.c
gcc/testsuite/gcc.dg/attr-access-4.c [new file with mode: 0644]

index 6d1f9a73e4489640b4becbae09e1e6a91a7a6de6..6d22a113ad0acc3b10258be14ec9355e3b6473e8 100644 (file)
@@ -3374,18 +3374,20 @@ warn_parm_array_mismatch (location_t origloc, tree fndecl, tree newparms)
   for (tree curp = curparms, newp = newparms; curp;
        curp = TREE_CHAIN (curp), newp = TREE_CHAIN (newp), ++parmpos)
     {
+      if (!newp)
+       /* Bail on invalid redeclarations with fewer arguments.  */
+       return;
+
       /* Only check pointers and C++ references.  */
       tree newptype = TREE_TYPE (newp);
       if (!POINTER_TYPE_P (newptype))
        continue;
 
-      {
-       /* Skip mismatches in __builtin_va_list that is commonly
-          an array but that in declarations of built-ins decays
-          to a pointer.  */
-       if (builtin && TREE_TYPE (newptype) == TREE_TYPE (va_list_type_node))
-         continue;
-      }
+      /* Skip mismatches in __builtin_va_list that is commonly
+        an array but that in declarations of built-ins decays
+        to a pointer.  */
+      if (builtin && TREE_TYPE (newptype) == TREE_TYPE (va_list_type_node))
+       continue;
 
       /* Access specs for the argument on the current (previous) and
         new (to replace the current) declarations.  Either may be null,
diff --git a/gcc/testsuite/gcc.dg/attr-access-4.c b/gcc/testsuite/gcc.dg/attr-access-4.c
new file mode 100644 (file)
index 0000000..7a2870a
--- /dev/null
@@ -0,0 +1,8 @@
+/* PR middle-end/97861 - ICE on an invalid redeclaration of a function
+   with attribute access
+   { dg-do compile }
+   { dg-options "-Wall" } */
+
+__attribute__ ((access (read_only, 2)))
+void f (int, int*);
+void f (int a) { }  // { dg-error "conflicting types for 'f'" }