This commit is contained in:
Ivan Bondarev 2021-01-19 20:32:29 +01:00
parent 2fd1355042
commit dda097d85e
2 changed files with 49 additions and 1 deletions

View file

@ -0,0 +1,43 @@
var i: integer;
type
TBase = class
// Эта FErr должна быть шаблонная и принимать функцию возвращающую шаблонный параметр (T)
procedure PErr<T>(f: object->T) := exit;
end;
TErr<T> = 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<integer>;
o.p1;
assert(i = 1);
end.

View file

@ -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)