The fix for PR 97548 introduced the OEP_DECL_NAME flag to compare
VLA bounds that refer to function parameters, but it didn't use
it in all the places where it's needed as the test case in PR
101585 illustrates.  In r12-2541 I have pushed a correction of
this oversight that I consider obvious.  Tested on x86_64-linux.

Martin

PS As an aside, for future reference, the original fix isn't robust
enough to avoid false positives for redeclarations with VLA bound
parameters at the same positions but different names.  Avoiding
those will require a more intrusive approach such as adding
a callback to operand_equal_p() to look up the parameter's position
in the function declaration based on its name.
commit a0f9a5dcc3bbe6c7de499e17d201d0f2cb512649
Author: Martin Sebor <mse...@redhat.com>
Date:   Tue Jul 27 13:51:55 2021 -0600

    Use OEP_DECL_NAME when comparing VLA bounds [PR101585].
    
    Resolves:
    PR c/101585 - Bad interaction of -fsanitize=undefined and -Wvla-parameters
    
    gcc/c-family:
    
            PR c/101585
            * c-warn.c (warn_parm_ptrarray_mismatch): Use OEP_DECL_NAME.
    
    gcc/testsuite:
            PR c/101585
            * gcc.dg/Wvla-parameter-13.c: New test.

diff --git a/gcc/c-family/c-warn.c b/gcc/c-family/c-warn.c
index 552a29f9944..84ad6633c96 100644
--- a/gcc/c-family/c-warn.c
+++ b/gcc/c-family/c-warn.c
@@ -3275,7 +3275,8 @@ warn_parm_ptrarray_mismatch (location_t origloc, tree curparms, tree newparms)
 	  /* Move on if the bounds look the same.  */
 	  if (!pcurbndpos && !pnewbndpos
 	      && curbnd && newbnd
-	      && operand_equal_p (curbnd, newbnd, OEP_LEXICOGRAPHIC))
+	      && operand_equal_p (curbnd, newbnd,
+				  OEP_DECL_NAME | OEP_LEXICOGRAPHIC))
 	    continue;
 
 	  if ((curbnd && TREE_CODE (curbnd) != INTEGER_CST)
diff --git a/gcc/testsuite/gcc.dg/Wvla-parameter-13.c b/gcc/testsuite/gcc.dg/Wvla-parameter-13.c
new file mode 100644
index 00000000000..f64d29c665e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wvla-parameter-13.c
@@ -0,0 +1,18 @@
+/* PR c/101585 - Bad interaction of -fsanitize=undefined and -Wvla-parameters
+   { dg-do compile }
+   { dg-options "-Wall -fsanitize=undefined" } */
+
+void f1 (int n, int (*)[n]);
+void f1 (int n, int (*)[n]);            // { dg-bogus "\\\[-Wvla-parameter" }
+
+void g1 (int m, int (*)[m]);
+void g1 (int n, int (*)[n]);            // { dg-bogus "\\\[-Wvla-parameter" "pr101605" { xfail *-*-* } }
+
+void h1 (int n, int (*)[n]);
+void h1 (int n, int (*)[n + 1]);        // { dg-warning "\\\[-Wvla-parameter" }
+
+void f2 (int m, int n, int (*)[m][n]);
+void f2 (int n, int m, int (*)[n][m]);  // { dg-bogus "\\\[-Wvla-parameter" "pr101605" { xfail *-*-* } }
+
+void g2 (int m, int n, int (*)[m][n]);
+void g2 (int n, int m, int (*)[m][n]);  // { dg-warning "\\\[-Wvla-parameter" "pr101605" { xfail *-*-* } }

Reply via email to