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-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,4c9e8467ab75bb40,start X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2004-03-08 12:31:46 PST Path: archiver1.google.com!postnews1.google.com!not-for-mail From: adam@irvine.com (Adam Beneschan) Newsgroups: comp.lang.ada Subject: Derived types, private parts, abstract subprograms Date: 8 Mar 2004 12:31:43 -0800 Organization: http://groups.google.com Message-ID: NNTP-Posting-Host: 66.126.103.122 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Trace: posting.google.com 1078777906 29930 127.0.0.1 (8 Mar 2004 20:31:46 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Mon, 8 Mar 2004 20:31:46 +0000 (UTC) Xref: archiver1.google.com comp.lang.ada:6167 Date: 2004-03-08T12:31:43-08:00 List-Id: We believe we have found an error in some Ada source code that is publicly available on the Internet, that isn't supposed to compile but that some compilers apparently let slip through. However, I wanted to ask to make sure my interpretation of the RM is correct. package pak1 is type T1 is abstract tagged null record; procedure Operation (X : T1) is abstract; end pak1; with pak1; package pak2 is type T2 is new pak1.T1 with null record; private procedure Operation (X : T2); end pak2; package pak3 is procedure Foo; end pak3; with pak2; package body pak3 is type T3 is new pak2.T2 with null record; procedure Foo is X : T3; begin Operation (X); --legal? end Foo; end pak3; As I interpret the RM: When T2 is declared, Operaton is inherited, but the inherited subprogram is still abstract. 3.9.3(6) says that Operation must be overridden with a nonabstract procedure, but that the overriding may be done in the private part, which is what's done here. When T3 is declared, T2's primitive subprograms are inherited. As I understand it, this includes primitive subprograms of T2 that are overridden, since those would reemerge in places where the overriding subprogram isn't visible. Is this correct in general for derived types? Thus, it would seem that T3 would inherit both the abstract and the nonabstract versions of Operation from T2; but by 7.3.1(6), the nonabstract version is not visible in places where pak2's private part is not visible. In this instance, the nonabstract inherited version of Operation that operates on T3 is, in the language of 7.3.1(6), "not declared at all" and thus "cannot be named in a call" (but still could be called indirectly with a dispatching call). This would seem to mean that the call with the "--legal?" comment cannot name the nonabstract inherited Operation; however, the *abstract* inherited Operation is still visible (reemerges?), and thus Operation in this statement names this subprogram, but this makes the call illegal because it's a nondispatching call on an abstract subprogram (3.9.3(7)). Is this all correct? Is this the intent of the language? It seems like it should be, because declaring pak2.Operation in the private part of pak2 should mean that you can't call it directly when the private part of pak2 isn't visible, even via a derived type. But I want to make sure there isn't any subtlety I've missed before I make a bug report. Thanks in advance for any help, -- Adam