Annotated Ada Reference ManualLegal Information
Contents   Index   References   Search   Previous   Next 

10.1.6 Environment-Level Visibility Rules

1
[The normal visibility rules do not apply within a parent_unit_name or a context_clause, nor within a pragma that appears at the place of a compilation unit. The special visibility rules for those contexts are given here.] 

Static Semantics

2/2
{AI95-00217-06} {AI95-00312-01} Within the parent_unit_name at the beginning of an explicit a library_item, and within a nonlimited_with_clause with_clause, the only declarations that are visible are those that are explicit library_items of the environment, and the only declarations that are directly visible are those that are explicit root library_items of the environment. Within a limited_with_clause, the only declarations that are visible are those that are the implicit declaration of the limited view of a library package of the environment, and the only declarations that are directly visible are those that are the implicit declaration of the limited view of a root library package. Notwithstanding the rules of 4.1.3, an expanded name in a with_clause may consist of a prefix that denotes a generic package and a selector_name that denotes a child of that generic package. [(The child is necessarily a generic unit; see 10.1.1.)]
2.a
Ramification: In “package P.Q.R is ... end P.Q.R;”, this rule requires P to be a root library unit, and Q to be a library unit (because those are the things that are directly visible and visible). Note that visibility does not apply between the “end” and the “;”.
2.b
Physically nested declarations are not visible at these places.
2.c
Although Standard is visible at these places, it is impossible to name it, since it is not directly visible, and it has no parent.
2.c.1/2
{AI95-00217-06} Only compilation units defining limited views can be mentioned in a limited_with_clause, while only compilation units defining full views (that is, the explicit declarations) can be mentioned in a nonlimited_with_clause. This resolves the conflict inherent in having two compilation units with the same defining name. 
2.d/2
This paragraph was deleted.Reason: {AI95-00312-01} The “notwithstanding” part allows “with A.B;” where A is a generic library package and B is one of its (generic) children. This is necessary because it is not normally legal to use an expanded name to reach inside a generic package. 
3
Within a use_clause or pragma that is within a context_clause, each library_item mentioned in a previous with_clause of the same context_clause is visible, and each root library_item so mentioned is directly visible. In addition, within such a use_clause, if a given declaration is visible or directly visible, each declaration that occurs immediately within the given declaration's visible part is also visible. No other declarations are visible or directly visible.
3.a
Discussion: Note the word “same”. For example, if a with_clause on a declaration mentions X, this does not make X visible in use_clauses and pragmas that are on the body. The reason for this rule is the one-pass context_clauses Language Design Principle.
3.b
Note that the second part of the rule does not mention pragmas.
4
Within the parent_unit_name of a subunit, library_items are visible as they are in the parent_unit_name of a library_item; in addition, the declaration corresponding to each body_stub in the environment is also visible. 
4.a
Ramification: For a subprogram without a separate subprogram_declaration, the body_stub itself is the declaration. 
5
Within a pragma that appears at the place of a compilation unit, the immediately preceding library_item and each of its ancestors is visible. The ancestor root library_item is directly visible.
6/2
{AI95-00312-01} Notwithstanding the rules of 4.1.3, an expanded name in a with_clause, a pragma in a context_clause, or a pragma that appears at the place of a compilation unit may consist of a prefix that denotes a generic package and a selector_name that denotes a child of that generic package. [(The child is necessarily a generic unit; see 10.1.1.)] 
6.a/2
Reason: This rule allows with A.B; and pragma Elaborate(A.B); where A is a generic library package and B is one of its (generic) children. This is necessary because it is not normally legal to use an expanded name to reach inside a generic package. 

Wording Changes from Ada 83

6.b
The special visibility rules that apply within a parent_unit_name or a context_clause, and within a pragma that appears at the place of a compilation_unit are clarified.
6.c
Note that a context_clause is not part of any declarative region.
6.d
We considered making the visibility rules within parent_unit_names and context_clauses follow from the context of compilation. However, this attempt failed for various reasons. For example, it would require use_clauses in context_clauses to be within the declarative region of Standard, which sounds suspiciously like a kludge. And we would still need a special rule to prevent seeing things (in our own context_clause) that were with-ed by our parent, etc. 

Wording Changes from Ada 95

6.e/2
{AI95-00217-06} Added separate visibility rules for limited_with_clauses; the existing rules apply only to nonlimited_with_clauses.
6.f/2
{AI95-00312-01} Clarified that the name of a generic child unit may appear in a pragma in a context_clause.

Contents   Index   References   Search   Previous   Next 
Ada-Europe Ada 2005 and 2012 Editions sponsored in part by Ada-Europe