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/2
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 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.
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/2
For a subprogram whose first parameter is an access
parameter, the prefix of any prefixed view shall denote an aliased view
of an object.
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/2
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.4)
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)