Range checking not working as expected?
- From: Maciej Sobczak <no.spam@xxxxxxxxxxx>
- Date: Thu, 28 Jul 2005 17:00:13 +0200
Hello,
Consider this:
with Ada.Text_IO, Ada.Integer_Text_IO;
procedure Overflow is
A : Integer := 0;
D : constant Integer := 500000000;
begin
for I in 1..20 loop
Ada.Integer_Text_IO.Put(A);
Ada.Text_IO.New_Line;
A := A + D;
end loop;
end Overflow;On my machine (PC+Linux+GNAT) it produces the following output:
0 500000000 1000000000 1500000000 2000000000 -1794967296 -1294967296 -794967296 -294967296 205032704 705032704 1205032704 1705032704 -2089934592 -1589934592 -1089934592 -589934592 -89934592 410065408 910065408
Not good - I expected constraint error instead of going round the counter.
What has really confused me is that declaring A as Natural gives the same effect.
Further investigation with the following declarations:
type MyType is range 0..Integer'Last; A : MyType := 0;
(and type casts later, when necessary)
showed exactly the same effect. Following this path, I tried this:
type MyType is range 0..Integer'Last - 1; A : MyType := 0;
And *now* I got what I wanted - the constraint error.
What's going on? Well, I understand the low-level mechanics of this difference (and also why this might be a border-case for the compiler), but the question is rather high-level: what does *that* mean? :)
-- Maciej Sobczak : http://www.msobczak.com/ Programming : http://www.msobczak.com/prog/ .
- Follow-Ups:
- Re: Range checking not working as expected?
- From: Vinzent 'Gadget' Hoefler
- Re: Range checking not working as expected?
- Prev by Date: Re: Ada Plugin for Eclipse
- Next by Date: Re: Range checking not working as expected?
- Previous by thread: Ada Plugin for Eclipse
- Next by thread: Re: Range checking not working as expected?
- Index(es):
Relevant Pages
|