Browse Source

compiler: implement delphi generic syntax for delphi mode

git-svn-id: trunk@16705 -
paul 14 years ago
parent
commit
4cfcc7ae7b
4 changed files with 36 additions and 5 deletions
  1. 1 0
      .gitattributes
  2. 6 2
      compiler/pdecl.pas
  3. 5 3
      compiler/ptype.pas
  4. 24 0
      tests/test/tgeneric28.pp

+ 1 - 0
.gitattributes

@@ -9417,6 +9417,7 @@ tests/test/tgeneric24.pp svneol=native#text/pascal
 tests/test/tgeneric25.pp svneol=native#text/pascal
 tests/test/tgeneric25.pp svneol=native#text/pascal
 tests/test/tgeneric26.pp svneol=native#text/pascal
 tests/test/tgeneric26.pp svneol=native#text/pascal
 tests/test/tgeneric27.pp svneol=native#text/pascal
 tests/test/tgeneric27.pp svneol=native#text/pascal
+tests/test/tgeneric28.pp svneol=native#text/pascal
 tests/test/tgeneric3.pp svneol=native#text/plain
 tests/test/tgeneric3.pp svneol=native#text/plain
 tests/test/tgeneric4.pp svneol=native#text/plain
 tests/test/tgeneric4.pp svneol=native#text/plain
 tests/test/tgeneric5.pp svneol=native#text/plain
 tests/test/tgeneric5.pp svneol=native#text/plain

+ 6 - 2
compiler/pdecl.pas

@@ -389,13 +389,17 @@ implementation
            generictypelist:=nil;
            generictypelist:=nil;
            generictokenbuf:=nil;
            generictokenbuf:=nil;
 
 
-           { generic declaration? }
-           isgeneric:=try_to_consume(_GENERIC);
+           { fpc generic declaration? }
+           isgeneric:=not(m_delphi in current_settings.modeswitches) and try_to_consume(_GENERIC);
 
 
            typename:=pattern;
            typename:=pattern;
            orgtypename:=orgpattern;
            orgtypename:=orgpattern;
            consume(_ID);
            consume(_ID);
 
 
+           { delphi generic declaration? }
+           if (m_delphi in current_settings.modeswitches) then
+             isgeneric:=token=_LSHARPBRACKET;
+
            { Generic type declaration? }
            { Generic type declaration? }
            if isgeneric then
            if isgeneric then
              begin
              begin

+ 5 - 3
compiler/ptype.pas

@@ -929,9 +929,8 @@ implementation
                    structdef:=tabstractrecorddef(structdef.owner.defowner);
                    structdef:=tabstractrecorddef(structdef.owner.defowner);
                  end;
                  end;
              end;
              end;
-           { Generate a specialization? }
-           if try_to_consume(_SPECIALIZE) then
-             dospecialize:=true;
+           { Generate a specialization in FPC mode? }
+           dospecialize:=not(m_delphi in current_settings.modeswitches) and try_to_consume(_SPECIALIZE);
            { we can't accept a equal in type }
            { we can't accept a equal in type }
            pt1:=comp_expr(false,true);
            pt1:=comp_expr(false,true);
            if not dospecialize and
            if not dospecialize and
@@ -987,6 +986,9 @@ implementation
                if (pt1.nodetype=typen) then
                if (pt1.nodetype=typen) then
                  begin
                  begin
                    def:=ttypenode(pt1).resultdef;
                    def:=ttypenode(pt1).resultdef;
+                   { Delphi mode specialization? }
+                   if (m_delphi in current_settings.modeswitches) then
+                     dospecialize:=token=_LSHARPBRACKET;
                    if dospecialize then
                    if dospecialize then
                      generate_specialization(def)
                      generate_specialization(def)
                    else
                    else

+ 24 - 0
tests/test/tgeneric28.pp

@@ -0,0 +1,24 @@
+{ %norun }
+program tgeneric28;
+{$mode delphi}
+
+// check delphi generic syntax
+
+type
+  TGenericClass<T> = class
+    F: T;
+  end;
+
+  TGenericRecord<T> = record
+    F: T;
+  end;
+
+  TGenericArray<T> = array of T;
+
+var
+  ClassSpecialize: TGenericClass<Integer>;
+  RecordSpecialize: TGenericRecord<Integer>;
+  ArraySpecialize: TGenericArray<Integer>;
+begin
+end.
+