comp.lang.ada
 help / color / mirror / Atom feed
From: Niklas Holsti <niklas.holsti@tidorum.invalid>
Subject: Re: Array conversion and bounds
Date: Sun, 15 Apr 2018 13:37:00 +0300
Date: 2018-04-15T13:37:00+03:00	[thread overview]
Message-ID: <fjgoacFo8s4U1@mid.individual.net> (raw)
In-Reply-To: <pav6el$pg1$1@gioia.aioe.org>

On 18-04-15 12:36 , Dmitry A. Kazakov wrote:
> Do array bounds slide during conversion? Consider this:
>
>    type A is array (Integer range <>) of Whatever;
>    type B is array (Unsigned_32 range <>) of Whatever;
>
>    X : A (-10..-1);
>    Y : B (1..10);
> begin
>    Y := B (X); -- Is this OK?
>
> If bounds slide it must be OK, if bounds do not slide, it must raise
> Constraint_Error.
>
> Any language lawyers?

I believe the bounds should _not_ slide, because the "target subtype" of 
the conversion is type B, which is an _unconstrained_ array subtype.

Conversions to an unconstrained array subtype are governed by RM 4.6(38):

"If the target subtype is an unconstrained array subtype, then the 
bounds of the result are obtained by converting each bound of the value 
of the operand to the corresponding index type of the target type. For 
each nonnull index range, a check is made that the bounds of the range 
belong to the corresponding index subtype."

Since -10 and -1 do not below to Unsigned_32, the conversion should 
raise Constraint_Error.

This, deceptively similar, code should use sliding: the changes are to 
introduce

    subtype B_10 is B (1..10);

and change the conversion to B_10 (X). Now the "target subtype" is B_10, 
which is constrained, and then the conversion follows RM 4.6(37), 
especially the last sentence:

"If the target subtype is a constrained array subtype, then a check is 
made that the length of each dimension of the value of the operand 
equals the length of the corresponding dimension of the target subtype. 
The bounds of the result are those of the target subtype."

RM 4.6(39) then says how the components of the result are defined:

"In either array case, the value of each component of the result is that 
of the matching component of the operand value (see 4.5.2)."

The specification of "matching component" means sliding, if the index 
ranges of the source and target are different.

Caution: I have only "proved" the above against the Ada RM, but not 
tested it :-)

-- 
Niklas Holsti
Tidorum Ltd
niklas holsti tidorum fi
       .      @       .

  reply	other threads:[~2018-04-15 10:37 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-15  9:36 Array conversion and bounds Dmitry A. Kazakov
2018-04-15 10:37 ` Niklas Holsti [this message]
2018-04-15 12:34   ` Dmitry A. Kazakov
2018-04-15 13:11     ` Niklas Holsti
2018-04-15 13:24       ` Dmitry A. Kazakov
2018-04-15 18:21         ` Niklas Holsti
2018-04-15 20:29           ` Dmitry A. Kazakov
2018-04-15 17:55 ` Robert A Duff
2018-04-15 20:15   ` Dmitry A. Kazakov
replies disabled

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