From 3bb4311904171b4938f6682566a24180f318b196 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 21 Feb 2017 18:57:23 +0100 Subject: [PATCH] re PR c++/79655 (ICE on invalid c++ code in cxx_eval_store_expression in cp/constexpr.c:3464) 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 | 3 +++ gcc/cp/constexpr.c | 7 ++++--- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/cpp1y/constexpr-79655.C | 18 ++++++++++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/constexpr-79655.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 26ead8ac6c6..914f80c777d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2017-02-21 Jakub Jelinek + 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. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 14af617f2a8..3fe501a8a27 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 342f23f3d91..9877624be83 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2017-02-21 Jakub Jelinek + 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 index 00000000000..0be94b6b810 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-79655.C @@ -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, ""); -- 2.30.2