On Fri, 12 May 2017, Marek Polacek wrote:
> In the effort of reducing early folding, we should avoid calling c_fully_fold
> blithely, except when needed for e.g. initializers. This is a teeny tiny step
Note there are several reasons for early folding in the C front end: at
least (a) cases where logically needed (initializers and other places
where constants are needed), (b) because warnings need a folded
expression, (c) when the expression will go somewhere c_fully_fold does
not recurse inside. Also (d) convert, at least, folds regardless of
whether it's actually necessary.
There is a case for avoiding (b) by putting the necessary information in
the IR so the warnings can happen later from c_fully_fold, though there
may be other possible approaches.
> @@ -146,8 +140,7 @@ convert (tree type, tree expr)
>
> case COMPLEX_TYPE:
> /* If converting from COMPLEX_TYPE to a different COMPLEX_TYPE
> - and e is not COMPLEX_EXPR, convert_to_complex uses save_expr,
> - but for the C FE c_save_expr needs to be called instead. */
> + and E is not COMPLEX_EXPR, convert_to_complex uses save_expr. */
> if (TREE_CODE (TREE_TYPE (e)) == COMPLEX_TYPE)
> {
> if (TREE_CODE (e) != COMPLEX_EXPR)
The point of this comment is to explain why we don't just call
convert_to_complex here (see PR 47150). So with your changes it would
seem appropriate to change c-convert.c back to calling convert_to_complex
here.
The changes seem otherwise OK.
--
Joseph S. Myers
[email protected]