diff --git a/TestSuite/lambdas_generics12.pas b/TestSuite/lambdas_generics12.pas new file mode 100644 index 000000000..30fa13484 --- /dev/null +++ b/TestSuite/lambdas_generics12.pas @@ -0,0 +1,43 @@ +var i: integer; +type + + TBase = class + + // Эта FErr должна быть шаблонная и принимать функцию возвращающую шаблонный параметр (T) + procedure PErr(f: object->T) := exit; + + end; + + TErr = class(TBase) + + // А у этой PErr не важно какое возвращаемое значение f + procedure PErr(f: T->byte); + begin + f(default(T)); + i := 1; + end; + + procedure p1; + begin + + // Обязательно "self.", без него не воспроизводится + self.PErr(o-> + begin + var p: T->() := procedure(x)->exit; + + // Обязательно передача в любую процедуру / функцию (не обязательно процедурную переменную) + // При присвоении переменной не воспроизводится + p(o); //Ошибка: Нельзя преобразовать тип object к T + + Result := 0; + end); + + end; + + end; + +begin +var o := new TErr; +o.p1; +assert(i = 1); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs index dd78b12e4..4f35a5240 100644 --- a/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs +++ b/TreeConverter/TreeConversion/convertion_data_and_alghoritms.cs @@ -2131,7 +2131,12 @@ namespace PascalABCCompiler.TreeConverter { throw lastFailedWhileTryingToCompileLambdaBodyWithGivenParametersException.ExceptionOnCompileBody; // Если перебрали все, но ничто не подошло, то кидаем последнее исключение } - + else if (lastFailedWhileTryingToCompileLambdaBodyWithGivenParametersException != null + && set_of_possible_functions.Count > 0 + && indefinits.Count == 0) + { + syntax_tree_visitor.RemoveLastError(); + } if (set_of_possible_functions.Count == 0 && indefinits.Count == 0) { if (is_op)