2
0
Эх сурвалжийг харах

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

Jonas Maebe 15 жил өмнө
parent
commit
ac8add7cf9

+ 1 - 0
.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

+ 6 - 2
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^);

+ 48 - 0
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.