- (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.
(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.
- (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.
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)
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)
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)
-- Email comments, additions, corrections, gripes, kudos, etc. to:
Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12