aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2018-04-12 20:02:47 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2018-04-12 20:02:47 +0000
commit4930c53ee69f18a6fd689527864d419ce0333e7a (patch)
tree2ce0c031a7622545758ae62e0e2977a0ff82f60a
parented086e7e0a9f56c0e6f20236fb3cf2c64c4b4b71 (diff)
downloadgcc-4930c53ee69f18a6fd689527864d419ce0333e7a.zip
gcc-4930c53ee69f18a6fd689527864d419ce0333e7a.tar.gz
gcc-4930c53ee69f18a6fd689527864d419ce0333e7a.tar.bz2
re PR c++/85258 (ICE with invalid range-based for-loop)
PR c++/85258 * constexpr.c (reduced_constant_expression_p): Return false for null trees. * g++.dg/parse/error61.C: New test. From-SVN: r259355
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/constexpr.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/parse/error61.C14
4 files changed, 30 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e9a32b0..e3bc2d9 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2018-04-12 Marek Polacek <polacek@redhat.com>
+
+ PR c++/85258
+ * constexpr.c (reduced_constant_expression_p): Return false for null
+ trees.
+
2018-04-11 Marek Polacek <polacek@redhat.com>
PR c++/85032
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 75f56df..82f14ba 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -1773,6 +1773,9 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
bool
reduced_constant_expression_p (tree t)
{
+ if (t == NULL_TREE)
+ return false;
+
switch (TREE_CODE (t))
{
case PTRMEM_CST:
@@ -1794,9 +1797,8 @@ reduced_constant_expression_p (tree t)
field = NULL_TREE;
FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), i, idx, val)
{
- if (!val)
- /* We're in the middle of initializing this element. */
- return false;
+ /* If VAL is null, we're in the middle of initializing this
+ element. */
if (!reduced_constant_expression_p (val))
return false;
if (field)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2b4f250..73a358e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-04-12 Marek Polacek <polacek@redhat.com>
+
+ PR c++/85258
+ * g++.dg/parse/error61.C: New test.
+
2018-04-12 Cesar Philippidis <cesar@codesourcery.com>
* testsuite/libgomp.oacc-c-c++-common/pr84955.c: Revert 259346.
diff --git a/gcc/testsuite/g++.dg/parse/error61.C b/gcc/testsuite/g++.dg/parse/error61.C
new file mode 100644
index 0000000..199e1aa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error61.C
@@ -0,0 +1,14 @@
+// PR c++/85258
+// { dg-do compile { target c++11 } }
+
+template<int> void foo()
+{
+ int x[8];
+ for (int& i, j : x) // { dg-error "multiple" }
+ i = 0; // { dg-error "local variable" }
+}
+
+void bar()
+{
+ foo<0>();
+}