From aa779cf3698b0fbc51db7a669fb4f3745afa03bb Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 21 Aug 2003 18:02:27 -0400 Subject: [PATCH] re PR c++/11283 (ICE in build_conditional_expr) PR c++/11283 * call.c (build_conditional_expr): Ignore cv-qual differences for non-class types. From-SVN: r70667 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/call.c | 9 +++++++-- gcc/testsuite/g++.dg/conversion/cond6.C | 18 ++++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/conversion/cond6.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ec4f44458bd..7eaf150b76a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-08-21 Jason Merrill + + PR c++/11283 + * call.c (build_conditional_expr): Ignore cv-qual differences for + non-class types. + 2003-08-21 Mark Mitchell PR c++/11551 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index a76d2ac022a..4bda8da36fc 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -3171,7 +3171,11 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3) { arg2 = convert_like (conv2, arg2); arg2 = convert_from_reference (arg2); - if (!same_type_p (TREE_TYPE (arg2), arg3_type)) + if (!same_type_p (TREE_TYPE (arg2), arg3_type) + && CLASS_TYPE_P (arg3_type)) + /* The types need to match if we're converting to a class type. + If not, we don't care about cv-qual mismatches, since + non-class rvalues are not cv-qualified. */ abort (); arg2_type = TREE_TYPE (arg2); } @@ -3179,7 +3183,8 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3) { arg3 = convert_like (conv3, arg3); arg3 = convert_from_reference (arg3); - if (!same_type_p (TREE_TYPE (arg3), arg2_type)) + if (!same_type_p (TREE_TYPE (arg3), arg2_type) + && CLASS_TYPE_P (arg2_type)) abort (); arg3_type = TREE_TYPE (arg3); } diff --git a/gcc/testsuite/g++.dg/conversion/cond6.C b/gcc/testsuite/g++.dg/conversion/cond6.C new file mode 100644 index 00000000000..8c05e1b143c --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cond6.C @@ -0,0 +1,18 @@ +// PR c++/11283 +// Converting "a" to the type of "i" produces "int" rather than "const +// int", which was causing build_conditional_expr to abort. But we don't +// care about cv-quals on non-class rvalues. + +struct A +{ + operator int (); +}; + +extern A a; +extern const int i; +extern bool b; + +int f () +{ + return b ? a : i; +} -- 2.30.2