re PR c++/79655 (ICE on invalid c++ code in cxx_eval_store_expression in cp/constexpr...
authorJakub Jelinek <jakub@redhat.com>
Tue, 21 Feb 2017 17:57:23 +0000 (18:57 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 21 Feb 2017 17:57:23 +0000 (18:57 +0100)
PR c++/79655
* constexpr.c (cxx_eval_array_reference): Diagnose negative subscript.

* g++.dg/cpp1y/constexpr-79655.C: New test.

From-SVN: r245636

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

index 26ead8ac6c6da732722fed2b005daa07d0e4db56..914f80c777dc9b2eeb56a301fadf16c766d0732e 100644 (file)
@@ -1,5 +1,8 @@
 2017-02-21  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/79655
+       * constexpr.c (cxx_eval_array_reference): Diagnose negative subscript.
+
        PR c++/79639
        * constexpr.c (cxx_eval_store_expression): If *valp is a PTRMEM_CST,
        call cplus_expand_constant on it first.
index 14af617f2a8667a4ab0a4ac6c7b6c2c9dee43f18..3fe501a8a276115ed7801607951de52d09ac0dc4 100644 (file)
@@ -2263,9 +2263,10 @@ cxx_eval_array_reference (const constexpr_ctx *ctx, tree t,
   nelts = cxx_eval_constant_expression (ctx, nelts, false, non_constant_p,
                                        overflow_p);
   VERIFY_CONSTANT (nelts);
-  if (lval
-      ? !tree_int_cst_le (index, nelts)
-      : !tree_int_cst_lt (index, nelts))
+  if ((lval
+       ? !tree_int_cst_le (index, nelts)
+       : !tree_int_cst_lt (index, nelts))
+      || tree_int_cst_sgn (index) < 0)
     {
       diag_array_subscript (ctx, ary, index);
       *non_constant_p = true;
index 342f23f3d912d3beb7601933b201ef83054d0af6..9877624be83613ed4653e81113abc4c498125597 100644 (file)
@@ -1,5 +1,8 @@
 2017-02-21  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/79655
+       * g++.dg/cpp1y/constexpr-79655.C: New test.
+
        PR c++/79639
        * g++.dg/cpp1y/constexpr-79639.C: New test. 
 
diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-79655.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-79655.C
new file mode 100644 (file)
index 0000000..0be94b6
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/79655
+// { dg-do compile { target c++14 } }
+
+constexpr int
+foo (int x, int y)
+{
+  int a[6] = { 1, 2, 3, 4, 5, 6 };
+  a[x] = 0;
+  return a[y];
+}
+
+constexpr int b = foo (0, -1); // { dg-error "is outside the bounds" }
+constexpr int c = foo (0, 6);  // { dg-error "is outside the bounds" }
+constexpr int d = foo (6, 0);  // { dg-error "is outside the bounds" }
+constexpr int e = foo (-1, 0); // { dg-error "is outside the bounds" }
+static_assert (foo (5, 5) == 0, "");
+static_assert (foo (4, 5) == 6, "");
+static_assert (foo (5, 4) == 5, "");