diff options
author | Paolo Carlini <paolo@gcc.gnu.org> | 2013-03-16 10:02:11 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2013-03-16 10:02:11 +0000 |
commit | 9a54d96aabdc4501573aa0cd2f5201a206963f69 (patch) | |
tree | 59a32bada7f76cd8102c15b035d47d35fc111bee | |
parent | 179c5970e6e4ed3e1ca9f8ba6e9c07c3510d4114 (diff) | |
download | gcc-9a54d96aabdc4501573aa0cd2f5201a206963f69.zip gcc-9a54d96aabdc4501573aa0cd2f5201a206963f69.tar.gz gcc-9a54d96aabdc4501573aa0cd2f5201a206963f69.tar.bz2 |
re PR c++/56582 (ICE on negative array index in C++11 constant expression evaluation)
/cp
2013-03-16 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/56582
* semantics.c (cxx_eval_array_reference): Check for negative index.
/testsuite
2013-03-16 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/56582
* g++.dg/cpp0x/constexpr-array5.C: New.
From-SVN: r196701
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-array5.C | 9 |
4 files changed, 28 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 77f3f82..3f05f29 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2013-03-16 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/56582 + * semantics.c (cxx_eval_array_reference): Check for negative index. + 2013-03-14 Jason Merrill <jason@redhat.com> PR c++/56614 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index e909b98..3c76bad 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -7007,6 +7007,13 @@ cxx_eval_array_reference (const constexpr_call *call, tree t, *non_constant_p = true; return t; } + else if (tree_int_cst_lt (index, integer_zero_node)) + { + if (!allow_non_constant) + error ("negative array subscript"); + *non_constant_p = true; + return t; + } i = tree_low_cst (index, 0); if (TREE_CODE (ary) == CONSTRUCTOR) return (*CONSTRUCTOR_ELTS (ary))[i].value; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index caf8f6d..f9fb7f6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,7 +1,12 @@ +2013-03-16 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/56582 + * g++.dg/cpp0x/constexpr-array5.C: New. + 2013-03-15 Tobias Burnus <burnus@net-b.de> - PR fortran/56615 - * gfortran.dg/transfer_intrinsic_5.f90: New. + PR fortran/56615 + * gfortran.dg/transfer_intrinsic_5.f90: New. 2013-03-15 Kai Tietz <ktietz@redhat.com> diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-array5.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-array5.C new file mode 100644 index 0000000..4605b4b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-array5.C @@ -0,0 +1,9 @@ +// PR c++/56582 +// { dg-do compile { target c++11 } } + +// Reliable ICE +constexpr int n[3] = {}; +constexpr int k = n[-1]; // { dg-error "negative" } + +// Some random byte +constexpr char c = "foo"[-1000]; // { dg-error "negative" } |