Commit bb8b1f69 by Jason Merrill Committed by Jason Merrill

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

	PR c++/22434
	* call.c (build_conditional_expr_1): Don't try to pool cv-quals
	if we didn't find a conversion.
	Don't accept a bad conversion too early.

From-SVN: r210281
parent ea58ef42
2014-05-09 Jason Merrill <jason@redhat.com>
PR c++/22434
* call.c (build_conditional_expr_1): Don't try to pool cv-quals
if we didn't find a conversion.
Don't accept a bad conversion too early.
2014-05-08 Paolo Carlini <paolo.carlini@oracle.com> 2014-05-08 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/13981 PR c++/13981
......
...@@ -4714,7 +4714,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3, ...@@ -4714,7 +4714,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3,
arg2_type, arg3_type); arg2_type, arg3_type);
result = error_mark_node; result = error_mark_node;
} }
else if (conv2 && (!conv2->bad_p || !conv3)) else if (conv2 && !conv2->bad_p)
{ {
arg2 = convert_like (conv2, arg2, complain); arg2 = convert_like (conv2, arg2, complain);
arg2 = convert_from_reference (arg2); arg2 = convert_from_reference (arg2);
...@@ -4727,7 +4727,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3, ...@@ -4727,7 +4727,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3,
if (error_operand_p (arg2)) if (error_operand_p (arg2))
result = error_mark_node; result = error_mark_node;
} }
else if (conv3 && (!conv3->bad_p || !conv2)) else if (conv3 && !conv3->bad_p)
{ {
arg3 = convert_like (conv3, arg3, complain); arg3 = convert_like (conv3, arg3, complain);
arg3 = convert_from_reference (arg3); arg3 = convert_from_reference (arg3);
...@@ -4757,7 +4757,8 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3, ...@@ -4757,7 +4757,8 @@ 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 || conv3) if (((conv2 && !conv2->bad_p)
|| (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 =
......
// PR c++/22434 // PR c++/22434
// { dg-options "" }
struct A struct A
{ {
A(void*); // { dg-message "initializing" } A(void*);
~A(); ~A();
}; };
void foo(const int i, bool b) void foo(const int i, bool b)
{ {
b ? A(0) : i; // { dg-error "conversion" } b ? A(0) : i; // { dg-error "" }
} }
// { dg-do assemble } // { dg-do assemble }
// { dg-options "" }
// PRMS Id: 9019 // PRMS Id: 9019
// Bug: g++ doesn't find conversion to const char *. // Bug: g++ doesn't find conversion to const char *.
......
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