diff --git a/TestSuite/lambdas7.pas b/TestSuite/lambdas7.pas new file mode 100644 index 000000000..3c3bfd61a --- /dev/null +++ b/TestSuite/lambdas7.pas @@ -0,0 +1,29 @@ +type + TBase = abstract class + procedure p1(f: T->T2); + begin + assert(f(default(T)).ToString() = 'abc'); + end; + end; + + TErr = class(TBase) // обязательно наследовать от TBase + + procedure p2; + begin + var o: TBase := new TErr; + + o.p1(function(b: byte)-> + begin + Result := 'abc'; + var s: string := Result; + var a: byte := b; + end); + + end; + + end; + +begin + var o := new TErr; + o.p2; +end. \ No newline at end of file diff --git a/TreeConverter/LambdaExpressions/LambdaResultTypeInferrer.cs b/TreeConverter/LambdaExpressions/LambdaResultTypeInferrer.cs index 3e263b9db..b53dfb082 100644 --- a/TreeConverter/LambdaExpressions/LambdaResultTypeInferrer.cs +++ b/TreeConverter/LambdaExpressions/LambdaResultTypeInferrer.cs @@ -107,6 +107,11 @@ namespace TreeConverter.LambdaExpressions converted = syntaxTreeVisitor.convert_typed_expression_to_function_call(converted as typed_expression); } resultExpressionsTypes.Add(new Tuple(converted.type, from, converted)); + var si_list = syntaxTreeVisitor.context.find(RESULT_KEY_WORD); + if (si_list != null && si_list.Count > 0 && si_list[0].sym_info == null) + { + si_list[0].sym_info = new local_variable(RESULT_KEY_WORD, converted.type, syntaxTreeVisitor.context.top_function, null); + } } } diff --git a/TreeConverter/TreeRealization/generics.cs b/TreeConverter/TreeRealization/generics.cs index 30a888c06..06e922101 100644 --- a/TreeConverter/TreeRealization/generics.cs +++ b/TreeConverter/TreeRealization/generics.cs @@ -1878,6 +1878,14 @@ namespace PascalABCCompiler.TreeRealization { foreach (SymbolInfo si in start) { + if (si.sym_info == null) + { + if (rez_start == null) + rez_start = new List(); + rez_start.Add(si); + continue; + } + // Бурмистров Артем 13.06.19 begin // Поправил странное поведение для локальных переменных, у которых не generic тип // Исправление для #1993