Jelajahi Sumber

generate_specialization needs to return the correct generic def if the parent classes are parsed, so that that the usage of generic interfaces is allowed.

This fixes the compilation of test tests\test\tgeneric29.pp and the reminder in pdecobj.pas is not needed anymore.

Note: Perhaps this behavior should be enabled in general if "parse_generic" is true (and not only if parse_parent_class if true as well).

git-svn-id: branches/svenbarth/generics@17538 -
svenbarth 14 tahun lalu
induk
melakukan
c17a8d36ae
2 mengubah file dengan 23 tambahan dan 1 penghapusan
  1. 0 1
      compiler/pdecobj.pas
  2. 23 0
      compiler/pgenutil.pas

+ 0 - 1
compiler/pdecobj.pas

@@ -308,7 +308,6 @@ implementation
           begin
              { use single_type instead of id_type for specialize support }
              single_type(hdef,[stoAllowSpecialization,stoParseClassParent]);
-             { TODO : handle a generic interface }
              if (hdef.typ<>objectdef) then
                begin
                   if intf then

+ 23 - 0
compiler/pgenutil.pas

@@ -107,11 +107,34 @@ uses
         if onlyparsepara then
           begin
             consume(_LSHARPBRACKET);
+            gencount:=0;
             repeat
               pt2:=factor(false,true);
               pt2.free;
+              inc(gencount);
             until not try_to_consume(_COMMA);
             consume(_RSHARPBRACKET);
+            if parse_generic and parse_class_parent then
+              begin
+                if df_generic in genericdef.defoptions then
+                  { this happens in non-Delphi modes }
+                  tt:=genericdef
+                else
+                  begin
+                    { find the corresponding generic symbol so that any checks
+                      done on the returned def will be handled correctly }
+                    str(gencount,countstr);
+                    genname:=ttypesym(genericdef.typesym).realname+'$'+countstr;
+                    ugenname:=upper(genname);
+                    if not searchsym(ugenname,srsym,st) or
+                        (srsym.typ<>typesym) then
+                      begin
+                        identifier_not_found(genname);
+                        exit;
+                      end;
+                    tt:=ttypesym(srsym).typedef;
+                  end;
+              end;
             exit;
           end;