* don't perform temp substitution for variables whose address has been taken

or that are accessible outside the current block (mantis #17413)

git-svn-id: trunk@15990 -
This commit is contained in:
Jonas Maebe 2010-09-15 12:06:21 +00:00
parent 7a6b26f6e2
commit ac8add7cf9
3 changed files with 55 additions and 2 deletions

1
.gitattributes vendored
View File

@ -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

View File

@ -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^);

48
tests/webtbs/tw17413.pp Normal file
View File

@ -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.