PR tree-optimization/85753 - missing -Wrestrict on memcpy into a member array
authorMartin Sebor <msebor@redhat.com>
Wed, 16 May 2018 02:30:38 +0000 (02:30 +0000)
committerMartin Sebor <msebor@gcc.gnu.org>
Wed, 16 May 2018 02:30:38 +0000 (20:30 -0600)
gcc/ChangeLog:

PR tree-optimization/85753
* gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Handle
RECORD_TYPE in addition to ARRAY_TYPE.

gcc/testsuite/ChangeLog:

PR tree-optimization/85753
* gcc.dg/Wrestrict-10.c: Adjust.
* gcc.dg/Wrestrict-16.c: New test.

From-SVN: r260280

gcc/ChangeLog
gcc/gimple-ssa-warn-restrict.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/Wrestrict-10.c
gcc/testsuite/gcc.dg/Wrestrict-16.c [new file with mode: 0644]

index 53fcbb1ff18e13be960c10c90d8345fafcf5f725..80097cbd96f5bbeca1d7cd6a4b730bb255896a25 100644 (file)
@@ -1,3 +1,9 @@
+2018-05-15  Martin Sebor  <msebor@redhat.com>
+
+       PR tree-optimization/85753
+       * gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Handle
+       RECORD_TYPE in addition to ARRAY_TYPE.
+
 2018-05-15  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/85643
index 3d0664da028a400cc01b239239e9ccb3e4c23826..9f23f57c426d1b0943d6235ae15dd25fb6cf2067 100644 (file)
@@ -263,27 +263,29 @@ builtin_memref::builtin_memref (tree expr, tree size)
   else
     sizrange[1] = maxobjsize;
 
+  if (!DECL_P (base))
+    return;
+
+  /* If the offset could be in the range of the referenced object
+     constrain its bounds so neither exceeds those of the object.  */
+  if (offrange[0] < 0 && offrange[1] > 0)
+    offrange[0] = 0;
+
+  offset_int maxoff = maxobjsize;
   tree basetype = TREE_TYPE (base);
-  if (DECL_P (base) && TREE_CODE (basetype) == ARRAY_TYPE)
+  if (TREE_CODE (basetype) == ARRAY_TYPE
+      && ref
+      && array_at_struct_end_p (ref))
+    ;   /* Use the maximum possible offset for last member arrays.  */
+  else if (tree basesize = TYPE_SIZE_UNIT (basetype))
+    maxoff = wi::to_offset (basesize);
+
+  if (offrange[0] >= 0)
     {
-      /* If the offset could be in range of the referenced object
-        constrain its bounds so neither exceeds those of the object.  */
-      if (offrange[0] < 0 && offrange[1] > 0)
-       offrange[0] = 0;
-
-      offset_int maxoff = maxobjsize;
-      if (ref && array_at_struct_end_p (ref))
-       ;   /* Use the maximum possible offset for last member arrays.  */
-      else if (tree basesize = TYPE_SIZE_UNIT (basetype))
-       maxoff = wi::to_offset (basesize);
-
-      if (offrange[0] >= 0)
-       {
-         if (offrange[1] < 0)
-           offrange[1] = offrange[0] <= maxoff ? maxoff : maxobjsize;
-         else if (offrange[0] <= maxoff && offrange[1] > maxoff)
-           offrange[1] = maxoff;
-       }
+      if (offrange[1] < 0)
+       offrange[1] = offrange[0] <= maxoff ? maxoff : maxobjsize;
+      else if (offrange[0] <= maxoff && offrange[1] > maxoff)
+       offrange[1] = maxoff;
     }
 }
 
index b6e0e78c4a04685152f45ad7e36d9f8bf4ecfaf4..00f3c62ab7317c721c729be676a606f7708f69a8 100644 (file)
@@ -1,3 +1,9 @@
+2018-05-15  Martin Sebor  <msebor@redhat.com>
+
+       PR tree-optimization/85753
+       * gcc.dg/Wrestrict-10.c: Adjust.
+       * gcc.dg/Wrestrict-16.c: New test.
+
 2018-05-15  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/85643
index a5a5ff1b5b2f929ead161b354194ca18ce0d6a47..c412e42bacc932ae8bd9a4690ebc29d4074f86e7 100644 (file)
@@ -58,7 +58,7 @@ test_arr_strncat_2 (void)
 void __attribute__ ((noclone, noinline))
 test_arr_strcpy_1 (void)
 {
-  strcpy (&b.a[i], b.a);
+  strcpy (&b.a[i], b.a);            /* { dg-warning "\\\[-Wrestrict" } */
 }
 
 void __attribute__ ((noclone, noinline))
diff --git a/gcc/testsuite/gcc.dg/Wrestrict-16.c b/gcc/testsuite/gcc.dg/Wrestrict-16.c
new file mode 100644 (file)
index 0000000..196d2c5
--- /dev/null
@@ -0,0 +1,88 @@
+/* PR tree-optimization/85753 - missing -Wrestrict on memcpy into a member
+   array
+   { dg-do compile }
+   { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
+
+#define memcpy   __builtin_memcpy
+
+char a[16];
+
+struct { char a[16]; } x;
+
+/* Exercise aggregate types.  */
+
+void test_aggr_idx_nowarn (int i, int j)
+{
+  memcpy (&a[i], &a[j], 7);
+  memcpy (&x.a[i], &x.a[j], 7);
+}
+
+void test_aggr_idx_warn (int i, int j)
+{
+  memcpy (&a[i], &a[j], 9);       /* { dg-warning "\\\[-Wrestrict" } */
+  memcpy (&x.a[i], &x.a[j], 9);   /* { dg-warning "\\\[-Wrestrict" } */
+}
+
+void test_aggr_off_nowarn (int i, int j)
+{
+  memcpy (a + i, a + j, 5);
+  memcpy (x.a + i, x.a + j, 5);
+}
+
+void test_aggr_off_warn (int i, int j)
+{
+  memcpy (a + i, a + j, 9);       /* { dg-warning "\\\[-Wrestrict" } */
+  memcpy (x.a + i, x.a + j, 9);   /* { dg-warning "\\\[-Wrestrict" } */
+}
+
+
+void sink (void*);
+
+#define T(call) sink (call)
+
+
+/* Also exercise basic types.  */
+
+#ifdef __UINT32_TYPE__
+
+__UINT32_TYPE__ i32;
+
+void test_basic_32 (int i, int j)
+{
+  char *p = (char*)&i32;
+
+  T (memcpy (&p[i], &p[j], 1));
+  T (memcpy (&p[i], &p[j], 2));
+  T (memcpy (&p[i], &p[j], 3));   /* { dg-warning "\\\[-Wrestrict" } */
+
+  T (memcpy (p + i, p + j, 1));
+  T (memcpy (p + i, p + j, 2));
+  T (memcpy (p + i, p + j, 3));   /* { dg-warning "\\\[-Wrestrict" } */
+}
+
+#endif
+
+#ifdef __UINT64_TYPE__
+
+__UINT64_TYPE__ i64;
+
+void test_basic_64 (int i, int j)
+{
+  char *p = (char*)&i64;
+
+  T (memcpy (&p[i], &p[j], 1));
+  T (memcpy (&p[i], &p[j], 2));
+  T (memcpy (&p[i], &p[j], 3));
+  T (memcpy (&p[i], &p[j], 5));   /* { dg-warning "\\\[-Wrestrict" } */
+  T (memcpy (&p[i], &p[j], 6));   /* { dg-warning "\\\[-Wrestrict" } */
+  T (memcpy (&p[i], &p[j], 7));   /* { dg-warning "\\\[-Wrestrict" } */
+
+  T (memcpy (p + i, p + j, 1));
+  T (memcpy (p + i, p + j, 2));
+  T (memcpy (p + i, p + j, 3));
+  T (memcpy (p + i, p + j, 5));   /* { dg-warning "\\\[-Wrestrict" } */
+  T (memcpy (p + i, p + j, 6));   /* { dg-warning "\\\[-Wrestrict" } */
+  T (memcpy (p + i, p + j, 7));   /* { dg-warning "\\\[-Wrestrict" } */
+}
+
+#endif