From a75e97e4238c4235b508cf0459f33c5173445aa0 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: Sun, 20 Sep 2020 12:33:21 +0200 Subject: [PATCH] bug fix #2306 --- TestSuite/foreach8.pas | 14 ++++++++++++++ .../TreeConversion/syntax_tree_visitor.cs | 6 ++++++ 2 files changed, 20 insertions(+) create mode 100644 TestSuite/foreach8.pas diff --git a/TestSuite/foreach8.pas b/TestSuite/foreach8.pas new file mode 100644 index 000000000..7bfbd8031 --- /dev/null +++ b/TestSuite/foreach8.pas @@ -0,0 +1,14 @@ +type + t1 = class(List) end; + +begin + var l := new t1; + l.Add(1); + l.Add(2); + var i := 1; + foreach var x in l do + begin + assert(i = x); + Inc(i); + end; +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index 6cc9c9e8a..c8c015c0a 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -17921,7 +17921,11 @@ namespace PascalABCCompiler.TreeConverter // Попытка реализовать IEnumerable натыкается на необходимость определять GetEnumerator, возвращающий IEnumerator и IEnumerator { if (tn == null || tn is null_type_node || tn.ImplementingInterfaces == null) + { + if (tn != null && tn.base_type != null) + return FindIEnumerableElementType(tn.base_type, ref elem_type, out sys_coll_ienum); return false; + } if (tn.element_type != null && tn.type_special_kind != SemanticTree.type_special_kind.typed_file) // еще может быть множество set of T - 22.02.16 SSM { @@ -17968,6 +17972,8 @@ namespace PascalABCCompiler.TreeConverter } } } + if (tn != null && tn.base_type != null) + return FindIEnumerableElementType(tn.base_type, ref elem_type, out sys_coll_ienum); return false; }