comp.lang.ada
 help / color / mirror / Atom feed
From: Maciej Sobczak <no.spam@no.spam.com>
Subject: Range checking not working as expected?
Date: Thu, 28 Jul 2005 17:00:13 +0200
Date: 2005-07-28T17:00:13+02:00	[thread overview]
Message-ID: <dcarts$doi$1@sunnews.cern.ch> (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/



             reply	other threads:[~2005-07-28 15:00 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-07-28 15:00 Maciej Sobczak [this message]
2005-07-28 15:17 ` Range checking not working as expected? 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
replies disabled

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