comp.lang.ada
 help / color / mirror / Atom feed
From: Niklas Holsti <niklas.holsti@tidorum.invalid>
Subject: Re: How can one record component be local and another not?
Date: Wed, 6 May 2020 20:30:55 +0300
Date: 2020-05-06T20:30:55+03:00	[thread overview]
Message-ID: <hhgaifF5g9cU1@mid.individual.net> (raw)
In-Reply-To: <hhdma5Fitq9U1@mid.individual.net>

On 2020-05-05 20:32, hreba wrote:
> Ok, with all your hints I came to the following solution:
> 
> -- 
> package Aux is
>     type Integer_P is access all Integer;
>     type Rec is limited record
>        a: aliased Integer;
>        p: Integer_P;
>     end record;
> 
>     procedure Init (r: access Rec);
> end Aux;
> -- 
> package body Aux is
>     procedure Init (r: access Rec) is
>     begin
>        r.p:= r.a'Access;
>     end Init;
> end Aux;
> -- 
> with Aux;
> procedure Test is
>     r:    aliased Aux.Rec;
> begin
>     Aux.Init (r'Access);
> end Test;
> -- 
> 
> It compiles nicely, and then:
> 
> frank@pc-frank:~/Temp/Test0$ ./test
> raised PROGRAM_ERROR : aux.adb:4 accessibility check failed
> 
> #@!!0ßx*~@!!!

Just to close out this issue, I wrote some test programs and explored 
various changes.

I believe the reason for this exception is that the accessibility level 
of the object "Test.r" is local, nested in the procedure "Test" (so "r" 
exists only for the relevant call of "Test") while the access type 
"Integer_P" is library-level and so out-lasts the call of "Test".

Note that, although "Test" here is no doubt the program's main 
subprogram and so its call (assuming it is not recursive) lasts almost 
as long as the execution of the program, the compiler does not make use 
of this fact to determine the life-times of types and objects in "Test".

If "r" is moved to a package, to be a statically allocated, 
library-level object, "Aux.Init (r'Access)" works without raising this 
exception.

Somewhat surprisingly to me, any call of the form
"Aux.Init (r'Unchecked_Access)" also works, whether "r" is a 
library-level object or a local (limited-life) object, even if 
"Aux.Init" itself uses "'Access" and not "'Unchecked_Access". Apparently 
the accessibility level provided in the value of Unchecked_Access is 
such as to make the check succeed, as for a library-level object.

I also found that a call like "Aux.Init (new Aux.Rec)", which applies 
"Aux.Init" to a heap-allocated "Rec" object, fails the accessibility 
check, so this check is really strict. Of course, the heap object can be 
deallocated at any time, so it may have a short life-time, but that can 
be done (mainly) by Unchecked_Deallocation, so it involves "unchecked" 
programming. Hm.

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

  parent reply	other threads:[~2020-05-06 17:30 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-05 11:04 How can one record component be local and another not? hreba
2020-05-05 11:33 ` AdaMagica
2020-05-05 11:38   ` AdaMagica
2020-05-05 12:59   ` hreba
2020-05-05 13:19     ` J-P. Rosen
2020-05-05 13:37     ` Jere
2020-05-05 14:28       ` hreba
2020-05-05 15:18         ` AdaMagica
2020-05-05 14:32   ` hreba
2020-05-05 11:43 ` AdaMagica
2020-05-05 12:55   ` hreba
2020-05-05 11:46 ` Simon Wright
2020-05-05 13:07   ` hreba
2020-05-05 17:00     ` Dmitry A. Kazakov
2020-05-05 11:48 ` Niklas Holsti
2020-05-05 13:44   ` hreba
2020-05-05 15:45 ` Jeffrey R. Carter
2020-05-05 17:17   ` hreba
2020-05-05 19:08     ` Niklas Holsti
2020-05-06 19:31       ` hreba
2020-05-09 19:43         ` Niklas Holsti
2020-05-10 15:10           ` hreba
2020-05-05 19:19     ` Jere
2020-05-06  6:42     ` Mark Lorenzen
2020-05-06  8:26       ` Simon Wright
2020-05-06  8:33         ` Mark Lorenzen
2020-05-05 17:32 ` hreba
2020-05-05 19:04   ` Niklas Holsti
2020-05-05 20:11     ` Niklas Holsti
2020-05-06 13:13       ` hreba
2020-05-06 17:30   ` Niklas Holsti [this message]
2020-05-06 18:28     ` Jere
2020-05-06 19:09       ` Niklas Holsti
2020-05-07  9:07     ` J-P. Rosen
2020-05-07 10:15       ` Niklas Holsti
2020-05-07 13:00         ` Egil H H
2020-05-07 13:25         ` Simon Wright
2020-05-07 10:31       ` Stefan.Lucks
2020-05-07 11:58         ` J-P. Rosen
replies disabled

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