From: jason Date: Mon, 5 May 2003 21:11:13 +0000 (+0000) Subject: PR c++/9537 X-Git-Url: http://git.sourceforge.jp/view?a=commitdiff_plain;h=09e3adf61c50fa8e8d1a59c65541f5956283b9ca;p=pf3gnuchains%2Fgcc-fork.git PR c++/9537 * call.c (conditional_conversion): Build an RVALUE_CONV if we're just changing the cv-quals. (build_conditional_expr): Don't call convert to change cv-quals. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@66502 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3567da7c0b2..40a4de12532 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2003-05-05 Jason Merrill + + PR c++/9537 + * call.c (conditional_conversion): Build an RVALUE_CONV if + we're just changing the cv-quals. + (build_conditional_expr): Don't call convert to change + cv-quals. + 2003-05-05 Kriang Lerdsuwanakij PR c++/10496 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 2340d41f6a0..44683ff5b83 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -3187,7 +3187,10 @@ conditional_conversion (tree e1, tree e2) same cv-qualification as, or a greater cv-qualification than, the cv-qualification of T1. If the conversion is applied, E1 is changed to an rvalue of type T2 that still refers to the original - source class object (or the appropriate subobject thereof). */ + source class object (or the appropriate subobject thereof). + + FIXME we can't express an rvalue that refers to the original object; + we have to create a new one. */ if (CLASS_TYPE_P (t1) && CLASS_TYPE_P (t2) && same_or_base_type_p (TYPE_MAIN_VARIANT (t2), TYPE_MAIN_VARIANT (t1))) @@ -3197,7 +3200,12 @@ conditional_conversion (tree e1, tree e2) conv = build1 (IDENTITY_CONV, t1, e1); if (!same_type_p (TYPE_MAIN_VARIANT (t1), TYPE_MAIN_VARIANT (t2))) - conv = build_conv (BASE_CONV, t2, conv); + { + conv = build_conv (BASE_CONV, t2, conv); + NEED_TEMPORARY_P (conv) = 1; + } + else + conv = build_conv (RVALUE_CONV, t2, conv); return conv; } else @@ -3337,11 +3345,8 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3) { arg2 = convert_like (conv2, arg2); arg2 = convert_from_reference (arg2); - /* That may not quite have done the trick. If the two types - are cv-qualified variants of one another, we will have - just used an IDENTITY_CONV. */ if (!same_type_p (TREE_TYPE (arg2), arg3_type)) - arg2 = convert (arg3_type, arg2); + abort (); arg2_type = TREE_TYPE (arg2); } else if (conv3 && !ICS_BAD_FLAG (conv3)) @@ -3349,7 +3354,7 @@ 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)) - arg3 = convert (arg2_type, arg3); + abort (); arg3_type = TREE_TYPE (arg3); } } diff --git a/gcc/testsuite/g++.dg/conversion/cond3.C b/gcc/testsuite/g++.dg/conversion/cond3.C new file mode 100644 index 00000000000..da052d453fb --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/cond3.C @@ -0,0 +1,20 @@ +// PR c++/9537 + +class String +{ +public: + String(); + String( char *str ); + operator char *(); +}; + +const String operator+( String s1, String ) +{ + return s1; +} + +String valGlue(const String before) +{ + String ret; + return false ? ret : before + before; +}