comp.lang.ada
 help / color / mirror / Atom feed
From: christoph.grein@eurocopter.com
To: comp.lang.ada@ada-france.org
Subject: Re: Derived types, private parts, abstract subprograms
Date: Tue, 9 Mar 2004 07:53:12 +0100 (MET)
Date: 2004-03-09T07:53:12+01:00	[thread overview]
Message-ID: <mailman.81.1078815581.327.comp.lang.ada@ada-france.org> (raw)

I amended your example a bit.

> 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;

with pak1;
package pak2P is
  type T2 is private;
private
  type T2 is new pak1.T1 with null record;
  procedure Operation (X : T2);
end pak2P;

> package pak3 is
>    procedure Foo;
> end pak3;
> 
> with pak2, pak2P;
> package body pak3 is
>    type T3 is new pak2.T2 with null record;
> 
>    procedure Foo is
>        X : T3;
         Y : pak2P.T;
>    begin
>       Operation (X);      --legal?  (yes, because T2 is visibly derived
                            -- from T1
        Operation (Y);      -- illegal (not visible, because T2 is not visibly
                            -- derived from T1
>    end Foo;
> 
> end pak3;

My interpretation is that it is irrelevant whether inherited primitives are 
overridden visibly or not if only the type is visibly derived.

It matters of course if the type is invisibly derived.

package P is
  type T is tagged ...
  procedure Prim (X: T; I: Integer := 5);
end P;
with P;
package P1 is
  type T1 is new P.T with ...
private
  procedure Prim (Y: T1; I: Integer := -5);
end P1;

In this example, Prim applied to a value of type T1 uses different default 
values for I depending on whether the overriding is visible or not. Also named 
association for the first parameter has to use different names.
And IMHO it's irrelevant whether the ancestor of Prim is abstract or not.

Thus:

with P1;
procedure M is  -- cannot see the private part
  Ob: P1.T1;
begin
  P1.Prim (X => Ob);  -- uses I => 5
end M;

procedure P1.M is  -- bodies of children see the private parts of parents
  Ob: P1.T1;
begin
  P1.Prim (Y => Ob);  -- uses I => -5
end P1.M;

Gnat 3.16a compiles this OK and uses the correct default, alas Apex 3.2.0b 
reports an error on parameter name Y and uses the wrong default.



             reply	other threads:[~2004-03-09  6:53 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-03-09  6:53 christoph.grein [this message]
  -- strict thread matches above, loose matches on Subject: below --
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
replies disabled

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