mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-21 04:50:24 +08:00
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
This commit is contained in:
parent
9938b5d971
commit
5f7262e693
@ -1,3 +1,11 @@
|
||||
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>
|
||||
|
||||
PR c++/10496
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
20
gcc/testsuite/g++.dg/conversion/cond3.C
Normal file
20
gcc/testsuite/g++.dg/conversion/cond3.C
Normal file
@ -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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user