From: Sébastien Morand on
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,

I'm implementing a B-Tree in Ada using indefinite private type:

generic
-- Element to be stored in the btree
type Element (<>) is private;
-- Null element when not found
Element_Null: Element;
-- Key of the element in the B-Tree wich must be compareable
type Key (<>) is private;
with function "<"(k1: in Key; k2: in Key) return Boolean;
with function ">"(k1: in Key; k2: in Key) return Boolean;
with procedure Put_Line(k: in Key);
-- Order of the B-Tree
Order: Positive;
package SCMAL.Tools.BTrees is

-- Omitted

end SCMAL.Tools.BTrees;


When I create an instance of the package using the following code:

9 package IT is new SCMAL.Tools.BTrees(
10 Element => Integer,
11 Element_Null => 0,
12 Key => Integer,
13 "<" => "<",
14 ">" => ">",
15 Put_Line => Put_Line,
16 Order => 1
17 );

I got the following warnings:
btreetests.adb:9:04: warning: in instantiation at scmal-tools-btrees.adb:159
btreetests.adb:9:04: warning: value not in range of subtype of
"Standard.Integer" defined at scmal-tools-btrees.ads:82, instance at line 9
btreetests.adb:9:04: warning: "Constraint_Error" will be raised at run time
btreetests.adb:9:04: warning: in instantiation at scmal-tools-btrees.adb:160
btreetests.adb:9:04: warning: value not in range of subtype of
"Standard.Integer" defined at scmal-tools-btrees.ads:83, instance at line 9
btreetests.adb:9:04: warning: "Constraint_Error" will be raised at run time
btreetests.adb:9:04: warning: in instantiation at scmal-tools-btrees.adb:161
btreetests.adb:9:04: warning: value not in range of subtype of
"Standard.Integer" defined at scmal-tools-btrees.ads:84, instance at line 9
btreetests.adb:9:04: warning: "Constraint_Error" will be raised at run time
btreetests.adb:9:04: warning: in instantiation at scmal-tools-btrees.adb:177
btreetests.adb:9:04: warning: value not in range of subtype of
"Standard.Integer" defined at scmal-tools-btrees.ads:82, instance at line 9
btreetests.adb:9:04: warning: "Constraint_Error" will be raised at run time
btreetests.adb:9:04: warning: in instantiation at scmal-tools-btrees.adb:178
btreetests.adb:9:04: warning: value not in range of subtype of
"Standard.Integer" defined at scmal-tools-btrees.ads:83, instance at line 9
btreetests.adb:9:04: warning: "Constraint_Error" will be raised at run time

but I run time it works fine and I have no constraint error.

Where theses warnings come from? How to correct my code?
Is there a way to avoid to take the default "<" and ">" function?

Thanks by advance,
Sebastien
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (Cygwin)

iD8DBQFIV+na+zV9xm4PlDQRAn1vAJ4hWuphvyP5DAU/zTB2iH4jP+DuMQCdF252
4ZGus6+yxjCwqug3lqycgsY=
=XSuj
-----END PGP SIGNATURE-----
From: Dmitry A. Kazakov on
On Tue, 17 Jun 2008 16:44:10 +0000, S�bastien Morand wrote:

> When I create an instance of the package using the following code:
>
> 9 package IT is new SCMAL.Tools.BTrees(
> 10 Element => Integer,
> 11 Element_Null => 0,
> 12 Key => Integer,

As a guess, there could be a conflict upon instantiation when Element and
Key are the same type. I had once such a problem. GNAT always had problems
with generics.

> Where theses warnings come from? How to correct my code?

Maybe it is just a compiler bug. But you should post a complete compilable
code.

> Is there a way to avoid to take the default "<" and ">" function?

I don't see you using defaults for the formal parameters "<" and ">". You
have:

with function "<"(k1: in Key; k2: in Key) return Boolean;
with function ">"(k1: in Key; k2: in Key) return Boolean;

not

with function "<"(k1: in Key; k2: in Key) return Boolean is <>;
with function ">"(k1: in Key; k2: in Key) return Boolean is <>;

--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
From: Sébastien Morand on
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

> Maybe it is just a compiler bug. But you should post a complete compilable
> code.

Here is a complete code with the same warning:

procedure Main is

generic
-- Element to be stored in the btree
type Element (<>) is private;
Order: Positive;
package TestGen is

type ElementPtr is access all Element;

Buffer: array(1 .. Order*2) of ElementPtr;
procedure Store(E: in Element; index: in Positive);

end TestGen;

package body TestGen is

procedure Store(E: in Element; index: in Positive) is
begin
-- In my real procedure, index is calculated and there is some
-- check. Index can't be > Order*2
for i in Positive range Order+2 .. index-1 loop
Buffer(i) := new Element'(E);
end loop;
end Store;

end TestGen;

package IntTestGen is new TestGen(
Element => Integer,
Order => 1
);
use IntTestGen;

begin

Store(1, 4);

end Main;

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (Cygwin)

iD8DBQFIWAOF+zV9xm4PlDQRAqdzAJ9Oa+0fS1VgOMo8dypPhkDgpNC0pQCfWwC1
cCWtqImCosykrr1tzGBf8gY=
=J0c5
-----END PGP SIGNATURE-----
From: Dmitry A. Kazakov on
On Tue, 17 Jun 2008 18:33:42 +0000, S�bastien Morand wrote:

>> Maybe it is just a compiler bug. But you should post a complete compilable
>> code.

No, it is not. The compiler is correct.

> Here is a complete code with the same warning:
>
> procedure Main is
>
> generic
> -- Element to be stored in the btree
> type Element (<>) is private;
> Order: Positive;
> package TestGen is
> type ElementPtr is access all Element;
> Buffer: array(1 .. Order*2) of ElementPtr;
> procedure Store(E: in Element; index: in Positive);
> end TestGen;
>
> package body TestGen is
> procedure Store(E: in Element; index: in Positive) is
> begin
> -- In my real procedure, index is calculated and there is some
> -- check. Index can't be > Order*2
> for i in Positive range Order+2 .. index-1 loop

The problem is here. You instantiate TestGen with Order = 1. So the upper
bound of Buffer is 2. Therefore the range is 1+2..Index, which should cause
Constraint_Error in Buffer(I).

Bravo GNAT! (Though the warning message could be better)

> Buffer(i) := new Element'(E);
> end loop;
> end Store;
> end TestGen;
> package IntTestGen is new TestGen(
> Element => Integer,
> Order => 1
> );
> use IntTestGen;
> begin
> Store(1, 4);
> end Main;

--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
From: Sébastien Morand on
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1


> The problem is here. You instantiate TestGen with Order = 1. So the upper
> bound of Buffer is 2. Therefore the range is 1+2..Index, which should cause
> Constraint_Error in Buffer(I).

I understand, if Order = 1, then the code could never occur.

Anyway, There is a test just before in the real code that avoid the
impossible situation (index is between 1 and Order*2 always).

I could remove all the warnings except one that I had to change in a
While clause. But I put a comment in the code to explain why.

Thanks to show what I actually should have seen by myself.

Sebastien
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (Cygwin)

iD8DBQFIWMo7+zV9xm4PlDQRAuDMAJ9/qDRM1TL617fgDICj1JIYfgxcCgCgh2aI
Xsga9iFVpUAYBO5FKHJ6wXk=
=qGlV
-----END PGP SIGNATURE-----