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,cc43b0dfc6b2a131 X-Google-Attributes: gid103376,public From: Tucker Taft Subject: Re: Accessibility levels, continued Date: 1999/02/05 Message-ID: <36BB771D.1825E9C@averstar.com>#1/1 X-Deja-AN: 441166648 Content-Transfer-Encoding: 7bit Sender: news@inmet.camb.inmet.com (USENET news) X-Nntp-Posting-Host: houdini.burl.averstar.com References: <79dse1$ut4$1@nnrp1.dejanews.com> Content-Type: text/plain; charset=us-ascii Organization: AverStar (formerly Intermetrics) Burlington, MA USA Mime-Version: 1.0 Newsgroups: comp.lang.ada Date: 1999-02-05T00:00:00+00:00 List-Id: adam@irvine.com wrote: > > Should this program raise an exception? No. The "accessibility level" of Var passes through the two calls with access parameters, meaning that your line marked [1] is equivalent to "Acc_Var := Var'access;" as far as accessibility checking, with the difference that the check is performed at run-time rather than compile-time. > procedure Test is > > type T is record > Field : Integer; > end record; > > Var : T; > > type Access_T is access T; > Acc_Var : Access_T; > > procedure Outer (Outer_Param : access T) is > > procedure Inner (Inner_Param : access T) is > begin > Acc_Var := Inner_Param.all'access; -- [1] > end Inner; > > begin > Inner (Outer_Param); > end Outer; > > begin > Outer (Var'access); -- [2] > end Test; > > It doesn't look like it should, if you follow the intent of the > accessibility rules in 3.10.2. Acc_Var will be assigned to an access > to Var, and since Acc_Var's type does not have a deeper accessibility > level than Var, everything should be fine. However, I believe that > the way the RM is written, the program should raise Program_Error at > line [1]. Here's what seems to be going on: > > 3.10.2(29): 'ACCESS will succeed as long as the accessibility level of > Inner_Param.all is not deeper than that of Access_T. > > 3.10.2(15): The accessibility level of Inner_Param.all equals that of > Inner_Param's type, which is an anonymous access type. > > 3.10.2(13): The accessibility level of Inner_Param's anonymous access > type is the same as that of the view designated by the actual, in this > case Outer_Param. > > I don't know the exact meaning of the "view designated by the actual" > when the actual is another parameter. I haven't found any reason to > believe that the last clause of the above paragraph is different from, > more simply, "the accessibility level of Outer_Param". No, it is the accessibility level of the object *designated* by Outer_Param. Remember that "designated" by is the same as "pointed-to" by. Ada mantra: "Pointers point, access values designate, names denote." > ... Which leads > us to: > > 3.10.2(7): Since Outer_Param is a parameter, the accessibility level > of Outer_Param is the same as its master, Outer. If you had written Outer_Param'Access, then you would be interested in the accessibility level of Outer_Param itself. But if you just write Outer_Param, you are interested in the accessibility level of the thing it points at (Outer_Param.all). "Access parameters" (aka parameters of an anonymous access type) are unique in that they "carry" along at run-time the accessibility level of the thing they point at (their designated object). > Stringing everything together, the accessibility level of > Inner_Param.all'access is the same as that of Outer; and since the > accessibility level of Outer is deeper than that of Access_T, the > program should raise a Program_Error. Nope. The accessibility level of Inner_Param.all is the same as that of Outer_param.all, which is the same as Var. > Is this the right interpretation? Or did I miss something? You missed (no William Tell award today ;-). > -- thanks, Adam -Tuck -- -Tucker Taft stt@averstar.com http://www.averstar.com/~stt/ Technical Director, Distributed IT Solutions (www.averstar.com/tools) AverStar (formerly Intermetrics, Inc.) Burlington, MA USA