]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c: Less warnings for parameters declared as arrays [PR98536]
authorMartin Uecker <uecker@tugraz.at>
Thu, 13 Apr 2023 17:35:15 +0000 (19:35 +0200)
committerMartin Uecker <uecker@tugraz.at>
Sat, 5 Aug 2023 16:09:58 +0000 (18:09 +0200)
To avoid false positivies, tune the warnings for parameters declared
as arrays with size expressions.  Do not warn when more bounds are
specified in the declaration than before.

PR c/98536

gcc/c-family/:
* c-warn.cc (warn_parm_array_mismatch): Do not warn if more
bounds are specified.

gcc/testsuite:
* gcc.dg/Wvla-parameter-4.c: Adapt test.
* gcc.dg/attr-access-2.c: Adapt test.

gcc/c-family/c-warn.cc
gcc/testsuite/gcc.dg/Wvla-parameter-4.c
gcc/testsuite/gcc.dg/attr-access-2.c

index d4d62c48b206fd7d7a5cdec1559768b6c4445fc9..b7c5d7c01a2632ec5359ead86cf9f812d699d0f0 100644 (file)
@@ -3599,23 +3599,13 @@ warn_parm_array_mismatch (location_t origloc, tree fndecl, tree newparms)
              continue;
            }
 
-         if (newunspec != curunspec)
+         if (newunspec > curunspec)
            {
              location_t warnloc = newloc, noteloc = origloc;
              const char *warnparmstr = newparmstr.c_str ();
              const char *noteparmstr = curparmstr.c_str ();
              unsigned warnunspec = newunspec, noteunspec = curunspec;
 
-             if (newunspec < curunspec)
-               {
-                 /* If the new declaration has fewer unspecified bounds
-                    point the warning to the previous declaration to make
-                    it clear that that's the one to change.  Otherwise,
-                    point it to the new decl.  */
-                 std::swap (warnloc, noteloc);
-                 std::swap (warnparmstr, noteparmstr);
-                 std::swap (warnunspec, noteunspec);
-               }
              if (warning_n (warnloc, OPT_Wvla_parameter, warnunspec,
                             "argument %u of type %s declared with "
                             "%u unspecified variable bound",
@@ -3643,14 +3633,10 @@ warn_parm_array_mismatch (location_t origloc, tree fndecl, tree newparms)
        }
 
       /* Iterate over the lists of VLA variable bounds, comparing each
-        pair for equality, and diagnosing mismatches.  The case of
-        the lists having different lengths is handled above so at
-        this point they do .  */
-      for (tree newvbl = newa->size, curvbl = cura->size; newvbl;
+        pair for equality, and diagnosing mismatches.  */
+      for (tree newvbl = newa->size, curvbl = cura->size; newvbl && curvbl;
           newvbl = TREE_CHAIN (newvbl), curvbl = TREE_CHAIN (curvbl))
        {
-         gcc_assert (curvbl);
-
          tree newpos = TREE_PURPOSE (newvbl);
          tree curpos = TREE_PURPOSE (curvbl);
 
index 599ad19a3e43b2715717716c2ecab4c3a8cb3936..f35faea361a9e6b68d20ce06f24e61e77aad5c01 100644 (file)
@@ -12,11 +12,6 @@ typedef int IA3[3];
 /* Verify the warning points to the declaration with more unspecified
    bounds, guiding the user to specify them rather than making them all
    unspecified.  */
-void* f_pIA3ax (IA3 *x[*]);             // { dg-warning "argument 1 of type 'int \\\(\\\*\\\[\\\*]\\\)\\\[3]' .aka '\[^\n\r\}\]+'. declared with 1 unspecified variable bound" }
-void* f_pIA3ax (IA3 *x[*]);
-void* f_pIA3ax (IA3 *x[n]);             // { dg-message "subsequently declared as 'int \\\(\\\*\\\[n]\\\)\\\[3]' with 0 unspecified variable bounds" "note" }
-void* f_pIA3ax (IA3 *x[n]) { return x; }
-
 
 void* f_pIA3an (IA3 *x[n]);              // { dg-message "previously declared as 'int \\\(\\\*\\\[n]\\\)\\\[3]' with 0 unspecified variable bounds" "note" }
 void* f_pIA3an (IA3 *x[n]);
index 76baddffc9f2df3ded5b4ca5a4c7a7a7a8fb6cf1..616b7a9527c0c1387167a05049d95c43e8be8751 100644 (file)
@@ -60,16 +60,6 @@ RW (2, 1) void f10 (int n, char a[n])   // { dg-warning "attribute 'access *\\\(
                                         // { dg-warning "argument 2 of type 'char\\\[n]' declared as a variable length array"  "" { target *-*-* } .-1 }
 { (void)&n; (void)&a; }
 
-
-/* The following is diagnosed to point out declarations with the T[*]
-   form in headers where specifying the bound is just as important as
-   in the definition (to detect bugs).  */
-          void f11 (int, char[*]);      // { dg-warning "argument 2 of type 'char\\\[\\\*\\\]' declared with 1 unspecified variable bound" }
-          void f11 (int m, char a[m]);  // { dg-message "subsequently declared as 'char\\\[m]' with 0 unspecified variable bounds" "note" }
-RW (2, 1) void f11 (int n, char arr[n]) // { dg-message "subsequently declared as 'char\\\[n]' with 0 unspecified variable bounds" "note" }
-{ (void)&n; (void)&arr; }
-
-
 /* Verify that redeclaring a function with attribute access applying
    to an array parameter of any form is not diagnosed.  */
           void f12__ (int, int[]) RW (2, 1);