re PR tree-optimization/86988 (ICE: tree check: expected integer_cst, have var_decl...
authorRichard Biener <rguenther@suse.de>
Wed, 22 Aug 2018 11:01:58 +0000 (11:01 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 22 Aug 2018 11:01:58 +0000 (11:01 +0000)
2018-08-22  Richard Biener  <rguenther@suse.de>

PR tree-optimization/86988
* tree-vrp.c (vrp_prop::check_mem_ref): Bail out on VLAs.

* g++.dg/pr86988.C: New testcase.

From-SVN: r263762

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr86988.C [new file with mode: 0644]
gcc/tree-vrp.c

index 3a67b236a37fa91d3392cff53c035f5fa6c9c47d..7dfdd45dd97f14e32f684a933416d34cd8eed0c1 100644 (file)
@@ -1,3 +1,8 @@
+2018-08-22  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/86988
+       * tree-vrp.c (vrp_prop::check_mem_ref): Bail out on VLAs.
+
 2018-08-22  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/86945
index 4e38d714ef4724bff01364dde5bfae0b46cd3bca..e238d93825a05739884a5abb92fa346d33f110b8 100644 (file)
@@ -1,3 +1,8 @@
+2018-08-22  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/86988
+       * g++.dg/pr86988.C: New testcase.
+
 2018-08-22  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/86945
diff --git a/gcc/testsuite/g++.dg/pr86988.C b/gcc/testsuite/g++.dg/pr86988.C
new file mode 100644 (file)
index 0000000..62fb0f3
--- /dev/null
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// { dg-options "-O2 -Warray-bounds" }
+
+struct R { int r; };
+void baz (char *, char *, char *, char *);
+
+void
+foo ()
+{
+  const R a = { 12 };
+  char b[1][a.r] = { { "12345678901" } };
+  char c[a.r] = { "12345678901" };
+  char d[1][a.r] = { { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '\0' } };
+  char e[a.r] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '\0' };
+  baz (b[0], c, d[0], e);
+}
index 24e089b019b715b049d218d648e481f093aafcdf..ead19f159964cf6197f51726a74d11eb08c2f665 100644 (file)
@@ -4581,6 +4581,7 @@ vrp_prop::check_mem_ref (location_t location, tree ref,
   tree reftype = TREE_TYPE (arg);
   if (POINTER_TYPE_P (reftype)
       || !COMPLETE_TYPE_P (reftype)
+      || TREE_CODE (TYPE_SIZE_UNIT (reftype)) != INTEGER_CST
       || RECORD_OR_UNION_TYPE_P (reftype))
     return;