comp.lang.ada
 help / color / mirror / Atom feed
From: Jere <jhb.chat@gmail.com>
Subject: Re: Potential Coextension Bug in GNAT
Date: Thu, 20 Dec 2018 08:02:27 -0800 (PST)
Date: 2018-12-20T08:02:27-08:00	[thread overview]
Message-ID: <a0fb06da-8a1d-47f5-b488-87e74eda5390@googlegroups.com> (raw)
In-Reply-To: <f8aca7a2-3b3a-4934-8219-c2961dc79458@googlegroups.com>

On Thursday, December 20, 2018 at 10:59:02 AM UTC-5, Jere wrote:
> I was messing around and trying to learn coextensions and
> I came across some counter intuitive functionality.  If I
> directly initialize one via an aggregate, it works fine.
> However, if I initialize through a constructing function, 
> it seems to treat the access discriminant as a normal access
> type and finalizes it at the end of the program instead of
> when the object leaves scope.  I don't fully understand them
> yet and there isn't much on them listed in the RM but one
> section (at least according to the index)[1].  That one
> section does indicate that initialization via a function
> should be valid however, so maybe I am back to I am doing it
> wrong or potentially a GNAT bug.
> 
> I'm using GNAT 7.1.1
> 
> Here is my test program
> 
> ****************************************************
> 
> with Ada.Text_IO; use Ada.Text_IO;
> with Ada.Finalization; use Ada.Finalization;
> 
> procedure Hello is
> 
>     type Thing_1 is new Limited_Controlled with null record;
>     
>     overriding 
>     procedure Finalize(Self : in out Thing_1) is
>     begin
>         Put_Line("Finalize Thing_1");
>     end Finalize;
>     
>     type Thing_2
>         (Other : not null access Thing_1)
>     is limited null record;
>     
>     procedure Test_Coextension_1 is
>         The_Thing : Thing_2(new Thing_1);
>     begin
>         Put_Line("Coextenson directly initialized");
>     end Test_Coextension_1;
>     
>     function Make_Thing_2 return Thing_2 is
>     begin
>         return (Other => new Thing_1);
>     end Make_Thing_2;
>     
>     procedure Test_Coextension_2 is
>         The_Thing : Thing_2 := Make_Thing_2;
>     begin
>         Put_Line("Coextension initialized through build in place");
>     end Test_Coextension_2;
>     
> begin
>     Test_Coextension_1;
>     Test_Coextension_2;
>     Put_Line("Test Finished");
> end Hello;
> 
> ****************************************************
> 
> Any thoughts?
> 
> [1] Ada 2012 tc1 RM 3.10.2(14.4/3) - http://www.ada-auth.org/standards/rm12_w_tc1/html/RM-3-10-2.html#I2301

Sorry, forgot to put the program output:
**************************************************
$gnatmake -o hello *.adb
gcc -c hello.adb
gnatbind -x hello.ali
gnatlink hello.ali -o hello
$hello
Coextenson directly initialized
Finalize Thing_1
Coextension initialized through build in place
Test Finished
Finalize Thing_1


  reply	other threads:[~2018-12-20 16:02 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-20 15:59 Potential Coextension Bug in GNAT Jere
2018-12-20 16:02 ` Jere [this message]
2018-12-20 16:56 ` Simon Wright
2018-12-21  2:16   ` Randy Brukardt
2018-12-21 11:24   ` Jere
2018-12-20 17:58 ` Simon Wright
2018-12-21  2:25   ` Randy Brukardt
2018-12-21 11:32     ` Jere
replies disabled

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