PR c++/72766 - ICE with VLA
authorJason Merrill <jason@redhat.com>
Mon, 1 Aug 2016 15:01:03 +0000 (11:01 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 1 Aug 2016 15:01:03 +0000 (11:01 -0400)
* constexpr.c (cxx_eval_pointer_plus_expression): Check constancy
of nelts.
* cp-gimplify.c (cp_fully_fold): Only maybe_constant_value in
C++11 and up.

From-SVN: r238957

gcc/cp/ChangeLog
gcc/cp/constexpr.c
gcc/cp/cp-gimplify.c
gcc/testsuite/g++.dg/ext/vla16.C [new file with mode: 0644]

index 1037208d5bd2f4fe2a7ebde8602b9dcdb3553f9d..d792baf24755b1f20b895e8da2d46c04220ab667 100644 (file)
@@ -1,3 +1,11 @@
+2016-08-01  Jason Merrill  <jason@redhat.com>
+
+       PR c++/72766
+       * constexpr.c (cxx_eval_pointer_plus_expression): Check constancy
+       of nelts.
+       * cp-gimplify.c (cp_fully_fold): Only maybe_constant_value in
+       C++11 and up.
+
 2016-07-30 Martin Sebor  <msebor@redhat.com>
 
        PR c++/60760
index 8bda97373b1e712cf62dfc83d69c5126aabea36e..edade4894014405120d29e030a5846006ba490a1 100644 (file)
@@ -3581,6 +3581,10 @@ cxx_eval_pointer_plus_expression (const constexpr_ctx *ctx, tree t,
       tree type = TREE_TYPE (op00);
       t = fold_convert_loc (loc, ssizetype, TREE_OPERAND (op00, 1));
       tree nelts = array_type_nelts_top (TREE_TYPE (TREE_OPERAND (op00, 0)));
+      nelts = cxx_eval_constant_expression (ctx, nelts, false, non_constant_p,
+                                           overflow_p);
+      if (*non_constant_p)
+       return NULL_TREE;
       /* Don't fold an out-of-bound access.  */
       if (!tree_int_cst_le (t, nelts))
        return NULL_TREE;
index 59953a6ee04376969051acb710456be0667f24f4..e28c9dfc799545767078407f793d2467f6c113af 100644 (file)
@@ -1967,7 +1967,8 @@ cp_fully_fold (tree x)
     return x;
   /* FIXME cp_fold ought to be a superset of maybe_constant_value so we don't
      have to call both.  */
-  x = maybe_constant_value (x);
+  if (cxx_dialect >= cxx11)
+    x = maybe_constant_value (x);
   return cp_fold (x);
 }
 
diff --git a/gcc/testsuite/g++.dg/ext/vla16.C b/gcc/testsuite/g++.dg/ext/vla16.C
new file mode 100644 (file)
index 0000000..c3e6ea1
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/72766
+// { dg-options "-Wno-vla" }
+
+long fn1() {
+  const int a = fn1();
+  int b[a];
+  int c = *(&b[0] + sizeof(0));
+}