re PR middle-end/86528 (strlen of constant string malfunction -- had to back out...
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Mon, 16 Jul 2018 18:03:15 +0000 (18:03 +0000)
committerBernd Edlinger <edlinger@gcc.gnu.org>
Mon, 16 Jul 2018 18:03:15 +0000 (18:03 +0000)
gcc:
2018-07-16  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR middle-end/86528
        * builtins.c (check_access): Bail out if range[0] is no INTEGER_CST.
        * expr.c (string_constant): Fix the element size of ARRAY_TYPE.

testsuite:
2018-07-16  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR middle-end/86528
        * gcc.c-torture/execute/pr86528.c: New test.
        * gcc.dg/Wrestrict-10.c (test_arr_strcat_2): Fix typo.

From-SVN: r262742

gcc/ChangeLog
gcc/builtins.c
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr86528.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/Wrestrict-10.c

index b5b8a0e0d45bd2e19f85f4bcd7a07903f03eec41..8fe8dfce28352ba532b378fa8e8a59e7a02b4c07 100644 (file)
@@ -1,3 +1,9 @@
+2018-07-16  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       PR middle-end/86528
+       * builtins.c (check_access): Bail out if range[0] is no INTEGER_CST.
+       * expr.c (string_constant): Fix the element size of ARRAY_TYPE.
+
 2018-07-16  Kelvin Nilsen  <kelvin@gcc.gnu.org>
 
        * doc/extend.texi (PowerPC AltiVec Built-in Functions):
index 839a8180e48bdc8b4ee5ce8870761e425ee83b22..c041641caa4f74cf9555b7afb1818f207450904f 100644 (file)
@@ -3192,6 +3192,10 @@ check_access (tree exp, tree, tree, tree dstwrite,
   if (dstwrite)
     get_size_range (dstwrite, range);
 
+  /* This can happen at -O0.  */
+  if (range[0] && TREE_CODE (range[0]) != INTEGER_CST)
+    return false;
+
   tree func = get_callee_fndecl (exp);
 
   /* First check the number of bytes to be written against the maximum
index 797b1f5d794a2849b3bc3a18b0af1f732430a2fd..f665e187ebbbc7874ec88e84ca47ed991491c3e5 100644 (file)
@@ -11341,7 +11341,9 @@ string_constant (tree arg, tree *ptr_offset)
   tree offset = wide_int_to_tree (sizetype, base_off);
   if (varidx)
     {
-      if (tree eltsize = TYPE_SIZE_UNIT (TREE_TYPE (array)))
+      if (TREE_CODE (TREE_TYPE (array)) != ARRAY_TYPE)
+       return NULL_TREE;
+      if (tree eltsize = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (array))))
        {
          /* Add the scaled variable index to the constant offset.  */
          tree eltoff = fold_build2 (MULT_EXPR, TREE_TYPE (offset),
index 4abf54158720469e61c35ba2049db3b5cf25b9b0..854d28ef6798c85d3b5ef4bf5c1c0e0b42257280 100644 (file)
@@ -1,3 +1,9 @@
+2018-07-16  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       PR middle-end/86528
+       * gcc.c-torture/execute/pr86528.c: New test.
+       * gcc.dg/Wrestrict-10.c (test_arr_strcat_2): Fix typo.
+
 2018-07-16  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * g++.dg/template/spec40.C: New.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr86528.c b/gcc/testsuite/gcc.c-torture/execute/pr86528.c
new file mode 100644 (file)
index 0000000..2a7b011
--- /dev/null
@@ -0,0 +1,20 @@
+/* PR middle-end/86528 */
+
+void __attribute__((noinline, noclone))
+test(char *data, __SIZE_TYPE__ len)
+{
+    static char const appended[] = "/./";
+    char *buf = __builtin_alloca (len + sizeof appended);
+    __builtin_memcpy (buf, data, len);
+    __builtin_strcpy (buf + len, &appended[data[len - 1] == '/']);
+    if (__builtin_strcmp(buf, "test1234/./"))
+        __builtin_abort();
+}
+
+int
+main()
+{
+   char *arg = "test1234/";
+   test(arg, __builtin_strlen(arg));
+   return 0;
+}
index c412e42bacc932ae8bd9a4690ebc29d4074f86e7..8bdabdb033b5269a86e22e091485fac31038244b 100644 (file)
@@ -39,8 +39,7 @@ test_arr_strcat_1 (void)
 void __attribute__ ((noclone, noinline))
 test_arr_strcat_2 (void)
 {
-  /* This probably deserves a warning.  */
-  strcpy (b.a, &b.a[i]);
+  strcat (b.a, &b.a[i]);            /* { dg-warning "\\\[-Wrestrict" } */
 }
 
 void __attribute__ ((noclone, noinline))