Use the recursive form of compute_objsize [PR 103143].
authorMartin Sebor <msebor@redhat.com>
Sat, 4 Dec 2021 23:22:07 +0000 (16:22 -0700)
committerMartin Sebor <msebor@redhat.com>
Thu, 9 Dec 2021 16:51:47 +0000 (09:51 -0700)
gcc/ChangeLog:

PR middle-end/103143
* pointer-query.cc (gimple_call_return_array): Call compute_objsize_r.

gcc/testsuite/ChangeLog:
PR middle-end/103143
* gcc.dg/Wstringop-overflow-83.c: New test.

gcc/pointer-query.cc
gcc/testsuite/gcc.dg/Wstringop-overflow-83.c [new file with mode: 0644]

index 2ead027..25ce430 100644 (file)
@@ -199,7 +199,7 @@ gimple_call_return_array (gimple *stmt, offset_int offrng[2], bool *past_end,
               of the source object.  */
            access_ref aref;
            tree src = gimple_call_arg (stmt, 1);
-           if (compute_objsize (src, stmt, 1, &aref, qry)
+           if (compute_objsize_r (src, stmt, 1, &aref, snlim, qry)
                && aref.sizrng[1] < offrng[1])
              offrng[1] = aref.sizrng[1];
          }
diff --git a/gcc/testsuite/gcc.dg/Wstringop-overflow-83.c b/gcc/testsuite/gcc.dg/Wstringop-overflow-83.c
new file mode 100644 (file)
index 0000000..6928ee4
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR  middle-end/103143 - ICE due to infinite recursion in pointer-query.cc
+   { dg-do compile }
+   { dg-options "-O2 -Wall" } */
+
+typedef __SIZE_TYPE__ size_t;
+
+void foo (size_t x)
+{
+  struct T { char buf[64]; char buf2[64]; } t;
+  char *p = &t.buf[8];
+  char *r = t.buf2;
+  size_t i;
+
+  for (i = 0; i < x; i++)
+    {
+      r = __builtin_mempcpy (r, p, i);
+      p = r + 1;
+    }
+}