diff options
author | Jason Merrill <jason@redhat.com> | 2003-08-21 18:02:27 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2003-08-21 18:02:27 -0400 |
commit | aa779cf3698b0fbc51db7a669fb4f3745afa03bb (patch) | |
tree | 9f3303b88fc85aa976aaff12457c14f2c18c87ce | |
parent | 9d3d50d27e511d017ee61d525b9b4759885f165b (diff) | |
download | gcc-aa779cf3698b0fbc51db7a669fb4f3745afa03bb.zip gcc-aa779cf3698b0fbc51db7a669fb4f3745afa03bb.tar.gz gcc-aa779cf3698b0fbc51db7a669fb4f3745afa03bb.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/call.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/conversion/cond6.C | 18 |
3 files changed, 31 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ec4f444..7eaf150 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-08-21 Jason Merrill <jason@redhat.com> + + PR c++/11283 + * call.c (build_conditional_expr): Ignore cv-qual differences for + non-class types. + 2003-08-21 Mark Mitchell <mark@codesourcery.com> PR c++/11551 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index a76d2ac..4bda8da 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 0000000..8c05e1b --- /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; +} |