123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- { %version=1.1 }
- { Testing longint and cardinal addtions }
- const
- has_errors : boolean = false;
- has_severe_errors : boolean = false;
- procedure fail(a,b,c,d : int64;range_check_on : boolean);
- var
- r1,r2 : longint;
- begin
- Write('Error: ',a,'+',b,' does not give ',c,' but ',d,'($',hexstr(d,16),') with $R');
- if range_check_on then
- Writeln('+')
- else
- Writeln('-');
- has_errors:=true;
- {$R-}
- r1:=c;
- r2:=d;
- if r1<>r2 then
- has_severe_errors:=true;
- end;
- var
- a,b,c : longint;
- d,e,f : cardinal;
- res,res2 : int64;
- RTE201Buf : Jmp_Buf;
- OldExit : pointer;
- procedure RTE201Exit;
- begin
- ExitProc:=OldExit;
- if ExitCode=201 then
- begin
- ErrorAddr:=0;
- longjmp(RTE201Buf,1);
- end;
- end;
- begin
- a:=2;
- b:=-2;
- c:=-5;
- d:=1;
- e:=$ffffffff;
- f:=$fffffffe;
- oldexit:=exitproc;
- exitproc:=@RTE201Exit;
- {$R+}
- if setjmp(RTE201Buf)=0 then
- begin
- res:=a+d;
- if res<>3 then
- fail(a,d,3,res,true);
- res:=a+e;
- res2:=e;
- res2:=res2+a;
- if (res-2<>e) or ((res and $ffff) <>1) or (res<>res2) then
- fail(a,e,res2,res,true);
- res:=a+f;
- res2:=f;
- res2:=res2+a;
- if (res-2<>f) or ((res and $ffff) <>0) or (res<>res2) then
- fail(a,f,res2,res,true);
- res:=b+d;
- if res<>-1 then
- fail(b,d,-1,res,true);
- res:=b+e;
- res2:=e;
- res2:=res2+b;
- if (res+2<>e) or ((res and $ffff) <>$fffd) or (res<>res2) then
- fail(b,e,res2,res,true);
- res:=b+f;
- res2:=f;
- res2:=res2+b;
- if (res+2<>f) or ((res and $ffff) <>$fffc) or (res<>res2) then
- fail(b,f,res2,res,true);
- res:=c+d;
- if res<>-4 then
- fail(c,d,-4,res,true);
- res:=c+e;
- res2:=e;
- res2:=res2+c;
- if (res+5<>e) or ((res and $ffff) <>$fffa) or (res<>res2) then
- fail(c,e,res2,res,true);
- res:=c+f;
- res2:=f;
- res2:=res2+c;
- if (res+5<>f) or ((res and $ffff) <>$fff9) or (res<>res2) then
- fail(c,f,res2,res,true);
- res:=d+a;
- if res<>3 then
- fail(d,a,3,res,true);
- res:=e+a;
- res2:=e;
- res2:=res2+a;
- if (res-2<>e) or ((res and $ffff) <>1) or (res<>res2) then
- fail(e,a,res2,res,true);
- res:=f+a;
- res2:=f;
- res2:=res2+a;
- if (res-2<>f) or ((res and $ffff) <>0) or (res<>res2) then
- fail(f,a,res2,res,true);
- res:=d+b;
- if res<>-1 then
- fail(d,b,-1,res,true);
- res:=e+b;
- res2:=e;
- res2:=res2+b;
- if (res+2<>e) or ((res and $ffff) <>$fffd) or (res<>res2) then
- fail(e,b,res2,res,true);
- res:=f+b;
- res2:=f;
- res2:=res2+b;
- if (res+2<>f) or ((res and $ffff) <>$fffc) or (res<>res2) then
- fail(f,b,res2,res,true);
- res:=d+c;
- if res<>-4 then
- fail(d,c,-4,res,true);
- res:=e+c;
- res2:=e;
- res2:=res2+c;
- if (res+5<>e) or ((res and $ffff) <>$fffa) or (res<>res2) then
- fail(e,c,res2,res,true);
- res:=f+c;
- res2:=f;
- res2:=res2+c;
- if (res+5<>f) or ((res and $ffff) <>$fff9) or (res<>res2) then
- fail(f,c,res2,res,true);
- end;
- {$R-}
- res:=a+d;
- if res<>3 then
- fail(a,d,3,res,false);
- res:=a+e;
- res2:=e;
- res2:=res2+a;
- if (res-2<>e) or ((res and $ffff) <>1) or (res<>res2) then
- fail(a,e,res2,res,false);
- res:=a+f;
- res2:=f;
- res2:=res2+a;
- if (res-2<>f) or ((res and $ffff) <>0) or (res<>res2) then
- fail(a,f,res2,res,false);
- res:=b+d;
- if res<>-1 then
- fail(b,d,-1,res,false);
- res:=b+e;
- res2:=e;
- res2:=res2+b;
- if (res+2<>e) or ((res and $ffff) <>$fffd) or (res<>res2) then
- fail(b,e,res2,res,false);
- res:=b+f;
- res2:=f;
- res2:=res2+b;
- if (res+2<>f) or ((res and $ffff) <>$fffc) or (res<>res2) then
- fail(b,f,res2,res,false);
- res:=c+d;
- if res<>-4 then
- fail(c,d,-4,res,false);
- res:=c+e;
- res2:=e;
- res2:=res2+c;
- if (res+5<>e) or ((res and $ffff) <>$fffa) or (res<>res2) then
- fail(c,e,res2,res,false);
- res:=c+f;
- res2:=f;
- res2:=res2+c;
- if (res+5<>f) or ((res and $ffff) <>$fff9) or (res<>res2) then
- fail(c,f,res2,res,false);
- res:=d+a;
- if res<>3 then
- fail(d,a,3,res,false);
- res:=e+a;
- res2:=e;
- res2:=res2+a;
- if (res-2<>e) or ((res and $ffff) <>1) or (res<>res2) then
- fail(e,a,res2,res,false);
- res:=f+a;
- res2:=f;
- res2:=res2+a;
- if (res-2<>f) or ((res and $ffff) <>0) or (res<>res2) then
- fail(f,a,res2,res,false);
- res:=d+b;
- if res<>-1 then
- fail(d,b,-1,res,false);
- res:=e+b;
- res2:=e;
- res2:=res2+b;
- if (res+2<>e) or ((res and $ffff) <>$fffd) or (res<>res2) then
- fail(e,b,res2,res,false);
- res:=f+b;
- res2:=f;
- res2:=res2+b;
- if (res+2<>f) or ((res and $ffff) <>$fffc) or (res<>res2) then
- fail(f,b,res2,res,false);
- res:=d+c;
- if res<>-4 then
- fail(d,c,-4,res,false);
- res:=e+c;
- res2:=e;
- res2:=res2+c;
- if (res+5<>e) or ((res and $ffff) <>$fffa) or (res<>res2) then
- fail(e,c,res2,res,false);
- res:=f+c;
- res2:=f;
- res2:=res2+c;
- if (res+5<>f) or ((res and $ffff) <>$fff9) or (res<>res2) then
- fail(f,c,res2,res,false);
- exitproc:=@RTE201Exit;
- if setjmp(RTE201Buf)=0 then
- begin
- if {$R-} a+e <> {$R+} a+e then
- has_severe_errors:=true;
- end;
- if has_severe_errors then
- halt(1);
- if has_errors then
- halt(2);
- end.
|