comp.lang.ada
 help / color / mirror / Atom feed
* Range checking not working as expected?
@ 2005-07-28 15:00 Maciej Sobczak
  2005-07-28 15:17 ` Vinzent 'Gadget' Hoefler
  0 siblings, 1 reply; 6+ messages in thread
From: Maciej Sobczak @ 2005-07-28 15:00 UTC (permalink / raw)


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/



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2005-07-29  0:18 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-07-28 15:00 Range checking not working as expected? Maciej Sobczak
2005-07-28 15:17 ` Vinzent 'Gadget' Hoefler
2005-07-28 15:35   ` Maciej Sobczak
2005-07-28 16:25     ` Jeffrey Carter
2005-07-28 18:10     ` Mark Lorenzen
2005-07-29  0:18     ` Randy Brukardt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox