B.3.3 Unchecked Union Types
{
AI95-00216-01}
{
AI05-0229-1}
{
AI05-0269-1}
[Specifying aspect Unchecked_Union to have the value
True defines an interface correspondence between a given discriminated
type and some C union. The aspect requires that the associated type shall
be given a representation that allocates no space for its discriminant(s).]
Static Semantics
{
AI05-0229-1}
For a discriminated record type having a
variant_part,
the following language-defined representation aspect may be specified:
Unchecked_Union
The type of aspect Unchecked_Union is Boolean. If directly specified,
the
aspect_definition
shall be a static expression. If not specified (including by inheritance),
the aspect is False.
Aspect Description for Unchecked_Union:
Type is used to interface to a C union type.
Legality Rules
Paragraphs 4 and
5 were deleted.
{
AI95-00216-01}
{
AI05-0229-1}
A type for
which aspect Unchecked_Union is True is called an
unchecked union
type. A subtype of an unchecked union type is defined to be an
unchecked
union subtype. An object of an unchecked union type is defined to
be an
unchecked union object.
{
AI95-00216-01}
All component subtypes of an unchecked union type shall be C-compatible.
{
AI95-00216-01}
If a component subtype of an unchecked union type is subject to a per-object
constraint, then the component subtype shall be an unchecked union subtype.
{
AI95-00216-01}
{
AI05-0026-1}
The type of a component declared in a
variant_part
of an unchecked union type shall not need finalization. In addition to
the places where Legality Rules normally apply (see
12.3),
this rule also applies in the private part of an instance of a generic
unit.
For an unchecked union type declared within
the body of a generic unit, or within the body of any of its descendant
library units, no part of the type of a component declared in a
variant_part
of the unchecked union type shall be of a formal private type or formal
private extension declared within the formal part of the generic unit.
Reason: {
AI05-0026-1}
The last part is a classic assume-the-worst rule that avoids dependence
on the actuals in a generic body. We did not include this in the definition
of “needs finalization” as it has a bad interaction with
the use of that term for the No_Nested_Finalization restriction.
{
AI95-00216-01}
An unchecked union subtype shall only be passed as a generic actual parameter
if the corresponding formal type has no known discriminants or is an
unchecked union type.
Ramification: This includes formal private
types without a
known_discriminant_part,
formal derived types that do not inherit any discriminants (formal derived
types do not have
known_discriminant_parts),
and formal derived types that are unchecked union types.
Static Semantics
{
AI95-00216-01}
An unchecked union type is eligible for convention C.
{
AI95-00216-01}
All objects of an unchecked union type have the same size.
{
AI95-00216-01}
Discriminants of objects of an unchecked union type are of size zero.
{
AI95-00216-01}
Any check which would require reading a discriminant of an unchecked
union object is suppressed (see
11.5). These
checks include:
{
AI12-0453-1}
The check performed when addressing a variant component (that is, a component
that was declared in a variant part) of an unchecked union object that
the object has this component (see
4.1.3).
Any checks associated with a type or subtype conversion
of a value of an unchecked union type (see
4.6).
This includes, for example, the check associated with the implicit subtype
conversion of an assignment statement.
The subtype membership check associated with the
evaluation of a qualified expression (see
4.7)
or an uninitialized allocator (see
4.8).
Discussion: If a suppressed check would
have failed, execution is erroneous (see
11.5).
An implementation is always allowed to make a suppressed check if it
can somehow determine the discriminant value.
Dynamic Semantics
{
AI95-00216-01}
A view of an unchecked union object (including a type conversion or function
call) has
inferable discriminants if it has a constrained nominal
subtype, unless the object is a component of an enclosing unchecked union
object that is subject to a per-object constraint and the enclosing object
lacks inferable discriminants.
{
AI95-00216-01}
An expression of an unchecked union type has inferable discriminants
if it is either a name of an object with inferable discriminants or a
qualified expression whose
subtype_mark
denotes a constrained subtype.
Evaluation of the predefined equality operator
for an unchecked union type if either of the operands lacks inferable
discriminants.
Evaluation of the predefined equality operator
for a type which has a subcomponent of an unchecked union type whose
nominal subtype is unconstrained.
Conversion from a derived unchecked union type
to an unconstrained non-unchecked-union type if the operand of the conversion
lacks inferable discriminants.
Execution of the default implementation of the
Write or Read attribute of an unchecked union type.
Execution of the default implementation of the
Output or Input attribute of an unchecked union type if the type lacks
default discriminant values.
Paragraph 29 was
deleted.
NOTE {
AI95-00216-01}
The use of an unchecked union to obtain the effect of an unchecked conversion
results in erroneous execution (see
11.5).
Execution of the following example is erroneous even if Float'Size =
Integer'Size:
{
AI05-0229-1}
type T (Flag : Boolean := False)
is
record
case Flag
is
when False =>
F1 : Float := 0.0;
when True =>
F2 : Integer := 0;
end case;
end record
with Unchecked_Union;
X : T;
Y : Integer := X.F2; -- erroneous
Extensions to Ada 95
Incompatibilities With Ada 2005
{
AI05-0026-1}
Correction: The use of discriminants on Unchecked_Union
types is now illegal in
record_representation_clauses,
as it makes no sense to specify a position for something that is not
supposed to exist. It is very unlikely that this change will have any
impact on existing code.
Extensions to Ada 2005
{
AI05-0229-1}
Aspect Unchecked_Union is new;
pragma
Unchecked_Union is now obsolescent.
Wording Changes from Ada 2005
{
AI05-0026-1}
Correction: Revised the rules to use the “needs finalization”
definition, and eliminated generic contract issues.
Wording Changes from Ada 2012
{
AI05-0162-1}
Correction: Adjusted the wording to reflect that membership tests
can have more than one expression or
subtype_mark.
{
AI05-0174-1}
Correction: Adjusted the wording to allow named aggregates of
an unchecked union type; it is clearly madness to allow positional record
components in an
aggregate
but not named component associations.
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe