mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-08 17:28:16 +02:00
69 lines
1.3 KiB
ObjectPascal
69 lines
1.3 KiB
ObjectPascal
{$ifdef CPUAVR}
|
|
{ avr does not support an exitproc }
|
|
begin
|
|
end.
|
|
{$else CPUAVR}
|
|
{$S+}
|
|
|
|
{ Program to check that an infinite recursion
|
|
does generate a RTE ... }
|
|
|
|
{$R-}
|
|
{ make that recursion really infinite
|
|
needs that range check is disabled }
|
|
|
|
const
|
|
level : longint = 0;
|
|
|
|
function inf_rec(x : longint) : longint;
|
|
|
|
begin
|
|
inc(level);
|
|
inf_rec:=x+inf_rec(x-1);
|
|
end;
|
|
|
|
|
|
const
|
|
saveexit : codepointer = nil;
|
|
x : longint = 0;
|
|
|
|
{$S-}
|
|
{ the stack overflowed already so don't do much here and depend on stack_margin }
|
|
procedure stack_check_exit;
|
|
|
|
begin
|
|
exitproc:=saveexit;
|
|
if errorcode<>0 then
|
|
begin
|
|
Writeln('An error occured at level ',level);
|
|
if errorcode=202 then
|
|
begin
|
|
Writeln('Stack overflow correctly handled');
|
|
erroraddr:=nil;
|
|
errorcode:=0;
|
|
exitcode:=0;
|
|
end
|
|
else if errorcode=216 then
|
|
begin
|
|
Writeln('RTL returns an RTE 216 on stack overflow');
|
|
Writeln('Not perfect, but acceptable');
|
|
erroraddr:=nil;
|
|
errorcode:=0;
|
|
exitcode:=0;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
exitcode:=1;
|
|
errorcode:=1;
|
|
end;
|
|
exitproc:=saveexit;
|
|
end;
|
|
|
|
begin
|
|
saveexit:=exitproc;
|
|
exitproc:=@stack_check_exit;
|
|
x:=inf_rec(5000);
|
|
end.
|
|
{$endif CPUAVR}
|