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); }