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=unavailable autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail From: Simon Wright Newsgroups: comp.lang.ada Subject: Re: Private extension of a synchronized interface Date: Mon, 18 Feb 2019 17:24:03 +0000 Organization: A noiseless patient Spider Message-ID: References: <8b43f7fb-34e9-474e-a6b6-5e4e6f94f412@googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain Injection-Info: reader02.eternal-september.org; posting-host="be5f75c042c6e7a51c0c430d9866770f"; logging-data="15592"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19RPF5L2IkZWJE3xOQ2hIqE48NDPDfWwO8=" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (darwin) Cancel-Lock: sha1:1L052/Km5f+FpA46L3nHGPqXq9Q= sha1:Dtz2V+8Z43j7D+IqgztbfMQR3SQ= Xref: reader01.eternal-september.org comp.lang.ada:55569 Date: 2019-02-18T17:24:03+00:00 List-Id: Jere writes: > Though the outstanding part of this is we don't know if this is a > language issue/feature or a GNAT issue (the original problem that is). > > Maybe someone from the Arg can comment on what is intended to be > allowed and not allowed when it comes to extending synchronized > interfaces. I think perhaps there is a bug in GNAT after all, and I apologise to all concerned for hasty remarks. THIS COMPILES (not with -gnat95, which says 'no selector "V" for private type "U" defined at line 6'): procedure Abstractedness is package Sample is type T is abstract tagged null record; -- or 'type T is interface;' procedure V (Self : in out T) is abstract; type U is new T with private; private type U is new T with null record; procedure V (Self : in out U); end Sample; package body Sample is procedure V (Self : in out U) is begin null; end V; end Sample; W : Sample.U; begin W.V; end Abstractedness; ---- The fact that you can implement an abstract operation of a synchronized interface in a subprogram of the implementation is discussed in the Ada 2005 Rationale 5.3[1]: Unlike tagged record types we cannot derive a task or protected type from another task or protected type as well. So the derivation hierarchy can only be one level deep once we declare an actual task or protected type. The operations of these various interfaces are declared in the usual way and an interface composed of several interfaces has the operations of all of them with the same rules regarding duplication and overriding of an abstract operation by a null one and so on as for normal tagged types. When we declare an actual task or protected type then we must implement all of the operations of the interfaces concerned. This can be done in two ways, either by declaring an entry or protected operation in the specification of the task or protected object or by declaring a distinct subprogram in the same list of declarations (but not both). Of course, if an operation is null then it can be inherited or overridden as usual. [1] https://www.adaic.org/resources/add_content/standards/05rat/html/Rat-5-3.html