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 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) 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) 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) 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) 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 public override bool is_value