comp.lang.ada
 help / color / mirror / Atom feed
From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: Default_Storage_Pool
Date: Wed, 21 Feb 2018 19:13:58 -0600
Date: 2018-02-21T19:13:58-06:00	[thread overview]
Message-ID: <p6l5gp$lb2$1@franka.jacob-sparre.dk> (raw)
In-Reply-To: 74cfbf22-7082-4a43-aef9-6a55a049fe61@googlegroups.com

Default_Storage_Pool only has an effect when an access type is declared (not 
when it is used). Thus the allocators for the component of type T should use 
Pool_1 regardless of what the Default_Storage_Pool is when the allocator is 
written.

But I'd expect the local anonymous access allocator to use Pool_2. I don't 
see any reason to use some other pool in this case - 13.11.3(6-6.3/4) is 
pretty clear about this, and the rules specifically were designed so that it 
would apply to anonymous access types.

Thus, this appears to be a bug, but I also fail to see any use for it (the 
anonymous access type having to disappear long before anyone can used the 
return value), so I would probably not give it much priority if it was 
reported to me. (Of course, a fuller example could cause me to change my 
mind on that.)

                                    Randy.

<sbelmont700@gmail.com> wrote in message 
news:74cfbf22-7082-4a43-aef9-6a55a049fe61@googlegroups.com...
Can anyone offer insight into what exactly should happen when 
Default_Storage_Pool is explicitly set within an extended return statement 
to a pool within the return object?  In particular, consider these 
shenanigans:

package O is

   pool_1 : My_Fancy_Pool
   pragma Default_Storage_Pool(pool_1);

   type T is limited
      record
         pool_2 : My_Fancy_Pool
         p1     : access Integer;
      end record;

   function F return T;

end O;

package body O is

   function F return T is
   begin
      return Result : T do
         declare
            pragma Default_Storage_Pool(Result.pool_2);  -- legal?
            p2 : access Integer;
         begin
            p2 := new integer'(42);
            Result.p1 := new integer'(43);
         end;
      end return;
   end F;

end O;

GNAT happily accepts this, but based on print lines, it allocates Result.p1 
from pool_1 and p2 from some unspecified default pool (i.e. neither pool_1 
or pool_2).  I wasn't sure what I was expecting; I assumed an error message, 
but failing that, both to go into result.pool_2, and was surprised to get 
neither.

Any clarifications are appreciated.

-sb 


  reply	other threads:[~2018-02-22  1:13 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-21  2:00 Default_Storage_Pool sbelmont700
2018-02-22  1:13 ` Randy Brukardt [this message]
2018-02-22 13:02   ` Default_Storage_Pool sbelmont700
2018-02-23  0:06     ` Default_Storage_Pool 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