diff options
author | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2017-05-12 14:07:13 +0000 |
---|---|---|
committer | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2017-05-12 14:07:13 +0000 |
commit | a84201be28fbcaeb0cb73f86bc0f36bf96b11cc9 (patch) | |
tree | c1359ac4be7b08aa390d998e072b996262bc66bb /compiler/optloadmodifystore.pas | |
parent | 5b32f77e385978d36dafdfb2b24d3e5fc5aa6616 (diff) | |
download | fpc-a84201be28fbcaeb0cb73f86bc0f36bf96b11cc9.tar.gz |
* use current node's localswitches field for checking whether range and overflow
checking is on, when handling the inc/dec inline nodes, instead of using
current_settings.localswitches
* when creating inline nodes in the optloadmodifystore optimization pass, copy
localswitches from the node, that is being replaced, because otherwise,
localswitches is copied from current_settings.localswitches at the time the
new node is created, and that can already be in a different state, since
optloadmodifystore is performed in a separate pass, after the current
procedure has already been parsed and in this moment, it reflects the state
of localswitches after the end of the procedure.
* these two fixes fix a bug, where an internalerror 2017032701 can happen, when
compiling with -O3 code that turns on and off range/overflow checking in the
middle of a procedure.
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@36195 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/optloadmodifystore.pas')
-rw-r--r-- | compiler/optloadmodifystore.pas | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/compiler/optloadmodifystore.pas b/compiler/optloadmodifystore.pas index eadf64ab7e..fb3b0fefd7 100644 --- a/compiler/optloadmodifystore.pas +++ b/compiler/optloadmodifystore.pas @@ -62,6 +62,7 @@ unit optloadmodifystore; result:=cinlinenode.createintern( newinlinenodetype,false,ccallparanode.create( tinlinenode(right).left,nil)); + result.localswitches:=localswitches; tinlinenode(right).left:=nil; exit; end; @@ -101,6 +102,7 @@ unit optloadmodifystore; result:=cinlinenode.createintern( newinlinenodetype,false,ccallparanode.create( taddnode(right).right,ccallparanode.create(taddnode(right).left,nil))); + result.localswitches:=localswitches; taddnode(right).left:=nil; taddnode(right).right:=nil; exit; @@ -155,6 +157,7 @@ unit optloadmodifystore; result:=cinlinenode.createintern( newinlinenodetype,false,ccallparanode.create( taddnode(ttypeconvnode(right).left).right,ccallparanode.create(ttypeconvnode(taddnode(ttypeconvnode(right).left).left).left,nil))); + result.localswitches:=localswitches; ttypeconvnode(taddnode(ttypeconvnode(right).left).left).left:=nil; taddnode(ttypeconvnode(right).left).right:=nil; exit; @@ -192,6 +195,7 @@ unit optloadmodifystore; result:=cinlinenode.createintern( newinlinenodetype,false,ccallparanode.create( taddnode(right).left,ccallparanode.create(taddnode(right).right,nil))); + result.localswitches:=localswitches; taddnode(right).right:=nil; taddnode(right).left:=nil; exit; @@ -243,6 +247,7 @@ unit optloadmodifystore; result:=cinlinenode.createintern( newinlinenodetype,false,ccallparanode.create( taddnode(ttypeconvnode(right).left).left,ccallparanode.create(ttypeconvnode(taddnode(ttypeconvnode(right).left).right).left,nil))); + result.localswitches:=localswitches; ttypeconvnode(taddnode(ttypeconvnode(right).left).right).left:=nil; taddnode(ttypeconvnode(right).left).left:=nil; exit; @@ -265,6 +270,7 @@ unit optloadmodifystore; newinlinenodetype:=in_neg_assign_x; result:=cinlinenode.createintern( newinlinenodetype,false,tunarynode(right).left); + result.localswitches:=localswitches; tunarynode(right).left:=nil; exit; end; @@ -297,6 +303,7 @@ unit optloadmodifystore; newinlinenodetype:=in_neg_assign_x; result:=cinlinenode.createintern( newinlinenodetype,false,ttypeconvnode(tunarynode(ttypeconvnode(right).left).left).left); + result.localswitches:=localswitches; ttypeconvnode(tunarynode(ttypeconvnode(right).left).left).left:=nil; exit; end; |