From: Niklas Holsti <niklas.holsti@tidorum.invalid>
Subject: Re: Assignment access type with discriminants
Date: Thu, 23 Mar 2023 20:55:48 +0200 [thread overview]
Message-ID: <k83llkF8ubmU2@mid.individual.net> (raw)
In-Reply-To: <tvi0qt$17pev$1@dont-email.me>
On 2023-03-23 19:04, J-P. Rosen wrote:
> Le 22/03/2023 à 10:19, Dmitry A. Kazakov a écrit :
>> I stumbled on a curious fact.
>>
>> The value of an object with a discriminant can be changed to a value
>> with a different discriminant if the type's discriminants are defaulted.
>>
>> Right?
>>
>> Wrong! Not through an access type!
>>
> (...)
>> Is this a compiler bug or intentional language design? Any language
>> lawyers?
>>
> An access value is always constrained by its initial value; this is
> necessary because of constrained access subtypes.
But constrained access subtypes are not allowed for general access types
like Foo_Ptr in the example.
> Here is a slightly
> modified version of your example:
>
> procedure Test is
> type F is (F1, F2, F3);
>
> type Foo (K : F := F1) is record
> case K is
> when F1 =>
> X1 : Integer;
> when F2 =>
> X2 : Float;
> when F3 =>
> X3 : String (1..2);
> end case;
> end record;
> type Foo_Ptr is access all Foo;
> type Foo_Ptr2 is access Foo;
> X : aliased Foo;
> P : Foo_Ptr := X'Access;
> PF2: Foo_PTR2 (F2);
> begin
> X := (F2, 1.0); -- OK
> PF2 := new Foo (F2);
> P := PF2.all'Access;
> P.all := (F1, 3); -- Error!
> end Test;
>
> Without this rule, PF2.all would now designate a value whose
> discriminant is F1!
This error is understandable and valid, because now P.all is PF2.all
which is an allocated object and therefore constrained by its initial
value with K = F2.
But why should the same apply when P designates X, which is
unconstrained? Is it just an optimization (in the RM) so that a general
access value does not have to carry around a flag showing whether its
designated object is constrained or unconstrained?
Perhaps it would be better to make the assignment P := PF2.all'Access
illegal, because it in effect converts a constrained access value (PF2)
to an unconstrained access subtype (P), and so in some sense violates
the prohibition of constrained subtypes of general access types.
next prev parent reply other threads:[~2023-03-23 18:55 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-22 9:19 Assignment access type with discriminants Dmitry A. Kazakov
2023-03-22 9:31 ` Björn Lundin
2023-03-22 14:10 ` G.B.
2023-03-23 11:51 ` Dmitry A. Kazakov
2023-03-23 16:53 ` AdaMagica
2023-03-23 18:09 ` Niklas Holsti
2023-03-23 17:04 ` J-P. Rosen
2023-03-23 18:55 ` Niklas Holsti [this message]
2023-03-23 19:53 ` Dmitry A. Kazakov
2023-03-24 9:41 ` J-P. Rosen
2023-03-25 8:51 ` 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