{$mode objfpc}
uses sysutils;

var
  counter: integer;

{ flow control statements in try..except must not bypass finally code of outer try..finally }
{ test 1: 'exit' in 'try' block }
procedure test;
 begin
   try
     try
       inc(counter);
       exit;
     except
     end;
   finally
     inc(counter);
   end;
 end;

{ test 2: 'exit' in 'except' block }
procedure test2;
begin
  try
    try
      raise exception.create('catch me');
    except
      inc(counter);
      exit;
    end;
  finally
    inc(counter);
  end;
end;

{ test 3: 'exit' in 'on' statement }
procedure test3;
begin
  try
    try
      raise exception.create('catch me');
    except
      on E: Exception do
      begin
        inc(counter);
        exit;
      end;
    end;
  finally
    inc(counter);
  end;
end;

{ test 4: 'continue' in try..except nested in loop nested in try..finally
           in this case the control stays within protected region
           (Mantis #28584)  }
procedure test4;
var
  i: integer;
begin
  try
    for i:=0 to 2 do
    begin
      try
        inc(counter);
        raise exception.create('catch me');
      except
        continue;
      end;
    end;  
  finally
    inc(counter);
  end;
end;

{ test 5: same as above but with 'break' statement instead }
procedure test5;
var
  i: integer;
begin
  try
    for i:=0 to 15 do
    begin
      try
        inc(counter);
        raise exception.create('catch me');
      except
        if i=2 then
          break;
      end;
    end; 
    inc(counter);
  finally
    inc(counter);
  end;
end;



begin
  counter:=0;
  test;
  if counter<>2 then
    Halt(1);

  counter:=0;
  test2;
  if counter<>2 then
    Halt(2);

  counter:=0;
  test3;
  if counter<>2 then
    Halt(3);
    
  counter:=0;
  test4;
  if counter<>4 then
    Halt(4);
    
  counter:=0;
  test5;
  if counter<>5 then
    Halt(5);
end.