From c67922ebc31c65de1281eb57256ed84198ab38e5 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, 16 Jul 2017 12:44:30 +0200 Subject: [PATCH] bug fix #439 --- .../YieldVisitors/ReplaceYieldWithLamdasVisitor.cs | 2 +- TestSuite/yield3.pas | 8 ++++++++ .../TreeConversion/compilation_context.cs | 14 ++++++++++++++ .../TreeConversion/syntax_tree_visitor.cs | 3 ++- 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 TestSuite/yield3.pas diff --git a/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs b/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs index 12ba57ab7..1120e5180 100644 --- a/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs +++ b/SyntaxVisitors/YieldVisitors/ReplaceYieldWithLamdasVisitor.cs @@ -38,7 +38,7 @@ namespace SyntaxVisitors VarIdent.source_context = yn.ex.source_context; var_statement vs; if (yn.ex is nil_const) - vs = new var_statement(VarIdent, new named_type_reference("System.Object"), yn.ex); + vs = new var_statement(VarIdent, new named_type_reference("$yield_element_type"), yn.ex); else vs = new var_statement(VarIdent, yn.ex); vs.source_context = yn.ex.source_context; diff --git a/TestSuite/yield3.pas b/TestSuite/yield3.pas new file mode 100644 index 000000000..deb0b3956 --- /dev/null +++ b/TestSuite/yield3.pas @@ -0,0 +1,8 @@ +function Test: sequence of integer->integer; +begin + yield nil; +end; + +begin + assert(Test.First = nil); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/compilation_context.cs b/TreeConverter/TreeConversion/compilation_context.cs index 3a1fc7e10..61e183a95 100644 --- a/TreeConverter/TreeConversion/compilation_context.cs +++ b/TreeConverter/TreeConversion/compilation_context.cs @@ -2092,6 +2092,20 @@ namespace PascalABCCompiler.TreeConverter public SymbolInfoList find(string name) { SymbolTable.Scope curscope = CurrentScope; + if (name == "$yield_element_type") + { + if (top_function != null) + { + return new SymbolInfoList(new SymbolInfoUnit(top_function.return_value_type.instance_params[0])); + } + else + { + type_node tn = converted_type.ImplementingInterfaces.Find(x=>(x as type_node).full_name.StartsWith("System.Collections.Generic.IEnumerable")) as type_node; + return new SymbolInfoList(new SymbolInfoUnit(tn.instance_params[0])); + } + } + + SymbolInfoList si = curscope.Find(name, curscope); if (si == null && _compiled_tn != null && curscope.TopScope != null) { diff --git a/TreeConverter/TreeConversion/syntax_tree_visitor.cs b/TreeConverter/TreeConversion/syntax_tree_visitor.cs index c0dbff6fd..45f73c764 100644 --- a/TreeConverter/TreeConversion/syntax_tree_visitor.cs +++ b/TreeConverter/TreeConversion/syntax_tree_visitor.cs @@ -1613,6 +1613,7 @@ namespace PascalABCCompiler.TreeConverter names.names[names.names.Count-1].name += "Attribute"; si = context.find_definition_node(names, loc); } + if (si != null && si.First().sym_info != null && si.First().sym_info.general_node_type == general_node_type.generic_indicator) { generic_indicator gi = si.First().sym_info as generic_indicator; @@ -15466,7 +15467,7 @@ namespace PascalABCCompiler.TreeConverter private expression_node ident_value_reciving(SyntaxTree.ident _ident) { - SymbolInfoList si = context.find(_ident.name); + SymbolInfoList si = context.find(_ident.name); return ident_value_reciving(si, _ident); }