This commit is contained in:
Mikhalkovich Stanislav 2020-06-25 00:03:11 +03:00
parent 15ebf4a4e4
commit 129cefd7e7
9 changed files with 59 additions and 5 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "6";
public const string Build = "3";
public const string Revision = "2523";
public const string Revision = "2527";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%MINOR%=6
%REVISION%=2523
%REVISION%=2527
%COREVERSION%=3
%MAJOR%=3

Binary file not shown.

View file

@ -1 +1 @@
3.6.3.2523
3.6.3.2527

View file

@ -1 +1 @@
!define VERSION '3.6.3.2523'
!define VERSION '3.6.3.2527'

9
TestSuite/gotobad0.pas Normal file
View file

@ -0,0 +1,9 @@
// #2271
label 1;
begin
Arr(3).Select(b -> b);
if True then
goto 1;
1: Assert(1=1);
end.

13
TestSuite/gotobad1.pas Normal file
View file

@ -0,0 +1,13 @@
// #2271
procedure p;
label 1;
begin
Arr(3).Select(b -> b);
if True then
goto 1;
1: Assert(1=1);
end;
begin
p;
end.

15
TestSuite/gotobad2.pas Normal file
View file

@ -0,0 +1,15 @@
// #2271
type
A = class
procedure p;
label 1;
begin
Arr(3).Select(b -> b);
if True then
goto 1;
1: Print(1);
end;
end;
begin
end.

View file

@ -2767,6 +2767,22 @@ namespace PascalABCCompiler.TreeConverter
lambdaProcessingState = LambdaProcessingState.TypeInferencePhase;
visit_program_code(_block.program_code);
// Очистили списки goto для меток перед следующим этапом - пока ничего не дало - закомментируем
foreach (var l in context._cmn.labels)
{
l.goto_statements.Clear();
l.comprehensive_code_block = null;
}
if (context.func_stack.size > 0)
{
var fun = context.func_stack.top();
foreach (var l in fun.label_nodes_list)
{
l.goto_statements.Clear();
l.comprehensive_code_block = null;
}
}
// Грубо - удаление мусора при разборе лямбд. Происходит исключение - заголовок разбирается, тело остается пустым - и из-за этого была ошибка #1270.
while (context._cmn.functions.Count > 0 && context._cmn.functions[context._cmn.functions.Count-1].function_code == null && context._cmn.functions[context._cmn.functions.Count - 1].name.StartsWith("<>lambda") && !context._cmn.functions[context._cmn.functions.Count - 1].name.StartsWith("<>lambda_initializer"))
{
@ -8918,7 +8934,8 @@ namespace PascalABCCompiler.TreeConverter
lab.goto_statements.Add(gs);
if (lab.comprehensive_code_block != null)
{
if (!context.check_can_goto(lab.comprehensive_code_block, gs.comprehensive_code_block) && _goto_statement.source_context != null)
// последнее условие - для goto, которые генерируются в автомате yield, не рассматривать эту ошибку
if (!context.check_can_goto(lab.comprehensive_code_block, gs.comprehensive_code_block) && _goto_statement.source_context != null)
{
AddError(gs.location, "BLOCKED_LABEL_{0}_GOTO", lab.name);
}