Contents Index 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.
{dot selection: See selected_component}
]
Syntax
2
selected_component
::= prefix .
selector_name
3
selector_name
::= identifier |
character_literal |
operator_symbol
Name Resolution Rules
4
{expanded name} 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).
4.a
Discussion: See AI83-00187.
5
A selected_component
that is not an expanded name shall resolve to denote one of the following:
5.a
Ramification: If the prefix
of a selected_component denotes
an enclosing named construct, then the selected_component
is interpreted only as an expanded name, even if the named construct
is a function that could be called without parameters.
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.
7.a/1
Reason: The components
of a protected object cannot be named except by an expanded name, even
from within the corresponding protected body. The protected body may
not reference the the private components of some arbitrary object
of the protected type; the protected body may reference components of
the current instance only (by an expanded name or a direct_name).
7.b
Ramification: Only the discriminants
and components visible at the place of the selected_component
can be selected, since a selector_name
can only denote declarations that are visible (see 8.3).
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.a
Reason: This explicitly
says ``visible part'' because even though the body has visibility on
the private part, it cannot call the private operations of some arbitrary
object of the task or protected type, only those of the current instance
(and expanded name notation has to be used for that).
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.
12.a
Ramification: Hence, a
library unit or subunit can use an expanded name to refer to the declarations
within the private part of its parent unit, as well as to other children
that have been mentioned in with_clauses.
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
{evaluation (selected_component)
[partial]} The evaluation of a
selected_component
includes the evaluation of the
prefix.
15
{Discriminant_Check [partial]}
{check, language-defined (Discriminant_Check)}
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.
{Constraint_Error (raised by failure
of run-time check)} {Constraint_Error
(raised by failure of run-time check)} 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)
Extensions to Ada 83
19.a
{extensions to Ada 83}
We now allow an expanded name to use a prefix that
denotes a rename of a package, even if the selector is for an entity
local to the body or private part of the package, so long as the entity
is visible at the place of the reference. This eliminates a preexisting
anomaly where references in a package body may refer to declarations
of its visible part but not those of its private part or body when the
prefix is a rename of the package.
Wording Changes from Ada 83
19.b
The syntax rule for selector_name
is new. It is used in places where visibility, but not necessarily direct visibility,
is required. See 4.1, ``Names''
for more information.
19.c
The description of dereferencing an access
type has been moved to 4.1, ``Names'';
name.all is no longer considered
a selected_component.
19.d
The rules have been restated to
be consistent with our new terminology, to accommodate class-wide types,
etc.
Contents Index Previous Next Legal