This commit is contained in:
parent
2fd1355042
commit
dda097d85e
43
TestSuite/lambdas_generics12.pas
Normal file
43
TestSuite/lambdas_generics12.pas
Normal 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.
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue