From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Ada design bug or GNAT bug?
Date: Fri, 3 Jul 2015 10:02:30 +0200
Date: 2015-07-03T10:02:30+02:00 [thread overview]
Message-ID: <1oyc7ksu2lrwz.1h4pqchzcyfzt.dlg@40tude.net> (raw)
In-Reply-To: mn4jj2$n50$4@loke.gir.dk
On Thu, 2 Jul 2015 17:22:08 -0500, Randy Brukardt wrote:
> "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> wrote in message
> news:ykiyl6yc44or$.19365hv76bzoi.dlg@40tude.net...
>> On Mon, 22 Jun 2015 12:39:16 -0500, Randy Brukardt wrote:
>>
>>> We don't have a choice about allowing hidden controlling results and
>>> controlling access results (unless, of course, we want to abandon real
>>> privacy, which we're not going to do).
>>
>> If function is invisible it is, and its result is as well.
>
> Not really, because you can still dispatch to it (if the dispatching is
> somewhere that the private function is visible); dispatching does not
> respect privacy (as privacy is only a compile-time, not runtime, concept).
I don't see a scenario where you could dispatch on an invisible primitive
operation. First you must get into a context where you would have a view of
your type having that operation. This context cannot exist without another
context where the type gets derived. In that context you must have
overridden the operation. Where is a problem? Is it related to MI? [But Ada
does not respect privacy, when it checks inherited stuff, it does this as
if in a full view of the type, which is another language bug, but still no
problem.]
> I realize that you hate redispatching (a point that I tend to agree with you
> on), but it's possible, and it's needed some part of the time (maybe 10% or
> even less, but more than 0%), so it exists and has to be taken into account.
But even if you convert to the class-wide you don't get visibility of the
operation. In the scenario:
type T3 is new T1 with private;
private
type T3 is new T2 with null record; -- Legal!
a public client could not convert a T3 object to T2'Class. Could it?
>>> have the feature at all (which is where I would stand).
>>
>> I don't see connection to anonymous access types, the rule applies to
>> tagged results as well:
>>
>> package P1 is
>> type T1 is tagged null record;
>> type T2 is new T1 with null record;
>> function Foo return T2;
>> 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; -- Legal!
>
> This is only legal because of a hack, which I was very much against
> introducing. If you have an extension component, this is illegal:
>
> type T4 is new T2 with record C : Character := '1'; end record; --
> Illegal!!!
Yes, the hack you mean is contravariance of an out argument or result based
on a guess about the type implementation (null extension). It is wrong from
the strong typing POV.
>> end P2;
>
> I have tried to find a way to avoid this maintenance hazard (it's especially
> bad for mix-in generics), but I haven't gotten any traction to date. We
> could (if all of the extension components have defaults) automatically do
> this as we do for null record, but the problem is that making overriding
> required often detects bugs (failure to create a proper overriding). Plus
> the problem of incompatibility (only in obscure cases).
No. I know you don't believe in science and proofs but still, conravariance
in outputs is just wrong (under type extension).
Instead of ugly hacks we better have had some delegation/body-composition
methods at the declaration place to be able to tell that the overriding is
basically the parent's implementation. We already allowed such stuff, e.g.
procedure Foo (...) is null;
We have ugly executable precondition code at the declaration side. Why not
to allow this for functions?
>> 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 T3; -- ILLEGAL!
>> end P2;
>>
>> As such the rule does not make any sense. You shall under no circumstance
>> prohibit overriding of inherited operations.
>
> That's only possible if you prohibit any extensions of T3. (Otherwise, you
> get the dispatching problems that I noted previously, or you have to break
> privacy by making the derived type illegal for something that is not
> visible.) We've talked a bit about having such an aspect, but it is messy.
Could you provide an example of dispatching problems you have in mind?
> To summarize: it's a bad interaction between privacy and things that require
> overriding (abstract subprograms follow the same rules for the same
> reasons). There's no real solution, else you could call abstract
> subprograms -- and then what??
Honestly I never understood how that could happen. The dispatching table
must be defined for any non-abstract instance. This is statically enforced,
isn't it?
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
next prev parent reply other threads:[~2015-07-03 8:02 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
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 [this message]
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