From: Philippe Tarroux <philippe.tarroux@limsi.fr>
Subject: Re: Interfaces and private types
Date: Tue, 29 Jan 2008 10:35:40 +0100
Date: 2008-01-29T10:35:40+01:00 [thread overview]
Message-ID: <fnmruc$ive$1@news2.u-psud.fr> (raw)
In-Reply-To: <fnlmms$28q$1@jacob-sparre.dk>
Randy Brukardt wrote:
> Specifically, it violates 7.3(7.3/2): "the partial view shall be a
> descendant of an interface type (see 3.9.4) if and only if the full type is
> a descendant of the interface type."
>
> As written, this is illegal because type T does not have the interface
> Int.
As it is written the compiler i use doesn't mention any error and i
interpreted this construct as legal because :
1/ the interface is synchronized thus allowing to derive concurrent or
non concurrent types
2/ The partial view is a descendant of the interface type
3/ The full view precises that the partial view correspond to a
concurrent type but hides this detail to the user
Writing, as you propose
task type T is new Int with private;
tells the user that T is a concurrent type, what precisely i wanted to
avoid.
> Assuming that this is just a mistake in your interface and you meant
>
> task type T is new Int with
>
> then your program is legal, and you should complain your your compiler
> vendor about the bug. In no case should there be an error on the declaration
> of the object, so that makes it pretty clear that there is a compiler bug.
>
> You could work around the bug with something like:
>
> package Test_Interfaces is
>
> type Int is synchronized interface;
> procedure Init (I : in out Int) is abstract;
>
> type T is new Int with private;
> overriding procedure Init (I : in out T);
>
> private
>
> task type T is new Int with
> entry Init;
> end T;
> end Test_Interfaces;
>
> and then have
> procedure Init (I : in out T) is
> begin
> I.Init;
> end Init;
> in the body. (But note that this runs into a known bug in the Ada standard,
> so it isn't clear that the code will work right.)
>
But the overriding procedure Init needs to be redefined both as an entry
of T and as a procedure. I assume that when i will be trying to call
O.Init with O a type T task there will be a mistake due to the double
definition.
But, anyway, thanks a lot for the comments. I am waiting for comments
from the guys who are in charge of the gnat compiler.
Philippe Tarroux
next prev parent reply other threads:[~2008-01-29 9:35 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-28 17:16 Interfaces and private types Philippe Tarroux
2008-01-28 18:21 ` Georg Bauhaus
2008-01-28 22:58 ` Randy Brukardt
2008-01-29 9:35 ` Philippe Tarroux [this message]
2008-01-29 12:48 ` Georg Bauhaus
2008-01-29 13:08 ` Philippe Tarroux
2008-01-29 23:29 ` 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