From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: Ada design bug or GNAT bug?
Date: Sat, 20 Jun 2015 21:42:44 -0500
Date: 2015-06-20T21:42:44-05:00 [thread overview]
Message-ID: <mm58b5$9k0$1@loke.gir.dk> (raw)
In-Reply-To: yo94phsbcvht$.1bktwe2qoqntt$.dlg@40tude.net
"Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> wrote in message
news:yo94phsbcvht$.1bktwe2qoqntt$.dlg@40tude.net...
> Is it intentional that there is no way to derive from a more specific type
> privately? A key design pattern is no more possible in GNAT GPL 2015:
>
> package P1 is
> type T1 is tagged null record;
> type T2 is new T1 with null record;
> function Foo return not null access T2;
Anonymous access types are evil; there cannot be a "key design" pattern
using them. :-)
Since you did use an anonymous access result, you have a function with a
"controlling access result". This works much like
function Bar return T2;
which has a "controlling result".
If you had used a named access type, you definitely would not have this
problem - 3.9.3(10/3) only applies to anonymous access types.
> end P1;
>
> with P1; use P1;
> package P2 is
> type T3 is new T1 with private;
> private
> type T3 is new T2 with null record;
> overriding function Foo return not null access T3; -- Illegal!
> end P2;
>
> p2.ads:5:09: type must be declared abstract or "Foo" overridden
> p2.ads:5:09: "Foo" has been inherited from subprogram at p1.ads:4
> p2.ads:6:24: private function with tagged result must override
> visible-part
> function
> p2.ads:6:24: move subprogram to the visible part (RM 3.9.3(10))
>
> [ Since when access types became tagged? ]
They're not "tagged", but they dispatch as if they were tagged (if
anonymous). So they have to follow the same rules as with a tagged type.
> There seem no way to implement T3 by deriving from T2. *Any* declaration
> of
> Foo would be illegal.
>
> 1. It cannot be inherited
> 2. A public declaration is not an overriding
> 3. A private declaration must be public
Right. The same would happen for the function Bar that I noted above.
But that just means that you can't hide T2. There's no good reason to not
declare T3 as
type T3 is new T2 with private;
and that eliminates any problem (you can then declare Foo anywhere you want
in the spec).
Anyway, it's definitely *not* a design bug. It follows from the requirement
that one can dispatch on the result; we can't allow dispatching to functions
that return the wrong kind of thing. 6.5(8.1/3) would require any attempt to
return the wrong kind of thing to raise Constraint_Error. That requires a
new body and automatically generating one that always raises
Constraint_Error would be madness. Thus the "shall be overridden"
requirement.
Perhaps you didn't want to dispatch on the result, but too bad, that's how
anonymous access designated tagged types is defined (it's supposed to be an
exact equivalent of anonymous access parameters). If there's a design bug,
it's the existence of anonymous access types at all with these unusual
special properties.
Anyway, there are three workarounds: (1) don't hide T2; (2) use a named
access type; (3) use a class-wide type for the return (thus turning off
dispatching).
Randy.
next prev parent reply other threads:[~2015-06-21 2:42 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-20 18:55 Ada design bug or GNAT bug? Dmitry A. Kazakov
2015-06-21 2:42 ` Randy Brukardt [this message]
2015-06-21 6:47 ` Dmitry A. Kazakov
2015-06-22 17:39 ` Randy Brukardt
2015-06-22 18:16 ` Dmitry A. Kazakov
2015-06-23 11:00 ` G.B.
2015-06-23 14:27 ` Dmitry A. Kazakov
2015-06-23 11:45 ` G.B.
2015-06-23 14:30 ` Dmitry A. Kazakov
2015-07-02 22:22 ` Randy Brukardt
2015-07-03 8:02 ` Dmitry A. Kazakov
2015-07-03 17:33 ` Randy Brukardt
2015-07-03 21:34 ` Dmitry A. Kazakov
2015-07-04 3:11 ` Randy Brukardt
2015-07-04 12:14 ` Dmitry A. Kazakov
2015-07-05 0:53 ` Randy Brukardt
2015-06-22 18:27 ` Shark8
2015-06-23 11:51 ` vincent.diemunsch
2015-06-23 19:55 ` Shark8
2015-06-23 13:06 ` vincent.diemunsch
2015-06-23 14:30 ` David Botton
2015-06-23 15:57 ` Niklas Holsti
2015-06-23 16:01 ` G.B.
2015-06-23 18:05 ` David Botton
2015-06-23 19:38 ` David Botton
2015-06-23 14:38 ` Dmitry A. Kazakov
2015-06-23 16:57 ` Vincent
2015-06-23 17:15 ` Dmitry A. Kazakov
2015-06-23 19:14 ` vincent.diemunsch
2015-06-23 19:33 ` Dmitry A. Kazakov
2015-06-23 17:42 ` Jeffrey R. Carter
2015-07-02 22:06 ` Randy Brukardt
2015-07-04 1:52 ` Shark8
2015-07-04 3:24 ` Randy Brukardt
2015-07-04 11:02 ` Build-in-place semantics? (Was: Ada design bug or GNAT bug?) Jacob Sparre Andersen
2015-07-04 12:15 ` Dmitry A. Kazakov
2015-07-05 0:45 ` Randy Brukardt
2015-07-05 7:10 ` Dmitry A. Kazakov
2015-07-05 0:40 ` Randy Brukardt
2015-07-04 14:05 ` Ada design bug or GNAT bug? Bob Duff
2015-07-04 7:46 ` Simon Wright
2015-07-04 12:00 ` Björn Lundin
2015-07-05 0:48 ` Randy Brukardt
2015-07-06 12:37 ` Vincent
2015-07-06 20:05 ` Randy Brukardt
2015-07-07 8:06 ` 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