diff --git a/.gitattributes b/.gitattributes index 7e9d19117f..c71ae963a2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10654,6 +10654,7 @@ tests/webtbs/tw1735.pp svneol=native#text/plain tests/webtbs/tw1737.pp svneol=native#text/plain tests/webtbs/tw17379.pp svneol=native#text/plain tests/webtbs/tw17379a.pp svneol=native#text/plain +tests/webtbs/tw17413.pp svneol=native#text/plain tests/webtbs/tw1744.pp svneol=native#text/plain tests/webtbs/tw1754c.pp svneol=native#text/plain tests/webtbs/tw1755.pp svneol=native#text/plain diff --git a/compiler/ncgld.pas b/compiler/ncgld.pas index 1b148b1aad..633edfabe3 100644 --- a/compiler/ncgld.pas +++ b/compiler/ncgld.pas @@ -96,7 +96,9 @@ implementation { stored in memory... } (tabstractnormalvarsym(tloadnode(n).symtableentry).localloc.loc in [LOC_REFERENCE]) and { ... at the place we are looking for } - references_equal(tabstractnormalvarsym(tloadnode(n).symtableentry).localloc.reference,rr^.old^) then + references_equal(tabstractnormalvarsym(tloadnode(n).symtableentry).localloc.reference,rr^.old^) and + { its address cannot have escaped the current routine } + not(tabstractvarsym(tloadnode(n).symtableentry).addr_taken) then begin { relocate variable } tcgloadnode(n).changereflocation(rr^.new^); @@ -109,7 +111,9 @@ implementation { memory temp... } (ttemprefnode(n).tempinfo^.location.loc in [LOC_REFERENCE]) and { ... at the place we are looking for } - references_equal(ttemprefnode(n).tempinfo^.location.reference,rr^.old^) then + references_equal(ttemprefnode(n).tempinfo^.location.reference,rr^.old^) and + { its address cannot have escaped the current routine } + not(ti_addr_taken in ttemprefnode(n).tempinfo^.flags) then begin { relocate the temp } tcgtemprefnode(n).changelocation(rr^.new^); diff --git a/tests/webtbs/tw17413.pp b/tests/webtbs/tw17413.pp new file mode 100644 index 0000000000..21add7346c --- /dev/null +++ b/tests/webtbs/tw17413.pp @@ -0,0 +1,48 @@ +{$mode objfpc} +{$H+} + +uses SysUtils; + +type + TVector3Single = array [0..2] of Single; + +function Vector3Single(const X, Y, Z: Single): TVector3Single; +begin + Result[0] := X; + Result[1] := Y; + Result[2] := Z; +end; + +var + res1, res2, res3: single; + +procedure RenderFromViewEverything; +var + Normal: TVector3Single; + + procedure DoTexCoordVertex(const Vertex: TVector3Single); + begin + Writeln('Normal: ', Normal[0]:1:1, ' ', Normal[1]:1:1, ' ', Normal[2]:1:1); + if (normal[0]<>res1) or + (normal[1]<>res2) or + (normal[2]<>res3) then + halt(1); + end; + +begin + res1:=123; + res2:=456; + res3:=789; + Normal := Vector3Single(123, 456, 789); + DoTexCoordVertex(Vector3Single(111, 222, 333)); + + res1:=987; + res2:=654; + res3:=321; + Normal := Vector3Single(987, 654, 321); + DoTexCoordVertex(Vector3Single(444, 555, 666)); +end; + +begin + RenderFromViewEverything; +end.