Commit 476805ae by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/68357 (FAIL: g++.dg/other/darwin-cfstring1.C -std=* (internal…

re PR c++/68357 (FAIL: g++.dg/other/darwin-cfstring1.C  -std=* (internal compiler error) on x86_64-apple-darwin1(0|4|5))

	PR c++/68357
	* cp-gimplify.c (cp_fold): If some operand folds to error_mark_node,
	return error_mark_node instead of building trees with error_mark_node
	operands.

From-SVN: r232843
parent f1d591e8
2016-01-26 Jakub Jelinek <jakub@redhat.com>
PR c++/68357
* cp-gimplify.c (cp_fold): If some operand folds to error_mark_node,
return error_mark_node instead of building trees with error_mark_node
operands.
2016-01-26 David Malcolm <dmalcolm@redhat.com> 2016-01-26 David Malcolm <dmalcolm@redhat.com>
PR other/69006 PR other/69006
......
...@@ -1954,7 +1954,12 @@ cp_fold (tree x) ...@@ -1954,7 +1954,12 @@ cp_fold (tree x)
op0 = cp_fold_maybe_rvalue (TREE_OPERAND (x, 0), rval_ops); op0 = cp_fold_maybe_rvalue (TREE_OPERAND (x, 0), rval_ops);
if (op0 != TREE_OPERAND (x, 0)) if (op0 != TREE_OPERAND (x, 0))
x = fold_build1_loc (loc, code, TREE_TYPE (x), op0); {
if (op0 == error_mark_node)
x = error_mark_node;
else
x = fold_build1_loc (loc, code, TREE_TYPE (x), op0);
}
else else
x = fold (x); x = fold (x);
...@@ -1986,7 +1991,12 @@ cp_fold (tree x) ...@@ -1986,7 +1991,12 @@ cp_fold (tree x)
op0 = cp_fold_maybe_rvalue (TREE_OPERAND (x, 0), rval_ops); op0 = cp_fold_maybe_rvalue (TREE_OPERAND (x, 0), rval_ops);
if (op0 != TREE_OPERAND (x, 0)) if (op0 != TREE_OPERAND (x, 0))
x = fold_build1_loc (loc, code, TREE_TYPE (x), op0); {
if (op0 == error_mark_node)
x = error_mark_node;
else
x = fold_build1_loc (loc, code, TREE_TYPE (x), op0);
}
else else
x = fold (x); x = fold (x);
...@@ -2043,7 +2053,12 @@ cp_fold (tree x) ...@@ -2043,7 +2053,12 @@ cp_fold (tree x)
op1 = cp_fold_rvalue (TREE_OPERAND (x, 1)); op1 = cp_fold_rvalue (TREE_OPERAND (x, 1));
if (op0 != TREE_OPERAND (x, 0) || op1 != TREE_OPERAND (x, 1)) if (op0 != TREE_OPERAND (x, 0) || op1 != TREE_OPERAND (x, 1))
x = fold_build2_loc (loc, code, TREE_TYPE (x), op0, op1); {
if (op0 == error_mark_node || op1 == error_mark_node)
x = error_mark_node;
else
x = fold_build2_loc (loc, code, TREE_TYPE (x), op0, op1);
}
else else
x = fold (x); x = fold (x);
...@@ -2066,7 +2081,14 @@ cp_fold (tree x) ...@@ -2066,7 +2081,14 @@ cp_fold (tree x)
if (op0 != TREE_OPERAND (x, 0) if (op0 != TREE_OPERAND (x, 0)
|| op1 != TREE_OPERAND (x, 1) || op1 != TREE_OPERAND (x, 1)
|| op2 != TREE_OPERAND (x, 2)) || op2 != TREE_OPERAND (x, 2))
x = fold_build3_loc (loc, code, TREE_TYPE (x), op0, op1, op2); {
if (op0 == error_mark_node
|| op1 == error_mark_node
|| op2 == error_mark_node)
x = error_mark_node;
else
x = fold_build3_loc (loc, code, TREE_TYPE (x), op0, op1, op2);
}
else else
x = fold (x); x = fold (x);
...@@ -2093,9 +2115,18 @@ cp_fold (tree x) ...@@ -2093,9 +2115,18 @@ cp_fold (tree x)
{ {
r = cp_fold (CALL_EXPR_ARG (x, i)); r = cp_fold (CALL_EXPR_ARG (x, i));
if (r != CALL_EXPR_ARG (x, i)) if (r != CALL_EXPR_ARG (x, i))
changed = 1; {
if (r == error_mark_node)
{
x = error_mark_node;
break;
}
changed = 1;
}
CALL_EXPR_ARG (x, i) = r; CALL_EXPR_ARG (x, i) = r;
} }
if (x == error_mark_node)
break;
optimize = nw; optimize = nw;
r = fold (x); r = fold (x);
...@@ -2143,7 +2174,15 @@ cp_fold (tree x) ...@@ -2143,7 +2174,15 @@ cp_fold (tree x)
constructor_elt e = { p->index, op }; constructor_elt e = { p->index, op };
nelts->quick_push (e); nelts->quick_push (e);
if (op != p->value) if (op != p->value)
changed = true; {
if (op == error_mark_node)
{
x = error_mark_node;
changed = false;
break;
}
changed = true;
}
} }
if (changed) if (changed)
x = build_constructor (TREE_TYPE (x), nelts); x = build_constructor (TREE_TYPE (x), nelts);
...@@ -2188,9 +2227,19 @@ cp_fold (tree x) ...@@ -2188,9 +2227,19 @@ cp_fold (tree x)
op2 = cp_fold (TREE_OPERAND (x, 2)); op2 = cp_fold (TREE_OPERAND (x, 2));
op3 = cp_fold (TREE_OPERAND (x, 3)); op3 = cp_fold (TREE_OPERAND (x, 3));
if (op0 != TREE_OPERAND (x, 0) || op1 != TREE_OPERAND (x, 1) if (op0 != TREE_OPERAND (x, 0)
|| op2 != TREE_OPERAND (x, 2) || op3 != TREE_OPERAND (x, 3)) || op1 != TREE_OPERAND (x, 1)
x = build4_loc (loc, code, TREE_TYPE (x), op0, op1, op2, op3); || op2 != TREE_OPERAND (x, 2)
|| op3 != TREE_OPERAND (x, 3))
{
if (op0 == error_mark_node
|| op1 == error_mark_node
|| op2 == error_mark_node
|| op3 == error_mark_node)
x = error_mark_node;
else
x = build4_loc (loc, code, TREE_TYPE (x), op0, op1, op2, op3);
}
x = fold (x); x = fold (x);
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment