tintuint.pp 5.4 KB

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