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
|
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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue