Am 18.05.2018 um 17:15 schrieb Sven Barth via fpc-devel:
> Martok <list...@martoks-place.de <mailto:list...@martoks-place.de>> schrieb 
> am Fr., 18. Mai 2018, 15:40:
> 
>     > Citation: "If the loop was terminated prematurely with an exception or a
>     > break statement, the loop variable retains the value it had when the
>     > loop was exited."
>     As a quick fix, not unrolling loops left with exit at least fixes this 
> specific
>     situation. This still leaves exceptions raised, but IIRC the handlers 
> don't
>     restore context anyways, we might be okay?
> 
>     diff --git a/compiler/optloop.pas b/compiler/optloop.pas
>     index 46039ffc5a..dc714ea2cc 100644
>     --- a/compiler/optloop.pas
>     +++ b/compiler/optloop.pas
>     @@ -76,7 +76,7 @@ unit optloop;
> 
>          function checkbreakcontinue(var n:tnode; arg: pointer): 
> foreachnoderesult;
>            begin
>     -        if n.nodetype in [breakn,continuen] then
>     +        if n.nodetype in [breakn,continuen,exitn] then
>                result:=fen_norecurse_true
>              else
>                result:=fen_false;
> 
>     I'll be running this on today's snapshot, see if anything else remains.
> 
> 
> Maybe it should also check for goto and at least explicit raise statements? 

I added raise, exit, goto and label as well.

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to