From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,f428ff2031155951 X-Google-NewGroupId: yes X-Google-Attributes: gida07f3367d7,domainid0,public,usenet X-Google-Language: ENGLISH,ASCII-7-bit From: "Randy Brukardt" Newsgroups: comp.lang.ada Subject: Re: Equivalent of dynamic_cast (downcast) for tagged types Date: Fri, 28 Jan 2011 17:51:49 -0600 Organization: Jacob Sparre Andersen Research & Innovation Message-ID: References: <375fb596-ab12-4cb0-a190-53d62b94b2e4@e9g2000vbi.googlegroups.com> <510d779c-d15b-4fc1-b831-bfc578ecdb4b@z3g2000prz.googlegroups.com> <7q5flc9of9ey.19h9nmmzjxqn0.dlg@40tude.net> NNTP-Posting-Host: static-69-95-181-76.mad.choiceone.net X-Trace: munin.nbi.dk 1296258711 5747 69.95.181.76 (28 Jan 2011 23:51:51 GMT) X-Complaints-To: news@jacob-sparre.dk NNTP-Posting-Date: Fri, 28 Jan 2011 23:51:51 +0000 (UTC) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5931 X-RFC2646: Format=Flowed; Original Path: g2news2.google.com!news3.google.com!proxad.net!feeder1-2.proxad.net!feed.ac-versailles.fr!news.ecp.fr!news.jacob-sparre.dk!pnx.dk!not-for-mail Xref: g2news2.google.com comp.lang.ada:17751 Date: 2011-01-28T17:51:49-06:00 List-Id: "Dmitry A. Kazakov" wrote in message news:joz7ejpgeda0$.etbrqjysvoke$.dlg@40tude.net... > On Fri, 28 Jan 2011 05:11:16 -0800 (PST), AdaMagica wrote: > >> On 28 Jan., 10:16, "Dmitry A. Kazakov" >> wrote: >>> On Thu, 27 Jan 2011 14:35:28 -0800 (PST), Maciej Sobczak wrote: >>>> I have submitted this bug report more than one year ago. Looks like >>>> nobody even bothered to check it. >>> >>> Well, I am not a language lawyer to tell if the behavior (public >>> overriding >>> of a private primitive operation) is legal. >>> >>>> The bug submission states that Adjust is wrongly recognized as >>>> overriding, which it shouldn't be - but now I have hit something more >>>> interesting. >>> >>> It must be overriding because Adjust is a primitive operation. Whether >>> the >>> compiler should allow it to become publicly declared as an overriding is >>> another question. >> >> The public specification of Ada.Finalization.Limited_Controlled has no >> Adjust operation, so there is no primitive operation with that name >> which you can override, full stop. > > It has no *visible* primitive operation. > >> It's irrelevant if there is some >> internal one deeply burrowed in the compiler's implementation. > > Unfortunately it leaks out. Consider this: > > package P is > type T is tagged private; > private > type T is tagged null record; > procedure Foo (X : in out T); > end P; > > with P; > package Q is > type S is new P.T with null record; > procedure Foo (X : in out S); > end Q; > > with Q; > package P.R is > type U is new Q.S with null record; > procedure Bar (Object : in out U'Class); > end P.R; > > package body P.R is > procedure Bar (Object : in out U'Class) is > begin > Foo (Object); -- Which Foo is called here? Is there one or two? > end Bar; > end P.R; > > This problem can also be observed with components. E.g. P.T may have a > component Baz, declared privately. Q.S may have "another" Baz declared > publicly. P.R.U faces a name conflict which must be resolved in some of > two > possible ways: "overloading" vs. "overriding." In both of these of these cases, there are two operations (no overriding happens). Either one of the Foos is invisible (in which case you get the visible one), or the program is illegal because it is ambiguous. The same happens for the components, with the exception that the type extension is illegal if there is anywhere in the program where two components with the same name could be visible. (That's necessary because they're not overloadable.) That's what the *language* says; any particular compiler may have bugs in this area. For instance, Janus/Ada has an invariant that all component names must be unique. That means an attempt to declare an extension like the one in this example will always fail, even when the hidden components never would be visible. That's wrong, and needs to get fixed someday, but is not much of a priority (the bug is pervasive - the invariant simply is wrong, but virtually all of the component processing code -- designed for Ada 83 -- depends on it, so the fix is very expensive, the bug is rare in real code, and often when it happens the type would have been illegal anyway). Randy.