Browse Source

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 years ago
parent
commit
c17a8d36ae
2 changed files with 23 additions and 1 deletions
  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;