On Fri, Jan 22, 2016 at 12:06 AM, Andrew MacLeod <amacl...@redhat.com> wrote:
> I was trying the ttype prototype for static type checking on fold-const.c to
> see how long it would take me to convert such a large file, and it choked on
> this snippet of code in fold_unary_loc, around lines 7690-7711:
>
> suspect code tagged with (*)
>
>          if ((CONVERT_EXPR_CODE_P (code)
>                || code == NON_LVALUE_EXPR)
>               && TREE_CODE (tem) == COND_EXPR
>               && TREE_CODE (TREE_OPERAND (tem, 1)) == code
>               && TREE_CODE (TREE_OPERAND (tem, 2)) == code
>   (*)          && ! VOID_TYPE_P (TREE_OPERAND (tem, 1))
>   (*)          && ! VOID_TYPE_P (TREE_OPERAND (tem, 2))
>               && (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1), 0))
>                   == TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 2), 0)))
>               && (! (INTEGRAL_TYPE_P (TREE_TYPE (tem))
>                      && (INTEGRAL_TYPE_P
>                          (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (tem, 1),
> 0))))
>                      && TYPE_PRECISION (TREE_TYPE (tem)) <= BITS_PER_WORD)
>                   || flag_syntax_only))
>             tem = build1_loc (loc, code, type,
>                               build3 (COND_EXPR,
>                                       TREE_TYPE (TREE_OPERAND
>                                                  (TREE_OPERAND (tem, 1),
> 0)),
>                                       TREE_OPERAND (tem, 0),
>                                       TREE_OPERAND (TREE_OPERAND (tem, 1),
> 0),
>                                       TREE_OPERAND (TREE_OPERAND (tem, 2),
>                                                     0)));
>
> and with:
> #define VOID_TYPE_P(NODE)  (TREE_CODE (NODE) == VOID_TYPE)
>
> I don't think this is what was intended. it would expand into:
>
>               && TREE_CODE (TREE_OPERAND (tem, 1)) == code
>               && TREE_CODE (TREE_OPERAND (tem, 2)) == code
>                && ! (TREE_CODE (TREE_OPERAND (tem, 1)) == VOID_TYPE)
>                && ! (TREE_CODE (TREE_OPERAND (tem, 2)) == VOID_TYPE)
>
> the latter two would be obviously true if the first 2 were true.
>
> My guess is this is probably suppose to be
> && ! VOID_TYPE_P (TREE_TYPE (TREE_OPERAND (tem, 1)))
>  && ! VOID_TYPE_P (TREE_TYPE (TREE_OPERAND (tem, 2)))
>
> but I'm not sure.   Any guesses whats intended here?

Not sure, it might be to detect some of the x ? : throw () constructs
but not sure how those would survive the previous == code check.
Maybe a ? (void) ... : (void) ... is supposed to be detected.

The type check below would catch that as well
(huh?  a flag_syntax_only check in fold-const.c!?)

I'd say change to ! VOID_TYPE_P (TREE_TYPE (TREE_OPERAND (tem, 1))
to match what the VOID_TYPE_P check does above this block.

Richard.

> Andrew
>
>

Reply via email to