On 1/31/19 2:26 AM, Andrei Alexandrescu wrote:
The trouble is major.
Replace "if" with "while":
while (ref_fun(10)) { ... }
==>
{
int __tmp = 10;
while (ref_fun(__tmp)) { ... }
}
That means ref_fun is called with the same lvalue multiple times. In all
likelihood this is not what you want!
Yes, the trouble specifically is loops. Because loops execute their
internal expressions over and over again.
Unfortunately, this means lowering isn't possible. That is, lowering to
something expressible in the normal language isn't possible.
However, we all know that loops are essentially "lowered" in the AST to
simple ifs and gotos. We just need to operate at that level.
So for instance the above looks something like this in AST:
loop_continue:
if(ref_fun(10))
{
...
}
else
goto loop_end;
goto loop_continue;
loop_end:
(I know I'm omitting a lot of extra stuff like scope cleanup, that is
implied here, as I don't know the exact details).
What needs to happen is the temporary (with extra scope)is inserted
between the loop start and the if statement:
loop_continue:
{
int __tmp = 10;
if(ref_fun(__tmp))
{
...
}
else
goto loop_end;
}
goto loop_continue;
loop_end:
A possible retort is: "Of course, while would not be lowered that way,
but a slightly different way!" etc. The point is, ALL OF THAT must be in
the DIP, not assumed obvious or clarified in informal discusson outside
the DIP.
Again: please be thorough, state your assumptions, cover all cases.
Agree, this needs to handle all possible cases. Really I think loops are
the only problems, foreach, for, and while/do..while
A possible way forward is inventing a new syntax to allow declarations
in this space, and then lowering can happen. Something similar to
if(auto x = ...)
-Steve