tintuint.pp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. { %version=1.1 }
  2. { Testing longint and cardinal addtions }
  3. const
  4. has_errors : boolean = false;
  5. has_severe_errors : boolean = false;
  6. procedure fail(a,b,c,d : int64;range_check_on : boolean);
  7. var
  8. r1,r2 : longint;
  9. begin
  10. Write('Error: ',a,'+',b,' does not give ',c,' but ',d,'($',hexstr(d,16),') with $R');
  11. if range_check_on then
  12. Writeln('+')
  13. else
  14. Writeln('-');
  15. has_errors:=true;
  16. {$R-}
  17. r1:=c;
  18. r2:=d;
  19. if r1<>r2 then
  20. has_severe_errors:=true;
  21. end;
  22. var
  23. a,b,c : longint;
  24. d,e,f : cardinal;
  25. res,res2 : int64;
  26. RTE201Buf : Jmp_Buf;
  27. OldExit : pointer;
  28. procedure RTE201Exit;
  29. begin
  30. ExitProc:=OldExit;
  31. if ExitCode=201 then
  32. begin
  33. ErrorAddr:=0;
  34. longjmp(RTE201Buf,1);
  35. end;
  36. end;
  37. begin
  38. a:=2;
  39. b:=-2;
  40. c:=-5;
  41. d:=1;
  42. e:=$ffffffff;
  43. f:=$fffffffe;
  44. oldexit:=exitproc;
  45. exitproc:=@RTE201Exit;
  46. {$R+}
  47. if setjmp(RTE201Buf)=0 then
  48. begin
  49. res:=a+d;
  50. if res<>3 then
  51. fail(a,d,3,res,true);
  52. res:=a+e;
  53. res2:=e;
  54. res2:=res2+a;
  55. if (res-2<>e) or ((res and $ffff) <>1) or (res<>res2) then
  56. fail(a,e,res2,res,true);
  57. res:=a+f;
  58. res2:=f;
  59. res2:=res2+a;
  60. if (res-2<>f) or ((res and $ffff) <>0) or (res<>res2) then
  61. fail(a,f,res2,res,true);
  62. res:=b+d;
  63. if res<>-1 then
  64. fail(b,d,-1,res,true);
  65. res:=b+e;
  66. res2:=e;
  67. res2:=res2+b;
  68. if (res+2<>e) or ((res and $ffff) <>$fffd) or (res<>res2) then
  69. fail(b,e,res2,res,true);
  70. res:=b+f;
  71. res2:=f;
  72. res2:=res2+b;
  73. if (res+2<>f) or ((res and $ffff) <>$fffc) or (res<>res2) then
  74. fail(b,f,res2,res,true);
  75. res:=c+d;
  76. if res<>-4 then
  77. fail(c,d,-4,res,true);
  78. res:=c+e;
  79. res2:=e;
  80. res2:=res2+c;
  81. if (res+5<>e) or ((res and $ffff) <>$fffa) or (res<>res2) then
  82. fail(c,e,res2,res,true);
  83. res:=c+f;
  84. res2:=f;
  85. res2:=res2+c;
  86. if (res+5<>f) or ((res and $ffff) <>$fff9) or (res<>res2) then
  87. fail(c,f,res2,res,true);
  88. res:=d+a;
  89. if res<>3 then
  90. fail(d,a,3,res,true);
  91. res:=e+a;
  92. res2:=e;
  93. res2:=res2+a;
  94. if (res-2<>e) or ((res and $ffff) <>1) or (res<>res2) then
  95. fail(e,a,res2,res,true);
  96. res:=f+a;
  97. res2:=f;
  98. res2:=res2+a;
  99. if (res-2<>f) or ((res and $ffff) <>0) or (res<>res2) then
  100. fail(f,a,res2,res,true);
  101. res:=d+b;
  102. if res<>-1 then
  103. fail(d,b,-1,res,true);
  104. res:=e+b;
  105. res2:=e;
  106. res2:=res2+b;
  107. if (res+2<>e) or ((res and $ffff) <>$fffd) or (res<>res2) then
  108. fail(e,b,res2,res,true);
  109. res:=f+b;
  110. res2:=f;
  111. res2:=res2+b;
  112. if (res+2<>f) or ((res and $ffff) <>$fffc) or (res<>res2) then
  113. fail(f,b,res2,res,true);
  114. res:=d+c;
  115. if res<>-4 then
  116. fail(d,c,-4,res,true);
  117. res:=e+c;
  118. res2:=e;
  119. res2:=res2+c;
  120. if (res+5<>e) or ((res and $ffff) <>$fffa) or (res<>res2) then
  121. fail(e,c,res2,res,true);
  122. res:=f+c;
  123. res2:=f;
  124. res2:=res2+c;
  125. if (res+5<>f) or ((res and $ffff) <>$fff9) or (res<>res2) then
  126. fail(f,c,res2,res,true);
  127. end;
  128. {$R-}
  129. res:=a+d;
  130. if res<>3 then
  131. fail(a,d,3,res,false);
  132. res:=a+e;
  133. res2:=e;
  134. res2:=res2+a;
  135. if (res-2<>e) or ((res and $ffff) <>1) or (res<>res2) then
  136. fail(a,e,res2,res,false);
  137. res:=a+f;
  138. res2:=f;
  139. res2:=res2+a;
  140. if (res-2<>f) or ((res and $ffff) <>0) or (res<>res2) then
  141. fail(a,f,res2,res,false);
  142. res:=b+d;
  143. if res<>-1 then
  144. fail(b,d,-1,res,false);
  145. res:=b+e;
  146. res2:=e;
  147. res2:=res2+b;
  148. if (res+2<>e) or ((res and $ffff) <>$fffd) or (res<>res2) then
  149. fail(b,e,res2,res,false);
  150. res:=b+f;
  151. res2:=f;
  152. res2:=res2+b;
  153. if (res+2<>f) or ((res and $ffff) <>$fffc) or (res<>res2) then
  154. fail(b,f,res2,res,false);
  155. res:=c+d;
  156. if res<>-4 then
  157. fail(c,d,-4,res,false);
  158. res:=c+e;
  159. res2:=e;
  160. res2:=res2+c;
  161. if (res+5<>e) or ((res and $ffff) <>$fffa) or (res<>res2) then
  162. fail(c,e,res2,res,false);
  163. res:=c+f;
  164. res2:=f;
  165. res2:=res2+c;
  166. if (res+5<>f) or ((res and $ffff) <>$fff9) or (res<>res2) then
  167. fail(c,f,res2,res,false);
  168. res:=d+a;
  169. if res<>3 then
  170. fail(d,a,3,res,false);
  171. res:=e+a;
  172. res2:=e;
  173. res2:=res2+a;
  174. if (res-2<>e) or ((res and $ffff) <>1) or (res<>res2) then
  175. fail(e,a,res2,res,false);
  176. res:=f+a;
  177. res2:=f;
  178. res2:=res2+a;
  179. if (res-2<>f) or ((res and $ffff) <>0) or (res<>res2) then
  180. fail(f,a,res2,res,false);
  181. res:=d+b;
  182. if res<>-1 then
  183. fail(d,b,-1,res,false);
  184. res:=e+b;
  185. res2:=e;
  186. res2:=res2+b;
  187. if (res+2<>e) or ((res and $ffff) <>$fffd) or (res<>res2) then
  188. fail(e,b,res2,res,false);
  189. res:=f+b;
  190. res2:=f;
  191. res2:=res2+b;
  192. if (res+2<>f) or ((res and $ffff) <>$fffc) or (res<>res2) then
  193. fail(f,b,res2,res,false);
  194. res:=d+c;
  195. if res<>-4 then
  196. fail(d,c,-4,res,false);
  197. res:=e+c;
  198. res2:=e;
  199. res2:=res2+c;
  200. if (res+5<>e) or ((res and $ffff) <>$fffa) or (res<>res2) then
  201. fail(e,c,res2,res,false);
  202. res:=f+c;
  203. res2:=f;
  204. res2:=res2+c;
  205. if (res+5<>f) or ((res and $ffff) <>$fff9) or (res<>res2) then
  206. fail(f,c,res2,res,false);
  207. exitproc:=@RTE201Exit;
  208. if setjmp(RTE201Buf)=0 then
  209. begin
  210. if {$R-} a+e <> {$R+} a+e then
  211. has_severe_errors:=true;
  212. end;
  213. if has_severe_errors then
  214. halt(1);
  215. if has_errors then
  216. halt(2);
  217. end.