Ada Conformity Assessment Authority      Home Conformity Assessment   Test Suite ARGAda Standard
 
Ada Reference Manual (Ada 2022 with Amendment 1)Legal Information
Contents   Index   References   Search   Previous   Next 

4.1.3 Selected Components

1
Selected_components are used to denote components (including discriminants), entries, entry families, and protected subprograms; they are also used as expanded names as described below.

Syntax

2
selected_component ::= prefix . selector_name
3
selector_name ::= identifier | character_literal | operator_symbol

Name Resolution Rules

4
A selected_component is called an expanded name if, according to the visibility rules, at least one possible interpretation of its prefix denotes a package or an enclosing named construct (directly, not through a subprogram_renaming_declaration or generic_renaming_declaration).
5
A selected_component that is not an expanded name shall resolve to denote one of the following:
6
A component (including a discriminant):
7
The prefix shall resolve to denote an object or value of some non-array composite type (after any implicit dereference). The selector_name shall resolve to denote a discriminant_specification of the type, or, unless the type is a protected type, a component_declaration of the type. The selected_component denotes the corresponding component of the object or value. 
8
A single entry, an entry family, or a protected subprogram:
9
The prefix shall resolve to denote an object or value of some task or protected type (after any implicit dereference). The selector_name shall resolve to denote an entry_declaration or subprogram_declaration occurring (implicitly or explicitly) within the visible part of that type. The selected_component denotes the corresponding entry, entry family, or protected subprogram.
9.1/2
A view of a subprogram whose first formal parameter is of a tagged type or is an access parameter whose designated type is tagged:
9.2/6
The prefix (after any implicit dereference) shall resolve to denote an object or value of a specific tagged type T or class-wide type T'Class. The selector_name shall resolve to denote a view of a subprogram declared immediately within the declarative region in which an ancestor of the type T is declared. The first formal parameter of the subprogram shall be of type T, or a class-wide type that covers T, or an access parameter designating one of these types. The designator of the subprogram shall not be the same as that of a component of the tagged type visible at the point of the selected_component. The subprogram shall not be an implicitly declared primitive operation of type T that overrides an inherited subprogram implemented by an entry or protected subprogram visible at the point of the selected_component. The selected_component denotes a view of this subprogram that omits the first formal parameter. This view is called a prefixed view of the subprogram, and the prefix of the selected_component (after any implicit dereference) is called the prefix of the prefixed view. In the special case where the prefix is class-wide and controlling, the prefixed view is not abstract, even if the unprefixed view is abstract; otherwise the prefixed view is abstract if and only if the unprefixed view is abstract.
9.3/6
In the context of a subprogram renaming (see 8.5.4) or the matching of an actual subprogram with a formal subprogram (see 12.6), a prefixed view whose prefix is class-wide and controlling shall have an expected profile such that each formal parameter or result type corresponding to a controlling parameter (or access parameter) or controlling result (or access result) in the unprefixed view, is (or designates) the same class-wide type as the prefix. In a renaming or matching of a prefixed view whose prefix is of a specific type or is not controlling, the unprefixed view shall not be abstract and the types of the formal parameters or result in the expected profile shall match those of the corresponding formal parameters or result of the unprefixed view. In either case, any constraints, null exclusions, or predicates on the formal parameters or results in the view declared by the renaming or instantiation come from the unprefixed view, as in the normal case. When renaming or matching a prefixed view whose prefix is tag-indeterminate and controlling, the controlling tag is statically determined to be that of the type of the prefix. 
10
An expanded name shall resolve to denote a declaration that occurs immediately within a named declarative region, as follows: 
11
The prefix shall resolve to denote either a package (including the current instance of a generic package, or a rename of a package), or an enclosing named construct.
12
The selector_name shall resolve to denote a declaration that occurs immediately within the declarative region of the package or enclosing construct (the declaration shall be visible at the place of the expanded name — see 8.3). The expanded name denotes that declaration. 
13
If the prefix does not denote a package, then it shall be a direct_name or an expanded name, and it shall resolve to denote a program unit (other than a package), the current instance of a type, a block_statement, a loop_statement, or an accept_statement (in the case of an accept_statement or entry_body, no family index is allowed); the expanded name shall occur within the declarative region of this construct. Further, if this construct is a callable construct and the prefix denotes more than one such enclosing callable construct, then the expanded name is ambiguous, independently of the selector_name.

Legality Rules

13.1/5
  For a prefixed view of a subprogram whose first formal parameter is an access parameter, the prefix shall be legal as the prefix of an attribute_reference with attribute_designator Access appearing as the first actual parameter in a call on the unprefixed view of the subprogram.
13.2/2
  For a subprogram whose first parameter is of mode in out or out, or of an anonymous access-to-variable type, the prefix of any prefixed view shall denote a variable.

Dynamic Semantics

14
The evaluation of a selected_component includes the evaluation of the prefix.
15
For a selected_component that denotes a component of a variant, a check is made that the values of the discriminants are such that the value or object denoted by the prefix has this component. The exception Constraint_Error is raised if this check fails.

Examples

16
Examples of selected components: 
17/5
Tomorrow.Month     -- a record component                      (see 3.8)
Next_Car.Owner     -- a record component                      (see 3.10.1)
Next_Car.Owner.Age -- a record component                      (see 3.10.1)
                   -- the previous two lines involve implicit dereferences
Writer.Unit        -- a record component (a discriminant)     (see 3.8.1)
Min_Cell(H).Value  -- a record component of the result        (see 6.1)
                   -- of the function call Min_Cell(H)
Cashier.Append     -- a prefixed view of a procedure          (see 3.9.4)
Control.Seize      -- an entry of a protected object          (see 9.4)
Pool(K).Write      -- an entry of the task Pool(K)            (see 9.1)
18
Examples of expanded names: 
19
Key_Manager."<"    -- an operator of the visible part of a package    (see 7.3.1)
Dot_Product.Sum    -- a variable declared in a function body          (see 6.1)
Buffer.Pool        -- a variable declared in a protected unit         (see 9.11)
Buffer.Read        -- an entry of a protected unit                    (see 9.11)
Swap.Temp          -- a variable declared in a block statement        (see 5.6)
Standard.Boolean   -- the name of a predefined type                   (see A.1)

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