|
@@ -3079,6 +3079,8 @@ implementation
|
|
para: tcallparanode;
|
|
para: tcallparanode;
|
|
tempnode: ttempcreatenode;
|
|
tempnode: ttempcreatenode;
|
|
n: tnode;
|
|
n: tnode;
|
|
|
|
+ paraaddr: taddrnode;
|
|
|
|
+ ptrtype: tpointerdef;
|
|
paracomplexity: longint;
|
|
paracomplexity: longint;
|
|
begin
|
|
begin
|
|
{ parameters }
|
|
{ parameters }
|
|
@@ -3197,15 +3199,18 @@ implementation
|
|
{ temp }
|
|
{ temp }
|
|
else if (paracomplexity > 1) then
|
|
else if (paracomplexity > 1) then
|
|
begin
|
|
begin
|
|
- tempnode := ctempcreatenode.create(voidpointertype,voidpointertype.size,tt_persistent,tparavarsym(para.parasym).is_regvar(true));
|
|
|
|
|
|
+ ptrtype:=tpointerdef.create(para.left.resultdef);
|
|
|
|
+ tempnode := ctempcreatenode.create(ptrtype,ptrtype.size,tt_persistent,tparavarsym(para.parasym).is_regvar(true));
|
|
addstatement(inlineinitstatement,tempnode);
|
|
addstatement(inlineinitstatement,tempnode);
|
|
addstatement(inlinecleanupstatement,ctempdeletenode.create(tempnode));
|
|
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
|
|
include(tempnode.tempinfo^.flags,ti_addr_taken);
|
|
include(tempnode.tempinfo^.flags,ti_addr_taken);
|
|
|
|
+ paraaddr:=caddrnode.create_internal(para.left);
|
|
|
|
+ include(paraaddr.flags,nf_typedaddr);
|
|
addstatement(inlineinitstatement,cassignmentnode.create(ctemprefnode.create(tempnode),
|
|
addstatement(inlineinitstatement,cassignmentnode.create(ctemprefnode.create(tempnode),
|
|
- caddrnode.create_internal(para.left)));
|
|
|
|
- para.left := ctypeconvnode.create_internal(cderefnode.create(ctemprefnode.create(tempnode)),para.left.resultdef);
|
|
|
|
|
|
+ paraaddr));
|
|
|
|
+ para.left:=cderefnode.create(ctemprefnode.create(tempnode));
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
para := tcallparanode(para.right);
|
|
para := tcallparanode(para.right);
|