diff --git a/compiler/fmodule.pas b/compiler/fmodule.pas index 2e9823b46e..777d2c76ca 100644 --- a/compiler/fmodule.pas +++ b/compiler/fmodule.pas @@ -272,6 +272,7 @@ interface procedure add_public_asmsym(const name:TSymStr;bind:TAsmsymbind;typ:Tasmsymtype); procedure add_extern_asmsym(sym:TAsmSymbol); procedure add_extern_asmsym(const name:TSymStr;bind:TAsmsymbind;typ:Tasmsymtype); + procedure remove_from_waitingforunits(amodule : tmodule); property ImportLibraryList : TFPHashObjectList read FImportLibraryList; function ToString: RTLString; override; end; @@ -1359,6 +1360,13 @@ implementation tasmsymbol.create(externasmsyms,name,bind,typ); end; + procedure tmodule.remove_from_waitingforunits(amodule: tmodule); + begin + // It can be nil after when this is called after end_of_parsing was called. + if assigned(waitingforunit) then + waitingforunit.remove(amodule); + end; + function tmodule.ToString: RTLString; begin // Assigned self so we can detect nil. diff --git a/compiler/pgenutil.pas b/compiler/pgenutil.pas index b8b25b69a0..d9265dc80e 100644 --- a/compiler/pgenutil.pas +++ b/compiler/pgenutil.pas @@ -2865,8 +2865,11 @@ uses ) and { may not be assigned in case it's a synthetic procdef that still needs to be generated } - assigned(tprocdef(hp).genericdef) and - tprocdef(tprocdef(hp).genericdef).forwarddef then + (assigned(tprocdef(hp).genericdef) and + tprocdef(tprocdef(hp).genericdef).forwarddef) + { when the implementation of the module was not yet parsed, it will not yet have a generictokenbuf } + or not assigned(tprocdef(tprocdef(hp).genericdef).generictokenbuf) then + begin result:=false; continue; diff --git a/compiler/pmodules.pas b/compiler/pmodules.pas index 9c72207c35..6e092340bb 100644 --- a/compiler/pmodules.pas +++ b/compiler/pmodules.pas @@ -1733,7 +1733,7 @@ type for i:=0 to module.waitingunits.count-1 do begin waitingmodule:=tmodule(module.waitingunits[i]); - waitingmodule.waitingforunit.remove(module); + waitingmodule.remove_from_waitingforunits(module); end; {$ifdef DEBUG_NODE_XML}