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.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,23e3ddd47450e30c X-Google-Attributes: gid103376,public From: bobduff@world.std.com (Robert A Duff) Subject: Re: Ada 95 visibility question Date: 1997/09/22 Message-ID: #1/1 X-Deja-AN: 274613365 References: <3424860A.2777@bix.com> Organization: The World Public Access UNIX, Brookline, MA Newsgroups: comp.lang.ada Date: 1997-09-22T00:00:00+00:00 List-Id: In article <3424860A.2777@bix.com>, Tom Moran wrote: >Of three compilers I tried this on, 2 took it happily and one said it >couldn't find such a thing as "peek_a_boo" at the place indicated. >What's correct? This is a pretty subtle question. The rules are in 7.3.1. The 1 compiler is correct; the other 2 are wrong. :-( >package c is > type root is tagged private; >private > type root is tagged record > peek_a_boo:integer; > end record; >end c; > >package c.d is > type dialog is new c.root with private; >private > type dialog is new c.root with record > dd:integer; > end record; >end c.d; > >with c.d; >package c.f is > type file_dialog is new c.d.dialog with private; > procedure p(x:in out file_dialog); >private > type file_dialog is new c.d.dialog with record > ff:integer; > end record; >end c.f; > >package body c.f is > procedure p(x:in out file_dialog) is > y:integer; > begin > y:=root(x).peek_a_boo; > y:=x.peek_a_boo; 1/3 of compilers tested complained This is illegal. Dialog has a peek_a_boo component implicitly declared in the private part of c.d. There is no place within the immediate scope of file_dialog where this private part is visible, so file_dialog doesn't declare peek_a_boo. (It's still there at run time, but you can only get at it by doing a type conversion, as shown above.) There's also an AI on this section, but it doesn't affect this particular case. > end p; >end c.f; > >with c.f; >procedure bug1 is > f:c.f.file_dialog; >begin > c.f.p(f); >end bug1; - Bob