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

Reply via email to