comp.lang.ada
 help / color / mirror / Atom feed
From: adam@irvine.com (Adam Beneschan)
Subject: Re: Derived types, private parts, abstract subprograms
Date: 15 Mar 2004 14:43:37 -0800
Date: 2004-03-15T14:43:37-08:00	[thread overview]
Message-ID: <b4682ab7.0403151443.5aa9dbaa@posting.google.com> (raw)
In-Reply-To: b4682ab7.0403081231.41281512@posting.google.com

adam@irvine.com (Adam Beneschan) wrote in message news:<b4682ab7.0403081231.41281512@posting.google.com>...
> 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.

OK, I was wrong.  I forgot that there was a difference between tagged
and untagged types in regard to what happens when an inherited
primitive operation is overridden in the private part.  The biggest
mistake I made was that when I read 3.9.2(20), I mistakenly read "a
call on a dispatching operation" as "a dispatching call", which I
suppose is understandable but changes the meaning quite a bit.  Also,
Pascal Leroy pointed me to AI95-00228 which clarifies some issues
about what happens when an abstract subprogram is inherited.

The bottom line is that the call to Operation above *is* legal, and it
does execute the correct body even though the declaration for that
body appears in a place that is not visible.

                                  -- Adam



  parent reply	other threads:[~2004-03-15 22:43 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-03-08 20:31 Derived types, private parts, abstract subprograms Adam Beneschan
2004-03-08 21:28 ` Robert I. Eachus
2004-03-15 22:43 ` Adam Beneschan [this message]
  -- strict thread matches above, loose matches on Subject: below --
2004-03-09  6:53 christoph.grein
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox