aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo@gcc.gnu.org>2013-03-16 10:02:11 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2013-03-16 10:02:11 +0000
commit9a54d96aabdc4501573aa0cd2f5201a206963f69 (patch)
tree59a32bada7f76cd8102c15b035d47d35fc111bee /gcc
parent179c5970e6e4ed3e1ca9f8ba6e9c07c3510d4114 (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/semantics.c7
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-array5.C9
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" }