From d3a461ff39c561a388973016d24dc1eb0fe690fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D0=BE=D0=BD=D0=B4=D0=B0=D1=80=D0=B5=D0=B2=20=D0=98?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD?= Date: Wed, 8 Aug 2018 18:03:44 +0200 Subject: [PATCH] fix #807 --- NETGenerator/NETGenerator.cs | 2 +- TestSuite/foreach1.pas | 6 +++--- TestSuite/foreach3.pas | 7 ++++++- TestSuite/foreach5.pas | 40 ++++++++++++++++++++++++++++++++++++ TestSuite/foreach6.pas | 12 +++++++++++ 5 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 TestSuite/foreach5.pas create mode 100644 TestSuite/foreach6.pas diff --git a/NETGenerator/NETGenerator.cs b/NETGenerator/NETGenerator.cs index 8576fc4ec..4f7621ba0 100644 --- a/NETGenerator/NETGenerator.cs +++ b/NETGenerator/NETGenerator.cs @@ -10300,7 +10300,7 @@ namespace PascalABCCompiler.NETGenerator Type return_type = null; bool is_generic = false; MethodInfo enumer_mi = null; //typeof(System.Collections.IEnumerable).GetMethod("GetEnumerator", Type.EmptyTypes); - if (var_tp.IsValueType && !(in_what_type.IsArray && in_what_type.GetArrayRank() > 1)) + if (/*var_tp.IsValueType &&*/ !var_tp.IsGenericParameter && !(in_what_type.IsArray && in_what_type.GetArrayRank() > 1)) { enumer_mi = helper.GetEnumeratorMethod(in_what_type); if (enumer_mi == null) diff --git a/TestSuite/foreach1.pas b/TestSuite/foreach1.pas index b44951e0b..c592181e2 100644 --- a/TestSuite/foreach1.pas +++ b/TestSuite/foreach1.pas @@ -1,4 +1,4 @@ -type TClass = class(System.Collections.IEnumerable) +type TClass = class(System.Collections.IEnumerable) public function GetEnumerator : System.Collections.IEnumerator; begin Result := nil; @@ -24,7 +24,7 @@ begin end; i := 0; arr[1] := 1; arr[2] := 2; arr[3] := 3; - {foreach v : integer in arr do + foreach v : integer in arr do begin case i of 0 : assert(v=1); @@ -32,7 +32,7 @@ begin 2 : assert(v=3); end; Inc(i); - end;} + end; i := 0; SetLength(arr2,2); arr2[0] := 3.14; arr2[1] := 2.71; diff --git a/TestSuite/foreach3.pas b/TestSuite/foreach3.pas index 46be210d5..69fcbf8ce 100644 --- a/TestSuite/foreach3.pas +++ b/TestSuite/foreach3.pas @@ -1,4 +1,4 @@ -procedure WriteArray(a: array of T); +procedure WriteArray(a: array of T); begin foreach x: T in a do writeln(x); @@ -8,8 +8,13 @@ begin var a := Arr(2,3,5); WriteArray(a); var a2 := new integer[2,2]((3,3),(3,3)); + var i := 0; foreach x: integer in a2 do + begin assert(x = 3); + Inc(i); + end; + assert(i = 4); var a3 := new integer[2,2]((3,3),(3,3)); foreach var x in a3 do assert(x=3); diff --git a/TestSuite/foreach5.pas b/TestSuite/foreach5.pas new file mode 100644 index 000000000..1d69bf55e --- /dev/null +++ b/TestSuite/foreach5.pas @@ -0,0 +1,40 @@ +var i: integer; + +type + e1 = class(System.Collections.IEnumerator) + public function MoveNext := false; + public function get_current:object := nil; + public procedure Reset := exit; + end; + e2 = class(System.Collections.Generic.IEnumerator) + public function MoveNext := false; + public function System.Collections.IEnumerator.get_current:object := nil; + public function get_current:T := default(T); + public procedure Reset := exit; + public procedure Dispose := exit; + end; + + t2=class + b:byte; + end; + t1 = class(System.Collections.Generic.IEnumerable) + + public function System.Collections.IEnumerable.GetEnumerator: System.Collections.IEnumerator; + begin + i := 1; + Result := new e1; + end; + + public function GetEnumerator: System.Collections.Generic.IEnumerator; + begin + i := 2; + Result := new e2; + end; + + end; + +begin + foreach var o in new t1 do + o.b := 2; + assert(i = 2); +end. \ No newline at end of file diff --git a/TestSuite/foreach6.pas b/TestSuite/foreach6.pas new file mode 100644 index 000000000..5c8113bca --- /dev/null +++ b/TestSuite/foreach6.pas @@ -0,0 +1,12 @@ +function test(a: T): sequence of T; +begin + var lst: List> := new List>; + lst.Add(new List(Arr(a, a))); + foreach var x in lst do + begin + yield x[0]; + end; +end; +begin + assert(test(2).ToArray[0] = 2); +end. \ No newline at end of file