trange5.pp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. {$mode objfpc}
  2. uses sysutils;
  3. {$ifndef FPC}
  4. {$define ENDIAN_LITTLE}
  5. {$endif}
  6. type
  7. int64rec = record
  8. {$ifdef ENDIAN_LITTLE}
  9. lo,hi:
  10. {$else }
  11. hi,lo :
  12. {$endif}
  13. cardinal;
  14. end;
  15. var
  16. haserror,
  17. error: boolean;
  18. b: byte;
  19. s: shortint;
  20. i: smallint;
  21. w: word;
  22. l: longint;
  23. c: cardinal;
  24. t: int64;
  25. q: qword;
  26. {$r+}
  27. begin
  28. haserror := false;
  29. b := 255;
  30. t := b;
  31. q := b;
  32. b := 0;
  33. t := b;
  34. q := b;
  35. s := 127;
  36. t := s;
  37. q := s;
  38. s := -128;
  39. t := s;
  40. try
  41. error := true;
  42. q := s;
  43. except
  44. error := false;
  45. end;
  46. haserror := haserror or error;
  47. w := 0;
  48. t := w;
  49. q := w;
  50. w := 65535;
  51. t := w;
  52. q := w;
  53. i := 32767;
  54. t := i;
  55. q := i;
  56. i := -32768;
  57. t := i;
  58. try
  59. error := true;
  60. q := i;
  61. except
  62. error := false;
  63. end;
  64. haserror := haserror or error;
  65. c := 0;
  66. t := c;
  67. q := c;
  68. c := $ffffffff;
  69. t := c;
  70. q := c;
  71. l := -maxlongint-1;
  72. t := l;
  73. try
  74. error := true;
  75. q := l;
  76. except
  77. error := false;
  78. end;
  79. haserror := haserror or error;
  80. l := maxlongint;
  81. t := l;
  82. q := l;
  83. q := 0;
  84. t := q;
  85. with int64rec(q) do
  86. begin
  87. lo := 0;
  88. hi := $ffffffff;
  89. end;
  90. try
  91. error := true;
  92. t := q;
  93. except
  94. error := false;
  95. end;
  96. haserror := haserror or error;
  97. with int64rec(t) do
  98. begin
  99. lo := 0;
  100. hi := $80000000;
  101. end;
  102. try
  103. error := true;
  104. q := t;
  105. except
  106. error := false;
  107. end;
  108. haserror := haserror or error;
  109. with int64rec(t) do
  110. begin
  111. lo := $ffffffff;
  112. hi := $7fffffff;
  113. end;
  114. q := t;
  115. if haserror then
  116. begin
  117. writeln('64bit range checking still buggy!');
  118. halt(1);
  119. end;
  120. end.