range.pp 4.9 KB

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