Commit 0eb5f158 by Jason Merrill Committed by Jason Merrill

re PR c++/22434 (ICE in simplify_{,gen_}subreg)

	PR c++/22434
	PR c++/61288
	* call.c (build_conditional_expr_1): Avoid reading freed memory.

From-SVN: r212482
parent c59f7203
2014-07-11 Jason Merrill <jason@redhat.com>
PR c++/22434
PR c++/61288
* call.c (build_conditional_expr_1): Avoid reading freed memory.
2014-07-11 Paolo Carlini <paolo.carlini@oracle.com> 2014-07-11 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/53159 PR c++/53159
......
...@@ -4763,6 +4763,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3, ...@@ -4763,6 +4763,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3,
{ {
conversion *conv2; conversion *conv2;
conversion *conv3; conversion *conv3;
bool converted = false;
/* Get the high-water mark for the CONVERSION_OBSTACK. */ /* Get the high-water mark for the CONVERSION_OBSTACK. */
p = conversion_obstack_alloc (0); p = conversion_obstack_alloc (0);
...@@ -4809,6 +4810,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3, ...@@ -4809,6 +4810,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3,
converted to X, the conversion will fail. */ converted to X, the conversion will fail. */
if (error_operand_p (arg2)) if (error_operand_p (arg2))
result = error_mark_node; result = error_mark_node;
converted = true;
} }
else if (conv3 && !conv3->bad_p) else if (conv3 && !conv3->bad_p)
{ {
...@@ -4817,6 +4819,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3, ...@@ -4817,6 +4819,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3,
arg3_type = TREE_TYPE (arg3); arg3_type = TREE_TYPE (arg3);
if (error_operand_p (arg3)) if (error_operand_p (arg3))
result = error_mark_node; result = error_mark_node;
converted = true;
} }
/* Free all the conversions we allocated. */ /* Free all the conversions we allocated. */
...@@ -4840,8 +4843,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3, ...@@ -4840,8 +4843,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3,
conditional expression failing altogether, even though, conditional expression failing altogether, even though,
according to this step, the one operand could be converted to according to this step, the one operand could be converted to
the type of the other. */ the type of the other. */
if (((conv2 && !conv2->bad_p) if (converted
|| (conv3 && !conv3->bad_p))
&& CLASS_TYPE_P (arg2_type) && CLASS_TYPE_P (arg2_type)
&& cp_type_quals (arg2_type) != cp_type_quals (arg3_type)) && cp_type_quals (arg2_type) != cp_type_quals (arg3_type))
arg2_type = arg3_type = arg2_type = arg3_type =
......
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