trange1.pp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. { %VERSION=1.1 }
  2. {$ifdef fpc}
  3. {$mode objfpc}
  4. {$endif}
  5. uses SysUtils;
  6. {$ifndef fpc}
  7. type
  8. qword=int64;
  9. dword=cardinal;
  10. {$endif}
  11. var
  12. error: boolean;
  13. {$r+}
  14. function testlongint_int64(i: int64; shouldfail: boolean): boolean;
  15. var
  16. l: longint;
  17. failed: boolean;
  18. begin
  19. failed := false;
  20. try
  21. l := i;
  22. except
  23. failed := true;
  24. end;
  25. result := failed = shouldfail;
  26. error := error or not result;
  27. end;
  28. function testlongint_qword(i: qword; shouldfail: boolean): boolean;
  29. var
  30. l: longint;
  31. failed: boolean;
  32. begin
  33. failed := false;
  34. try
  35. l := i;
  36. except
  37. failed := true;
  38. end;
  39. result := failed = shouldfail;
  40. error := error or not result;
  41. end;
  42. function testdword_int64(i: int64; shouldfail: boolean): boolean;
  43. var
  44. l: dword;
  45. failed: boolean;
  46. begin
  47. failed := false;
  48. try
  49. l := i;
  50. except
  51. failed := true;
  52. end;
  53. result := failed = shouldfail;
  54. error := error or not result;
  55. end;
  56. function testdword_qword(i: qword; shouldfail: boolean): boolean;
  57. var
  58. l: dword;
  59. failed: boolean;
  60. begin
  61. failed := false;
  62. try
  63. l := i;
  64. except
  65. failed := true;
  66. end;
  67. result := failed = shouldfail;
  68. error := error or not result;
  69. end;
  70. {$r-}
  71. var
  72. i: int64;
  73. q: qword;
  74. begin
  75. error := false;
  76. { *********************** int64 to longint ********************* }
  77. writeln('int64 to longint');
  78. i := $ffffffffffffffff;
  79. writeln(i);
  80. if not testlongint_int64(i,false) then
  81. writeln('test1 failed');
  82. i := i and $ffffffff00000000;
  83. writeln(i);
  84. if not testlongint_int64(i,true) then
  85. writeln('test2 failed');
  86. inc(i);
  87. writeln(i);
  88. if not testlongint_int64(i,true) then
  89. writeln('test3 failed');
  90. i := $ffffffff80000000;
  91. writeln(i);
  92. if not testlongint_int64(i,false) then
  93. writeln('test4 failed');
  94. i := $80000000;
  95. writeln(i);
  96. if not testlongint_int64(i,true) then
  97. writeln('test5 failed');
  98. dec(i);
  99. writeln(i);
  100. if not testlongint_int64(i,false) then
  101. writeln('test6 failed');
  102. i := $ffffffff;
  103. writeln(i);
  104. if not testlongint_int64(i,true) then
  105. writeln('test7 failed');
  106. i := 0;
  107. writeln(i);
  108. if not testlongint_int64(i,false) then
  109. writeln('test8 failed');
  110. { *********************** qword to longint ********************* }
  111. writeln;
  112. writeln('qword to longint');
  113. q := qword($ffffffffffffffff);
  114. writeln(q);
  115. if not testlongint_qword(q,true) then
  116. writeln('test1 failed');
  117. q := q and $ffffffff00000000;
  118. writeln(q);
  119. if not testlongint_qword(q,true) then
  120. writeln('test2 failed');
  121. inc(q);
  122. writeln(q);
  123. if not testlongint_qword(q,true) then
  124. writeln('test3 failed');
  125. q := $ffffffff80000000;
  126. writeln(q);
  127. if not testlongint_qword(q,true) then
  128. writeln('test4 failed');
  129. q := $80000000;
  130. writeln(q);
  131. if not testlongint_qword(q,true) then
  132. writeln('test5 failed');
  133. dec(q);
  134. writeln(q);
  135. if not testlongint_qword(q,false) then
  136. writeln('test6 failed');
  137. q := $ffffffff;
  138. writeln(q);
  139. if not testlongint_qword(q,true) then
  140. writeln('test7 failed');
  141. q := 0;
  142. writeln(q);
  143. if not testlongint_qword(q,false) then
  144. writeln('test8 failed');
  145. { *********************** int64 to dword ********************* }
  146. writeln;
  147. writeln('int64 to dword');
  148. i := $ffffffffffffffff;
  149. writeln(i);
  150. if not testdword_int64(i,true) then
  151. writeln('test1 failed');
  152. i := i and $ffffffff00000000;
  153. writeln(i);
  154. if not testdword_int64(i,true) then
  155. writeln('test2 failed');
  156. inc(i);
  157. writeln(i);
  158. if not testdword_int64(i,true) then
  159. writeln('test3 failed');
  160. i := $ffffffff80000000;
  161. writeln(i);
  162. if not testdword_int64(i,true) then
  163. writeln('test4 failed');
  164. i := $80000000;
  165. writeln(i);
  166. if not testdword_int64(i,false) then
  167. writeln('test5 failed');
  168. dec(i);
  169. writeln(i);
  170. if not testdword_int64(i,false) then
  171. writeln('test6 failed');
  172. i := $ffffffff;
  173. writeln(i);
  174. if not testdword_int64(i,false) then
  175. writeln('test7 failed');
  176. i := 0;
  177. writeln(i);
  178. if not testdword_int64(i,false) then
  179. writeln('test8 failed');
  180. { *********************** qword to dword ********************* }
  181. writeln;
  182. writeln('qword to dword');
  183. q := $ffffffffffffffff;
  184. writeln(q);
  185. if not testdword_qword(q,true) then
  186. writeln('test1 failed');
  187. q := q and $ffffffff00000000;
  188. writeln(q);
  189. if not testdword_qword(q,true) then
  190. writeln('test2 failed');
  191. inc(q);
  192. writeln(q);
  193. if not testdword_qword(q,true) then
  194. writeln('test3 failed');
  195. q := $ffffffff80000000;
  196. writeln(q);
  197. if not testdword_qword(q,true) then
  198. writeln('test4 failed');
  199. q := $80000000;
  200. writeln(q);
  201. if not testdword_qword(q,false) then
  202. writeln('test5 failed');
  203. dec(q);
  204. writeln(q);
  205. if not testdword_qword(q,false) then
  206. writeln('test6 failed');
  207. q := $ffffffff;
  208. writeln(q);
  209. if not testdword_qword(q,false) then
  210. writeln('test7 failed');
  211. q := 0;
  212. writeln(q);
  213. if not testdword_qword(q,false) then
  214. writeln('test8 failed');
  215. if error then
  216. begin
  217. writeln;
  218. writeln('still range check problems!');
  219. halt(1);
  220. end;
  221. end.