fix #2610
This commit is contained in:
parent
ba0b0f8c39
commit
22779adbf9
37
TestSuite/lambdas24.pas
Normal file
37
TestSuite/lambdas24.pas
Normal 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.
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue