This commit is contained in:
Ivan Bondarev 2024-04-01 14:01:09 +02:00
parent ba0b0f8c39
commit 22779adbf9
2 changed files with 41 additions and 4 deletions

37
TestSuite/lambdas24.pas Normal file
View file

@ -0,0 +1,37 @@
var s: string;
type
// Обязательно разделить откуда берутся типы лямбды:
// TInput должно браться из шаблона класса (GenericContainer)
// TResult - из шаблона метода (TakeLambda)
GenericContainer<TInput> = class
// Не обязательно статический метод
static procedure TakeLambda<TResult>(lambda: TInput->TResult);
begin
lambda(default(TInput));
end;
end;
procedure PErr<T>;
begin
// Обязательно в качестве TInput указать не конкретный тип,
// а использовать тип из шаблона PErr
GenericContainer&<T>.TakeLambda(l->
begin
// Обязательно вычислять тип шаблона TakeLambda из тела лямбды
// Если вызвать TakeLambda&<integer> - не воспроизводится
Result := 0;
// Обязательно присвоить чему то результат
//Ошибка: ToString не объявлен в типе
var v := l.ToString;
s := v;
end);
end;
begin
PErr&<integer>;
assert(s = '0');
end.

View file

@ -613,7 +613,7 @@ namespace PascalABCCompiler.TreeRealization
{
get
{
return null;
return compiled_type_node.get_type_node(typeof(object));
}
}
@ -647,7 +647,7 @@ namespace PascalABCCompiler.TreeRealization
public override List<SymbolInfo> find(string name, bool no_search_in_extension_methods = false)
{
return null;
return base_type.find(name, no_search_in_extension_methods);
}
public override void add_name(string name, SymbolInfo si)
@ -657,12 +657,12 @@ namespace PascalABCCompiler.TreeRealization
public override List<SymbolInfo> find_in_type(string name, bool no_search_in_extension_methods = false)
{
return null;
return base_type.find_in_type(name, no_search_in_extension_methods);
}
public override List<SymbolInfo> find_in_type(string name, SymbolTable.Scope CurrentScope, type_node orig_generic_or_null = null, bool no_search_in_extension_methods = false)
{
return null;
return base_type.find_in_type(name, CurrentScope, orig_generic_or_null, no_search_in_extension_methods);
}
public override bool is_value