diff --git a/compiler/ncginl.pas b/compiler/ncginl.pas index 61e7ff7c9b..b750c31ec0 100644 --- a/compiler/ncginl.pas +++ b/compiler/ncginl.pas @@ -639,12 +639,7 @@ implementation procedure tcginlinenode.second_assigned; begin - secondpass(tcallparanode(left).left); - { force left to be an OS_ADDR, since in case of method procvars } - { the size is 2*OS_ADDR (JM) } - cg.a_cmp_const_loc_label(current_asmdata.CurrAsmList,OS_ADDR,OC_NE,0,tcallparanode(left).left.location,current_procinfo.CurrTrueLabel); - cg.a_jmp_always(current_asmdata.CurrAsmList,current_procinfo.CurrFalseLabel); - location_reset(location,LOC_JUMP,OS_NO); + internalerror(2011012501); end; procedure Tcginlinenode.second_get_frame; diff --git a/compiler/ninl.pas b/compiler/ninl.pas index 5df0d8f3f8..9d0b54b996 100644 --- a/compiler/ninl.pas +++ b/compiler/ninl.pas @@ -2258,9 +2258,6 @@ implementation begin { the parser has already made sure the expression is valid } - { there could be a procvar, which is 2*sizeof(pointer), while we } - { must only check the first pointer -> can't just convert to an } - { add node in all cases } set_varstate(tcallparanode(left).left,vs_read,[vsf_must_be_valid]); resultdef:=booltype; end; @@ -2722,7 +2719,17 @@ implementation in_assigned_x: begin - expectloc := LOC_JUMP; + { in case of a complex procvar, only check the "code" pointer } + hp:=tcallparanode(left).left; + { reused } + tcallparanode(left).left:=nil; + if (hp.resultdef.typ=procvardef) and + not tprocvardef(hp.resultdef).is_addressonly then + begin + inserttypeconv_explicit(hp,search_system_type('TMETHOD').typedef); + hp:=csubscriptnode.create(tsym(tabstractrecorddef(hp.resultdef).symtable.find('CODE')),hp); + end; + result:=caddnode.create(unequaln,hp,cnilnode.create); end; in_pred_x,