Commit 442aa4ec by Mark Mitchell Committed by Mark Mitchell

call.c (build_conditional_expr): Call convert_from_reference to avoid…

call.c (build_conditional_expr): Call convert_from_reference to avoid reference/non-reference type confusion.

	* call.c (build_conditional_expr): Call convert_from_reference to
	avoid reference/non-reference type confusion.  Fix typo.

From-SVN: r28353
parent 278a994d
1999-07-30 Mark Mitchell <mark@codesourcery.com>
* call.c (build_conditional_expr): Call convert_from_reference to
avoid reference/non-reference type confusion. Fix typo.
1999-07-30 Richard Henderson <rth@cygnus.com> 1999-07-30 Richard Henderson <rth@cygnus.com>
* typeck2.c (initializer_constant_valid_p): Moved to c-common.c. * typeck2.c (initializer_constant_valid_p): Moved to c-common.c.
......
...@@ -2734,10 +2734,9 @@ conditional_conversion (e1, e2) ...@@ -2734,10 +2734,9 @@ conditional_conversion (e1, e2)
} }
/* Implement [expr.cond]. ARG1, ARG2, and ARG3 are the three /* Implement [expr.cond]. ARG1, ARG2, and ARG3 are the three
arguments to the conditional expression. As an extension, g++ arguments to the conditional expression. By the time this function
allows users to overload the ?: operator. By the time this is called, any suitable candidate functions are included in
function is called, any suitable candidate functions are included CANDIDATES. */
in CANDIDATES. */
tree tree
build_conditional_expr (arg1, arg2, arg3) build_conditional_expr (arg1, arg2, arg3)
...@@ -2780,6 +2779,11 @@ build_conditional_expr (arg1, arg2, arg3) ...@@ -2780,6 +2779,11 @@ build_conditional_expr (arg1, arg2, arg3)
_conv_). */ _conv_). */
arg1 = cp_convert (boolean_type_node, arg1); arg1 = cp_convert (boolean_type_node, arg1);
/* Convert from reference types to ordinary types; no expressions
really have reference type in C++. */
arg2 = convert_from_reference (arg2);
arg3 = convert_from_reference (arg3);
/* [expr.cond] /* [expr.cond]
If either the second or the third operand has type (possibly If either the second or the third operand has type (possibly
...@@ -2867,6 +2871,7 @@ build_conditional_expr (arg1, arg2, arg3) ...@@ -2867,6 +2871,7 @@ build_conditional_expr (arg1, arg2, arg3)
else if (conv2 && !ICS_BAD_FLAG (conv2)) else if (conv2 && !ICS_BAD_FLAG (conv2))
{ {
arg2 = convert_like (conv2, arg2); arg2 = convert_like (conv2, arg2);
arg2 = convert_from_reference (arg2);
/* That may not quite have done the trick. If the two types /* That may not quite have done the trick. If the two types
are cv-qualified variants of one another, we will have are cv-qualified variants of one another, we will have
just used an IDENTITY_CONV. (There's no conversion from just used an IDENTITY_CONV. (There's no conversion from
...@@ -2881,8 +2886,9 @@ build_conditional_expr (arg1, arg2, arg3) ...@@ -2881,8 +2886,9 @@ build_conditional_expr (arg1, arg2, arg3)
else if (conv3 && !ICS_BAD_FLAG (conv3)) else if (conv3 && !ICS_BAD_FLAG (conv3))
{ {
arg3 = convert_like (conv3, 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))
arg2 = build1 (NOP_EXPR, arg2_type, arg3); arg3 = build1 (NOP_EXPR, arg2_type, arg3);
arg3_type = TREE_TYPE (arg3); arg3_type = TREE_TYPE (arg3);
} }
} }
...@@ -2891,8 +2897,6 @@ build_conditional_expr (arg1, arg2, arg3) ...@@ -2891,8 +2897,6 @@ build_conditional_expr (arg1, arg2, arg3)
If the second and third operands are lvalues and have the same If the second and third operands are lvalues and have the same
type, the result is of that type and is an lvalue. */ type, the result is of that type and is an lvalue. */
arg2_type = non_reference (arg2_type);
arg3_type = non_reference (arg3_type);
if (real_lvalue_p (arg2) && real_lvalue_p (arg3) && if (real_lvalue_p (arg2) && real_lvalue_p (arg3) &&
same_type_p (arg2_type, arg3_type)) same_type_p (arg2_type, arg3_type))
{ {
......
// Build don't link:
// Origin: Loring Holden <lsh@cs.brown.edu>
class Wtransf {};
const Wtransf Identity2k;
class HELPER {
public:
int current() const { return 0; }
};
void
problem_function()
{
HELPER tm;
Wtransf delta = (tm.current()) ? Identity2 : Wtransf();
}
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