trange3.pp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. {$mode objfpc}
  2. uses sysutils;
  3. {$r+}
  4. var
  5. a1: array[-5..6] of byte;
  6. a2: array[-12..-1] of byte;
  7. a3: array[0..6] of byte;
  8. a4: array[1..12] of byte;
  9. c: cardinal;
  10. l: longint;
  11. b: byte;
  12. finalerror: boolean;
  13. function check_longint(l: longint; res1, res2, res3, res4: boolean): boolean;
  14. var
  15. caught,
  16. error: boolean;
  17. begin
  18. result := false;
  19. caught := false;
  20. try
  21. b := a1[l];
  22. except
  23. caught := true;
  24. end;
  25. error := caught <> res1;
  26. if error then writeln('long 1 failed for ',l);
  27. result := result or error;
  28. caught := false;
  29. try
  30. b := a2[l];
  31. except
  32. caught := true;
  33. end;
  34. error := caught <> res2;
  35. if error then writeln('long 2 failed for ',l);
  36. result := result or error;
  37. caught := false;
  38. try
  39. b := a3[l];
  40. except
  41. caught := true;
  42. end;
  43. error := caught <> res3;
  44. if error then writeln('long 3 failed for ',l);
  45. result := result or error;
  46. caught := false;
  47. try
  48. b := a4[l];
  49. except
  50. caught := true;
  51. end;
  52. error := caught <> res4;
  53. if error then writeln('long 4 failed for ',l);
  54. result := result or error;
  55. writeln;
  56. end;
  57. function check_cardinal(l: cardinal; res1, res2, res3, res4: boolean): boolean;
  58. var
  59. caught,
  60. error: boolean;
  61. begin
  62. result := false;
  63. caught := false;
  64. try
  65. b := a1[l];
  66. except
  67. caught := true;
  68. end;
  69. error := caught <> res1;
  70. if error then writeln('card 1 failed for ',l);
  71. result := result or error;
  72. caught := false;
  73. try
  74. b := a2[l];
  75. except
  76. caught := true;
  77. end;
  78. error := caught <> res2;
  79. if error then writeln('card 2 failed for ',l);
  80. result := result or error;
  81. caught := false;
  82. try
  83. b := a3[l];
  84. except
  85. caught := true;
  86. end;
  87. error := caught <> res3;
  88. if error then writeln('card 3 failed for ',l);
  89. result := result or error;
  90. caught := false;
  91. try
  92. b := a4[l];
  93. except
  94. caught := true;
  95. end;
  96. error := caught <> res4;
  97. if error then writeln('card 4 failed for ',l);
  98. result := result or error;
  99. writeln;
  100. end;
  101. begin
  102. finalerror :=
  103. check_longint(-1,false,false,true,true);
  104. finalerror :=
  105. check_longint(-6,true,false,true,true) or finalerror;
  106. finalerror :=
  107. check_longint(0,false,true,false,true) or finalerror;
  108. finalerror :=
  109. check_cardinal(0,false,true,false,true);
  110. finalerror :=
  111. check_cardinal(cardinal($ffffffff),true,true,true,true) or finalerror;
  112. finalerror :=
  113. check_cardinal(5,false,true,false,false) or finalerror;
  114. if finalerror then
  115. begin
  116. writeln('Still errors in range checking for array indexes');
  117. halt(1);
  118. end;
  119. end.