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