Bläddra i källkod

* allow writeln/readln on generic type parameters

git-svn-id: trunk@14721 -
florian 15 år sedan
förälder
incheckning
20de72b703
4 ändrade filer med 52 tillägg och 6 borttagningar
  1. 2 0
      .gitattributes
  2. 14 6
      compiler/ninl.pas
  3. 16 0
      tests/test/tgeneric19.pp
  4. 20 0
      tests/test/tgeneric20.pp

+ 2 - 0
.gitattributes

@@ -8988,7 +8988,9 @@ tests/test/tgeneric15.pp svneol=native#text/plain
 tests/test/tgeneric16.pp svneol=native#text/plain
 tests/test/tgeneric17.pp svneol=native#text/plain
 tests/test/tgeneric18.pp svneol=native#text/pascal
+tests/test/tgeneric19.pp svneol=native#text/pascal
 tests/test/tgeneric2.pp svneol=native#text/plain
+tests/test/tgeneric20.pp svneol=native#text/pascal
 tests/test/tgeneric3.pp svneol=native#text/plain
 tests/test/tgeneric4.pp svneol=native#text/plain
 tests/test/tgeneric5.pp svneol=native#text/plain

+ 14 - 6
compiler/ninl.pas

@@ -396,7 +396,7 @@ implementation
           readfunctype:=nil;
 
           { can't read/write types }
-          if para.left.nodetype=typen then
+          if (para.left.nodetype=typen) and not(ttypenode(para.left).typedef.typ=undefineddef) then
             begin
               CGMessagePos(para.fileinfo,type_e_cant_read_write_type);
               error_para := true;
@@ -510,8 +510,10 @@ implementation
                         readfunctype:=booltype;
                       end
                   else
-                    CGMessagePos(para.fileinfo,type_e_cant_read_write_type);
-                    error_para := true;
+                    begin
+                      CGMessagePos(para.fileinfo,type_e_cant_read_write_type);
+                      error_para := true;
+                    end;
                 end;
               end;
             variantdef :
@@ -525,10 +527,16 @@ implementation
                     CGMessagePos(para.fileinfo,type_e_cant_read_write_type);
                     error_para := true;
                   end
-              end
+              end;
+            { generic parameter }
+            undefineddef:
+              { don't try to generate any code for a writeln on a generic parameter }
+              error_para:=true;
             else
-              CGMessagePos(para.fileinfo,type_e_cant_read_write_type);
-              error_para := true;
+              begin
+                CGMessagePos(para.fileinfo,type_e_cant_read_write_type);
+                error_para := true;
+              end;
           end;
 
           { check for length/fractional colon para's }

+ 16 - 0
tests/test/tgeneric19.pp

@@ -0,0 +1,16 @@
+{$mode objfpc}
+type
+  generic tc<T> = class
+    procedure p(data : T);
+  end;
+
+  tc1 = specialize tc<string>;
+
+procedure tc.p(data : T);
+  begin
+    readln(data);
+    writeln(data);
+  end;
+
+begin
+end.

+ 20 - 0
tests/test/tgeneric20.pp

@@ -0,0 +1,20 @@
+{ %fail }
+{$mode objfpc}
+type
+  generic tc<T> = class
+    procedure p(data : T);
+  end;
+
+  tr = record
+  end;
+
+  tc1 = specialize tc<tr>;
+
+procedure tc.p(data : T);
+  begin
+    readln(data);
+    writeln(data);
+  end;
+
+begin
+end.