Commit 5f7262e6 by Jason Merrill Committed by Jason Merrill

re PR c++/9537 ([New parser] problem handling const return types)

        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.

From-SVN: r66502
parent 9938b5d9
2003-05-05 Jason Merrill <jason@redhat.com>
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 <lerdsuwa@users.sourceforge.net> 2003-05-05 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/10496 PR c++/10496
......
...@@ -3187,7 +3187,10 @@ conditional_conversion (tree e1, tree e2) ...@@ -3187,7 +3187,10 @@ conditional_conversion (tree e1, tree e2)
same cv-qualification as, or a greater cv-qualification than, the same cv-qualification as, or a greater cv-qualification than, the
cv-qualification of T1. If the conversion is applied, E1 is cv-qualification of T1. If the conversion is applied, E1 is
changed to an rvalue of type T2 that still refers to the original 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) if (CLASS_TYPE_P (t1) && CLASS_TYPE_P (t2)
&& same_or_base_type_p (TYPE_MAIN_VARIANT (t2), && same_or_base_type_p (TYPE_MAIN_VARIANT (t2),
TYPE_MAIN_VARIANT (t1))) TYPE_MAIN_VARIANT (t1)))
...@@ -3197,7 +3200,12 @@ conditional_conversion (tree e1, tree e2) ...@@ -3197,7 +3200,12 @@ conditional_conversion (tree e1, tree e2)
conv = build1 (IDENTITY_CONV, t1, e1); conv = build1 (IDENTITY_CONV, t1, e1);
if (!same_type_p (TYPE_MAIN_VARIANT (t1), if (!same_type_p (TYPE_MAIN_VARIANT (t1),
TYPE_MAIN_VARIANT (t2))) 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; return conv;
} }
else else
...@@ -3337,11 +3345,8 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3) ...@@ -3337,11 +3345,8 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
{ {
arg2 = convert_like (conv2, arg2); arg2 = convert_like (conv2, arg2);
arg2 = convert_from_reference (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)) if (!same_type_p (TREE_TYPE (arg2), arg3_type))
arg2 = convert (arg3_type, arg2); abort ();
arg2_type = TREE_TYPE (arg2); arg2_type = TREE_TYPE (arg2);
} }
else if (conv3 && !ICS_BAD_FLAG (conv3)) else if (conv3 && !ICS_BAD_FLAG (conv3))
...@@ -3349,7 +3354,7 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3) ...@@ -3349,7 +3354,7 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
arg3 = convert_like (conv3, arg3); arg3 = convert_like (conv3, arg3);
arg3 = convert_from_reference (arg3); arg3 = convert_from_reference (arg3);
if (!same_type_p (TREE_TYPE (arg3), arg2_type)) if (!same_type_p (TREE_TYPE (arg3), arg2_type))
arg3 = convert (arg2_type, arg3); abort ();
arg3_type = TREE_TYPE (arg3); arg3_type = TREE_TYPE (arg3);
} }
} }
......
// 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;
}
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