From bb8b1f696ecc30435b210cbcb4d0c575a3e81df1 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 9 May 2014 14:15:46 -0400 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/call.c | 7 ++++--- gcc/testsuite/g++.dg/expr/cond8.C | 5 ++--- gcc/testsuite/g++.old-deja/g++.jason/conversion10.C | 1 + 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3d400bb..232ceec 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2014-05-09 Jason Merrill + + 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 PR c++/13981 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 857df57..691e9e3 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4714,7 +4714,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3, arg2_type, arg3_type); 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_from_reference (arg2); @@ -4727,7 +4727,7 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3, if (error_operand_p (arg2)) 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_from_reference (arg3); @@ -4757,7 +4757,8 @@ build_conditional_expr_1 (location_t loc, tree arg1, tree arg2, tree arg3, conditional expression failing altogether, even though, according to this step, the one operand could be converted to the type of the other. */ - if ((conv2 || conv3) + if (((conv2 && !conv2->bad_p) + || (conv3 && !conv3->bad_p)) && CLASS_TYPE_P (arg2_type) && cp_type_quals (arg2_type) != cp_type_quals (arg3_type)) arg2_type = arg3_type = diff --git a/gcc/testsuite/g++.dg/expr/cond8.C b/gcc/testsuite/g++.dg/expr/cond8.C index 3e08953..11b090d 100644 --- a/gcc/testsuite/g++.dg/expr/cond8.C +++ b/gcc/testsuite/g++.dg/expr/cond8.C @@ -1,13 +1,12 @@ // PR c++/22434 -// { dg-options "" } struct A { - A(void*); // { dg-message "initializing" } + A(void*); ~A(); }; void foo(const int i, bool b) { - b ? A(0) : i; // { dg-error "conversion" } + b ? A(0) : i; // { dg-error "" } } diff --git a/gcc/testsuite/g++.old-deja/g++.jason/conversion10.C b/gcc/testsuite/g++.old-deja/g++.jason/conversion10.C index 8cbba41..0eeceeb 100644 --- a/gcc/testsuite/g++.old-deja/g++.jason/conversion10.C +++ b/gcc/testsuite/g++.old-deja/g++.jason/conversion10.C @@ -1,4 +1,5 @@ // { dg-do assemble } +// { dg-options "" } // PRMS Id: 9019 // Bug: g++ doesn't find conversion to const char *. -- 2.7.4