comp.lang.ada
 help / color / mirror / Atom feed
From: Michael Erdmann <michael.erdmann@snafu.de>
Subject: Re: How to get around "access type must not be outside generic unit"
Date: Sun, 17 Dec 2006 15:28:25 +0100
Date: 2006-12-17T15:28:25+01:00	[thread overview]
Message-ID: <ap0g54-fg8.ln1@hal.boavista.snafu.de> (raw)
In-Reply-To: <45853BDC.5000902@obry.net>

Thanks; Solution 2 works, see below :-)

Pascal Obry wrote:
> Michael Erdmann a �crit :
>> gnade@hal:~/test> gnatmake -c usage.adb
>> gcc -c usage.adb
>> usage.adb:16:28: access type must not be outside generic unit
>> gnatmake: "usage.adb" compilation error
>>
>> What is the reason for this new compiler check and what can i do
>> about it?
> 
> Solution 1) Declare register using an anonymous access type :
> 
>    procedure Register
>      (Str : in String; A : access function return Boolean);
> 
Actually this does not work; compiler complains the anonymous types
are not allowed here.

> Solution 2) Move access to generic spec
> 
> with Base; use Base;
> 
> generic
>    type Data_Type is private;
> package Usage is
> 
>    function Install return Boolean ;
>    procedure Doit( X : in out Data_Type );
> 
>    Install_Access : P_Access := Install'Access;
> 
> end Usage;
> 
This works. In order to make Install_Access invisible to the rest of the
world i make it private.

with Base;   use Base;

generic
   type Data_Type is private;
package Usage is

   function Install return Boolean ;
   procedure Doit( X : in out Data_Type );

private
   Install_Access : constant Callback_Access := Install'Access;
end Usage;

But what is the gain of doing it like this. I don't see any
gain in security..?!


> ---- usage.adb
> with Base;   use Base;
> 
> package body Usage is
> 
>    function Install return Boolean is
>    begin
>       return True;
>    end Install;
> 
>    procedure Doit( X : in out Data_Type ) is
>    begin
>       null;
>    end Doit;
> 
> begin
>    Register ("Doit", Install_Access);
> end Usage;
> 
> package Base is
> 
>    type P_Access is access function return Boolean;
> 
>    procedure Register (Str : in String; A : P_Access);
> 
> end Base;
> 
> Pascal.
> 



  reply	other threads:[~2006-12-17 14:28 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-12-17 10:07 How to get around "access type must not be outside generic unit" Michael Erdmann
2006-12-17 12:45 ` Pascal Obry
2006-12-17 14:28   ` Michael Erdmann [this message]
2006-12-17 15:53     ` Pascal Obry
2006-12-17 20:49     ` Robert A Duff
2006-12-18  3:35   ` Brian May
2006-12-18  7:49     ` Jean-Pierre Rosen
2006-12-18 23:15       ` Brian May
2006-12-19  1:48         ` Randy Brukardt
2006-12-19  7:41         ` Jean-Pierre Rosen
2006-12-18 20:32     ` Michael Erdmann
2006-12-18 20:57       ` Randy Brukardt
2007-01-23 18:18 ` [Revisited] How to get around "access type must not be outside generic unit" (was: How to get around "access type must not be outside generic unit") Dmitry A. Kazakov
2007-01-24  0:57   ` Randy Brukardt
2007-01-24 11:42     ` [Revisited] How to get around "access type must not be outside generic unit" Dmitry A. Kazakov
2007-01-24 11:58       ` Ludovic Brenta
2007-01-24 13:46         ` Dmitry A. Kazakov
2007-01-24 20:50       ` Randy Brukardt
2007-01-25 11:07         ` Dmitry A. Kazakov
replies disabled

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