This commit is contained in:
Ivan Bondarev 2021-10-24 14:43:45 +02:00
parent 198faa5bf5
commit 2d2798c711
9 changed files with 51 additions and 7 deletions

View file

@ -1,4 +1,5 @@
type
//!Параметр метода не может иметь имя Self
type
T = class
public procedure p(self: integer) := exit;
end;

View file

@ -1,4 +1,5 @@
begin
//!Неверное количество параметров функции
begin
var a:=Arr(1);
Write(a[a.GetLowerBound]);
end.

View file

@ -1,4 +1,5 @@
function f(i: integer): boolean;
//!Неверное количество параметров функции
function f(i: integer): boolean;
begin
end;

View file

@ -1,4 +1,5 @@
function f(i: integer): boolean;
//!Неверное количество параметров функции
function f(i: integer): boolean;
begin
end;

View file

@ -1,4 +1,5 @@
function f(i: integer): boolean;
//!Неверное количество параметров функции
function f(i: integer): boolean;
begin
end;

View file

@ -1,4 +1,5 @@
function f(i: integer): string;
//!Нельзя преобразовать тип function(i: integer): string к string
function f(i: integer): string;
begin
end;

View file

@ -0,0 +1,15 @@
//!Несколько подпрограмм могут быть вызваны
procedure p0(o: pointer) := exit;
procedure p0(o: array of integer) := exit;
procedure p1(p: ()->()) := exit;
begin
p1(()-> //Ошибка: Неверный тип переменной, которой присваивается лямбда-выражение
begin
// если закомментировать эту строчку - ошибки нет
p0(nil);
end);
end.

View file

@ -141,6 +141,15 @@ namespace PascalABCCompiler.TreeConverter
this.ErrResourceString = ErrResourceString;
this.values = values;
}
public string ErrorResourceString
{
get
{
return ErrResourceString;
}
}
public override string ToString()
{
if (values != null)

View file

@ -7329,6 +7329,7 @@ namespace PascalABCCompiler.TreeConverter
}
// SSM 21.05.14 - попытка обработать перегруженные функции с параметрами-лямбдами с различными возвращаемыми значениями
List<function_node> spf = null;
SeveralFunctionsCanBeCalled sf_error = null;
try
{
function_node fn = convertion_data_and_alghoritms.select_function(exprs, sil2, subloc2, syntax_nodes_parameters);
@ -7356,6 +7357,7 @@ namespace PascalABCCompiler.TreeConverter
}
catch (SeveralFunctionsCanBeCalled sf)
{
sf_error = sf;
spf = sf.set_of_possible_functions; // Возможны несколько перегруженных версий - надо выводить дальше в надежде что какие-то уйдут и останется одна
}
@ -7407,7 +7409,19 @@ namespace PascalABCCompiler.TreeConverter
if (restype != null)
realrestype = restype.real_type;
LambdaHelper.InferTypesFromVarStmt(fn.parameters[exprCounter].type, fld, this);
try
{
LambdaHelper.InferTypesFromVarStmt(fn.parameters[exprCounter].type, fld, this);
}
catch (SimpleSemanticError err)
{
if (err.ErrorResourceString == "ILLEGAL_LAMBDA_VARIABLE_TYPE" && spf != null)
{
AddError(new SeveralFunctionsCanBeCalled(sf_error.loc, spf));
}
else
AddError(err);
}
fld.lambda_visit_mode = LambdaVisitMode.VisitForAdvancedMethodCallProcessing; //lroman
fld.lambda_name = LambdaHelper.GetAuxiliaryLambdaName(lambdaName); // поправляю имя. Думаю, назад возвращать не надо. ПРОВЕРИТЬ!