Browse Source

pgenutil.pas, parse_generic_parameters:
* no longer create the type symbol and the defs as registered
pdecl.pas, types_dec:
* register the syms and defs of the parsed generic parameters

git-svn-id: trunk@31758 -

svenbarth 10 năm trước cách đây
mục cha
commit
e8c68a09c1
2 tập tin đã thay đổi với 13 bổ sung5 xóa
  1. 8 0
      compiler/pdecl.pas
  2. 5 5
      compiler/pgenutil.pas

+ 8 - 0
compiler/pdecl.pas

@@ -444,6 +444,7 @@ implementation
          p:tnode;
          gendef : tstoreddef;
          s : shortstring;
+         i : longint;
 {$ifdef x86}
          segment_register: string;
 {$endif x86}
@@ -482,6 +483,13 @@ implementation
                generictypelist:=parse_generic_parameters(true);
                consume(_RSHARPBRACKET);
 
+               { we are not freeing the type parameters, so register them }
+               for i:=0 to generictypelist.count-1 do
+                 begin
+                    ttypesym(generictypelist[i]).register_sym;
+                    tstoreddef(ttypesym(generictypelist[i]).typedef).register_def;
+                 end;
+
                str(generictypelist.Count,s);
                gentypename:=typename+'$'+s;
                genorgtypename:=orgtypename+'$'+s;

+ 5 - 5
compiler/pgenutil.pas

@@ -1080,7 +1080,7 @@ uses
         repeat
           if token=_ID then
             begin
-              generictype:=ctypesym.create(orgpattern,cundefinedtype,true);
+              generictype:=ctypesym.create(orgpattern,cundefinedtype,false);
               { type parameters need to be added as strict private }
               generictype.visibility:=vis_strictprivate;
               include(generictype.symoptions,sp_generic_para);
@@ -1188,7 +1188,7 @@ uses
                     if (basedef.typ<>objectdef) or
                         not (tobjectdef(basedef).objecttype in [odt_javaclass,odt_class]) then
                       internalerror(2012101101);
-                  basedef:=cobjectdef.create(tobjectdef(basedef).objecttype,defname,tobjectdef(basedef),true);
+                  basedef:=cobjectdef.create(tobjectdef(basedef).objecttype,defname,tobjectdef(basedef),false);
                   for i:=0 to constraintdata.interfaces.count-1 do
                     tobjectdef(basedef).implementedinterfaces.add(
                       timplementedinterface.create(tobjectdef(constraintdata.interfaces[i])));
@@ -1199,7 +1199,7 @@ uses
                     if basedef.typ<>errordef then
                       internalerror(2013021601);
                     def:=tdef(constraintdata.interfaces[0]);
-                    basedef:=cobjectdef.create(tobjectdef(def).objecttype,defname,tobjectdef(def),true);
+                    basedef:=cobjectdef.create(tobjectdef(def).objecttype,defname,tobjectdef(def),false);
                     constraintdata.interfaces.delete(0);
                   end;
               if basedef.typ<>errordef then
@@ -1228,7 +1228,7 @@ uses
                   { two different typeless parameters are considered as incompatible }
                   for i:=firstidx to result.count-1 do
                     begin
-                      ttypesym(result[i]).typedef:=cundefineddef.create(true);
+                      ttypesym(result[i]).typedef:=cundefineddef.create(false);
                       ttypesym(result[i]).typedef.typesym:=ttypesym(result[i]);
                     end;
                   { a semicolon terminates a type parameter group }
@@ -1239,7 +1239,7 @@ uses
         { two different typeless parameters are considered as incompatible }
         for i:=firstidx to result.count-1 do
           begin
-            ttypesym(result[i]).typedef:=cundefineddef.create(true);
+            ttypesym(result[i]).typedef:=cundefineddef.create(false);
             ttypesym(result[i]).typedef.typesym:=ttypesym(result[i]);
           end;
         block_type:=old_block_type;