Browse Source

* Fix tgeneric91, need to postpone some additional generic procedures

Michaël Van Canneyt 1 year ago
parent
commit
22de07446d
3 changed files with 14 additions and 3 deletions
  1. 8 0
      compiler/fmodule.pas
  2. 5 2
      compiler/pgenutil.pas
  3. 1 1
      compiler/pmodules.pas

+ 8 - 0
compiler/fmodule.pas

@@ -272,6 +272,7 @@ interface
         procedure add_public_asmsym(const name:TSymStr;bind:TAsmsymbind;typ:Tasmsymtype);
         procedure add_public_asmsym(const name:TSymStr;bind:TAsmsymbind;typ:Tasmsymtype);
         procedure add_extern_asmsym(sym:TAsmSymbol);
         procedure add_extern_asmsym(sym:TAsmSymbol);
         procedure add_extern_asmsym(const name:TSymStr;bind:TAsmsymbind;typ:Tasmsymtype);
         procedure add_extern_asmsym(const name:TSymStr;bind:TAsmsymbind;typ:Tasmsymtype);
+        procedure remove_from_waitingforunits(amodule : tmodule);
         property ImportLibraryList : TFPHashObjectList read FImportLibraryList;
         property ImportLibraryList : TFPHashObjectList read FImportLibraryList;
         function ToString: RTLString; override;
         function ToString: RTLString; override;
       end;
       end;
@@ -1359,6 +1360,13 @@ implementation
         tasmsymbol.create(externasmsyms,name,bind,typ);
         tasmsymbol.create(externasmsyms,name,bind,typ);
       end;
       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;
     function tmodule.ToString: RTLString;
       begin
       begin
         // Assigned self so we can detect nil.
         // Assigned self so we can detect nil.

+ 5 - 2
compiler/pgenutil.pas

@@ -2865,8 +2865,11 @@ uses
                   ) and
                   ) and
                   { may not be assigned in case it's a synthetic procdef that
                   { may not be assigned in case it's a synthetic procdef that
                     still needs to be generated }
                     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
                  begin
                    result:=false;
                    result:=false;
                    continue;
                    continue;

+ 1 - 1
compiler/pmodules.pas

@@ -1733,7 +1733,7 @@ type
         for i:=0 to module.waitingunits.count-1 do
         for i:=0 to module.waitingunits.count-1 do
           begin
           begin
             waitingmodule:=tmodule(module.waitingunits[i]);
             waitingmodule:=tmodule(module.waitingunits[i]);
-            waitingmodule.waitingforunit.remove(module);
+            waitingmodule.remove_from_waitingforunits(module);
           end;
           end;
 
 
 {$ifdef DEBUG_NODE_XML}
 {$ifdef DEBUG_NODE_XML}