On 4/20/20 12:48 PM, Iain Sandoe wrote:
Hi,

Normally, when we find a statement containing an await expression
this will be expanded to a statement list implementing the control
flow implied.  The expansion process successively replaces each
await expression in a statement with the result of its await_resume().

In the case of conditional statements (if, while, do, switch) the
expansion of the condition (or expression in the case of do-while)
cannot take place 'inline', leading to the PR.

The solution is to evaluate the expression separately, and to
transform while and do-while loops into endless loops with a break
on the required condition.

In fixing this, I realised that I'd also made a thinko in the case
of expanding truth-and/or-if expressions, where one arm of the
expression might need to be short-circuited.  The mechanism for
expanding via the tree walk will not work correctly in this case and
we need to pre-expand any truth-and/or-if with an await expression
on its conditionally-taken arm.  This applies to any statement with
truth-and/or-if expressions, so can be handled generically.

This has been tested in various permutations (including without-
checking) on x86_64-darwin, now testing on x86/power Linux.

The testcases do not include the testcase from the PR since that
fails because of PR94661 (it can be included when that’s resolved).

The testcases are appended as a text file.

OK for master, assuming that regstraps on x86/power Linux are OK?
thanks
Iain


gcc/cp/ChangeLog:

2020-04-20  Iain Sandoe  <i...@sandoe.co.uk>

        PR c++/94288
        * coroutines.cc (await_statement_expander): Simplify cases.
        (struct susp_frame_data): Add fields for truth and/or if
        cases, rename one field.
        (analyze_expression_awaits): New.
        (expand_one_truth_if): New.
        (add_var_to_bind): New helper.
        (coro_build_add_if_not_cond_break): New helper.
        (await_statement_walker): Handle conditional expressions,
        handle expansion of truth-and/or-if cases.
        (bind_expr_find_in_subtree): New, checking-only.
        (coro_body_contains_bind_expr_p): New, checking-only.
        (morph_fn_to_coro): Ensure that we have a top level bind
        expression.

ok.

--
Nathan Sidwell

Reply via email to