comp.lang.ada
 help / color / mirror / Atom feed
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.

  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