Browse Source

Partially fix for Mantis #22160. This resolves the internal error, but the given example units still don't compile, because of the way we handle specializations and unit loading (more about this once I fixed that, too).

pgenutil.pas, specialization_init:
* don't add implementation units of the generic's unit to the symtable stack if we are specializing in a different unit (thus the generic needs to be defined in the interface section) as there is the possibility that the globalsymtable of an implementation unit is not yet defined if the specialization unit is used in the interface section of an implementation unit

git-svn-id: trunk@21763 -
svenbarth 13 years ago
parent
commit
a908db5a91
1 changed files with 9 additions and 1 deletions
  1. 9 1
      compiler/pgenutil.pas

+ 9 - 1
compiler/pgenutil.pas

@@ -685,10 +685,18 @@ uses
             if sym.typ=unitsym then
             if sym.typ=unitsym then
               unitsyms.add(upper(sym.realname),sym);
               unitsyms.add(upper(sym.realname),sym);
           end;
           end;
-      { add all interface units to the new symtable stack }
+      { add all units if we are specializing inside the current unit (as the
+        generic could have been declared in the implementation part), but load
+        only interface units, if we are in a different unit as then the generic
+        needs to be in the interface section }
       pu:=tused_unit(hmodule.used_units.first);
       pu:=tused_unit(hmodule.used_units.first);
       while assigned(pu) do
       while assigned(pu) do
         begin
         begin
+          if (hmodule<>current_module) and not pu.in_interface then
+            begin
+              pu:=tused_unit(pu.next);
+              continue;
+            end;
           if not assigned(pu.u.globalsymtable) then
           if not assigned(pu.u.globalsymtable) then
             internalerror(200705153);
             internalerror(200705153);
           symtablestack.push(pu.u.globalsymtable);
           symtablestack.push(pu.u.globalsymtable);