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