comp.lang.ada
 help / color / mirror / Atom feed
From: Georg Bauhaus <rm.dash-bauhaus@futureapps.de>
Subject: Q: SPARK: visibility of private child in parent's body
Date: Sun, 25 Aug 2013 15:06:16 +0200
Date: 2013-08-25T15:06:17+02:00	[thread overview]
Message-ID: <521a0149$0$9514$9b4e6d93@newsspool1.arcor-online.net> (raw)

Hi,

a small hierarchy of packages has the body of parent P refer
to entities of a private child package P.C.  According to
Barnes (1997), this is possible. (I have placed supporting
quotes before the body of P below.)

I'm hitting a wall.

Examiner does not accept the packages, warning that C of P.C
is "either undeclared or not visible at this point".
(There is no --# inherit for P.C, as none is required.)
The Examiner then continues diagnosing semantic errors.

When I rearrange the source by embedding package P.C into the
body of P instead of making it a private child package, then
everything seems fine.

What am I doing wrong?

Can I at all refer to private packages in the parent's body
when using somewhat recent editions of SPARK (2011 and 2012)?



package P
   --# own State;
   --# initializes State;
is

    One: constant := 1;

    procedure Proc (K : in out Natural);
    --# global in State;
    --# derives K from K, State;

end P;

--# inherit P;
private package P.C is

    type Int_1 is range 1 .. P.One;

    procedure Chldproc (X : in out Int_1);
    --# derives X from X;

end P.C;

package body P.C is

    procedure Chldproc (X : in out Int_1) is
    begin
       X := Int_1'Min (1, Int_1'Max (X, X - 1));
    end Chldproc;

end P.C;

-- "a parent can never have an inherit clause for its child. (...) and
-- in the case of a private child although a with clause is allowed on
-- the parent body, nevertheless an inherit clause is not required."
--
-- "An entity T within P.Child has to be referred to as P.Child.T from
-- within the body of P." (Barnes (1997), 7.2)

-- "In addition, a package P can inherit a private child of a package
-- Q only if P is also a private child of Q or a descendant of such a
-- child (or if Q is package Standard)" (SPARK LRM 7.1.1)

with P.C;  -- warning, C undeclared or not visible
package body P
   --# own State is Y;
is

    Y : P.C.Int_1;  -- semantic error 337
    --Y : C.Int_1;  -- semantic error 754

    procedure Proc (K : in out Natural)
       --# global in Y;
       --# derives K from K, Y;
    is
       V : P.C.Int_1;  -- semantic error 337
       --V : C.Int_1;  -- semantic error 754
    begin
       V := P.C.Int_1 (K);
       V := P.C.Int_1'Min (V, Y);
       P.C.Chldproc (V);
       K := Natural (V);
    end Proc;

begin
    Y := 1;
end P;



             reply	other threads:[~2013-08-25 13:06 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-25 13:06 Georg Bauhaus [this message]
2013-08-25 19:35 ` Q: SPARK: visibility of private child in parent's body Phil Thornley
2013-08-25 22:00   ` Georg Bauhaus
replies disabled

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