Forráskód Böngészése

--- Merging r40202 into '.':
U compiler/ncal.pas
U compiler/optdfa.pas
A tests/webtbs/tw34438.pp
--- Recording mergeinfo for merge of r40202 into '.':
U .

git-svn-id: branches/fixes_3_2@40740 -

florian 6 éve
szülő
commit
0ad0cefeb3
4 módosított fájl, 52 hozzáadás és 1 törlés
  1. 1 0
      .gitattributes
  2. 8 1
      compiler/ncal.pas
  3. 1 0
      compiler/optdfa.pas
  4. 42 0
      tests/webtbs/tw34438.pp

+ 1 - 0
.gitattributes

@@ -16270,6 +16270,7 @@ tests/webtbs/tw3435.pp svneol=native#text/plain
 tests/webtbs/tw34380.pp svneol=native#text/plain
 tests/webtbs/tw34380.pp svneol=native#text/plain
 tests/webtbs/tw3441.pp svneol=native#text/plain
 tests/webtbs/tw3441.pp svneol=native#text/plain
 tests/webtbs/tw3443.pp svneol=native#text/plain
 tests/webtbs/tw3443.pp svneol=native#text/plain
+tests/webtbs/tw34438.pp svneol=native#text/pascal
 tests/webtbs/tw3444.pp svneol=native#text/plain
 tests/webtbs/tw3444.pp svneol=native#text/plain
 tests/webtbs/tw3456.pp svneol=native#text/plain
 tests/webtbs/tw3456.pp svneol=native#text/plain
 tests/webtbs/tw3457.pp svneol=native#text/plain
 tests/webtbs/tw3457.pp svneol=native#text/plain

+ 8 - 1
compiler/ncal.pas

@@ -4849,11 +4849,16 @@ implementation
         ptrtype: tdef;
         ptrtype: tdef;
         tempnode: ttempcreatenode;
         tempnode: ttempcreatenode;
         paraaddr: taddrnode;
         paraaddr: taddrnode;
+        isfuncretnode : boolean;
       begin
       begin
         ptrtype:=cpointerdef.getreusable(para.left.resultdef);
         ptrtype:=cpointerdef.getreusable(para.left.resultdef);
         tempnode:=ctempcreatenode.create(ptrtype,ptrtype.size,tt_persistent,true);
         tempnode:=ctempcreatenode.create(ptrtype,ptrtype.size,tt_persistent,true);
         addstatement(inlineinitstatement,tempnode);
         addstatement(inlineinitstatement,tempnode);
-        addstatement(inlinecleanupstatement,ctempdeletenode.create(tempnode));
+        isfuncretnode:=nf_is_funcret in para.left.flags;
+        if isfuncretnode then
+          addstatement(inlinecleanupstatement,ctempdeletenode.create_normal_temp(tempnode))
+        else
+          addstatement(inlinecleanupstatement,ctempdeletenode.create(tempnode));
         { inherit addr_taken flag }
         { inherit addr_taken flag }
         if (tabstractvarsym(para.parasym).addr_taken) then
         if (tabstractvarsym(para.parasym).addr_taken) then
           tempnode.includetempflag(ti_addr_taken);
           tempnode.includetempflag(ti_addr_taken);
@@ -4865,6 +4870,8 @@ implementation
         addstatement(inlineinitstatement,cassignmentnode.create(ctemprefnode.create(tempnode),
         addstatement(inlineinitstatement,cassignmentnode.create(ctemprefnode.create(tempnode),
           paraaddr));
           paraaddr));
         para.left:=cderefnode.create(ctemprefnode.create(tempnode));
         para.left:=cderefnode.create(ctemprefnode.create(tempnode));
+        if isfuncretnode then
+          Include(para.left.flags,nf_is_funcret);
       end;
       end;
 
 
 
 

+ 1 - 0
compiler/optdfa.pas

@@ -383,6 +383,7 @@ unit optdfa;
             temprefn,
             temprefn,
             loadn,
             loadn,
             typeconvn,
             typeconvn,
+            derefn,
             assignn:
             assignn:
               begin
               begin
                 if not(assigned(node.optinfo^.def)) and
                 if not(assigned(node.optinfo^.def)) and

+ 42 - 0
tests/webtbs/tw34438.pp

@@ -0,0 +1,42 @@
+{%norun}
+{$mode objfpc}
+uses
+  types,math;
+
+type
+  PGtkWidget = pointer;
+  PGtkNotebook = pointer;
+
+function MyRect(Left,Top,Right,Bottom : Integer) : TRect; inline;
+
+begin
+  MyRect.Left:=Left;
+  MyRect.Top:=Top;
+  MyRect.Right:=Right;
+  MyRect.Bottom:=Bottom;
+end;
+
+function GetWidgetClientRect(TheWidget: PGtkWidget): TRect;
+var
+  Widget, ClientWidget: PGtkWidget;
+  AChild: PGtkWidget;
+
+  procedure GetNoteBookClientRect(NBWidget: PGtkNotebook);
+  var
+    PageIndex: LongInt;
+    PageWidget: PGtkWidget;
+    FrameBorders: TRect;
+    aWidth: LongInt;
+    aHeight: LongInt;
+  begin
+      Result:=MyRect(0,0,
+         Max(0,AWidth-FrameBorders.Left-FrameBorders.Right),
+         Max(0,aHeight-FrameBorders.Top-FrameBorders.Bottom));
+  end;
+
+begin
+end;
+
+
+begin
+end.