From: aio!dnsurber@tmc.edu (Douglas N. Surber)
Subject: Re: null arrays
Date: 18 Nov 92 14:48:45 GMT [thread overview]
Message-ID: <dnsurber.722098125@node_26400> (raw)
In <BxvtCA.LM1@dale.cts.com> jhb@dale.cts.com (John Bollenbacher) writes:
>procedure TEST is
> subtype T is NATURAL range 0 .. 10;
> type ARR is array (T range <>) of BOOLEAN;
>
> type A(N : T := 0) is record
> DATA : ARR(1..N);
> end record;
> I : INTEGER;
> O : A := (3, (TRUE, FALSE, TRUE));
>
> N1 : constant ARR := O.DATA(1..0) & O.DATA(1..0);
> N2 : constant ARR := O.DATA(1..0) & O.DATA(3..2);
N2'first = 3 (LRM 4.5.3 4)
>begin
> I := N1'LENGTH; -- I = 0
> I := N2'LENGTH; -- I = 0
> O := (0, N1); -- does not raise constraint
> O := (0, N2); -- raises constraint
O.Data'first /= N2'first thus raises constraint error (LRM 4.3.1 3, 3.3 4)
>end TEST;
The trick here is that the constraint error is raised in forming the
aggregate, not in the assignment. LRM 4.3.1 3 says "A check is made that
the value of each subcomponent of the aggregate _belongs_ to the subtype
of this component." The magic word is "belongs". LRM 3.3 4 says "a value
is said to belong to a subtype of a given type if it belongs to the type
and satisfies the constraint." The bounds of N2, i.e. 3 and 2, do not
satisfy the constraint of the aggregate, i.e. in the range 1 .. 0. If this
were an array assignment rather than an aggregate, it would work.
Douglas Surber
Lockheed
Houston, TX
next reply other threads:[~1992-11-18 14:48 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
1992-11-18 14:48 Douglas N. Surber [this message]
-- strict thread matches above, loose matches on Subject: below --
1992-11-20 20:38 null arrays Tucker Taft
1992-11-18 13:22 cis.ohio-state.edu!zaphod.mps.ohio-state.edu!saimiri.primate.wisc.edu!apl
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox