RFC: PR 19650

Roger Sayle roger@eyesopen.com
Fri Jan 28 02:27:00 GMT 2005


On Thu, 27 Jan 2005, Dale Johannesen wrote:
> I'm not sure where in the twisty little passages this should be fixed,
> but fold_binary_op_with_conditional_arg is taking a type from the
> EQ_EXPR, even though that should always be boolean (right)?  Which is
> suspicious, and I'm inclined to think it should be using the input type
> instead.
>
> Does this look like the right approach?

Ahh, the perils of STRIP_NOPS.  Firstly, the type that corresponds to
the result of EQ_EXPR is defined by the front-end, "bool" in C++, "int"
in C, and even several different LOGICAL(n) types in the gfortran
front-ends, so "fold" should always be using the type of the EQ_EXPR.

However, the problem is that we've lost the NOP_EXPR cast from bool
to "unsigned long" thanks to STRIP_NOPS.  This stripping may also have
affected COND_EXPRs in addition to relational operations, so I think
the appropriate fix is actually something like:


    if (lhs == 0)
+     {
+	true_value = fold_convert (type, true_value);
!       lhs = fold (cond_first_p ? build2 (code, type, true_value, arg)
!                                 : build2 (code, type, arg, true_value));
+     }
    if (rhs == 0)
+     {
+       false_value = fold_convert (type, false_value);
!       rhs = fold (cond_first_p ? build2 (code, type, false_value, arg)
!                                : build2 (code, type, arg, false_value));
+     }


This should avoid potential problems with true_value or false_value
being "void" in a COND_EXPR, and matches the intended semantics.

Could you see if this untested suggestion works for you?

Roger
--



More information about the Gcc mailing list