Next: , Previous: B.3.2, Up: B.3


B.3.3 Pragma Unchecked_Union

1/2
{00216AI95−00216−01} {union (C)} [A pragma Unchecked_Union specifies an interface correspondence between a given discriminated type and some C union. The pragma specifies that the associated type shall be given a representation that leaves no space for its discriminant(s).]

Syntax

2/2

{00216AI95−00216−01} The form of a pragma Unchecked_Union is as follows:

3/2

  pragma Unchecked_Union (first_subtype_local_name);
Legality Rules

4/2
{00216AI95−00216−01} Unchecked_Union is a representation pragma, specifying the unchecked union aspect of representation.

5/2
{00216AI95−00216−01} The first_subtype_local_name of a pragma Unchecked_Union shall denote an unconstrained discriminated record subtype having a variant_part.

6/2
{00216AI95−00216−01} {unchecked union type} {unchecked union subtype} {unchecked union object} A type to which a pragma Unchecked_Union applies 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.

7/2
{00216AI95−00216−01} All component subtypes of an unchecked union type shall be C−compatible.

8/2
{00216AI95−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.

9/2
{00216AI95−00216−01} Any name that denotes a discriminant of an object of an unchecked union type shall occur within the declarative region of the type.

10/2
{00216AI95−00216−01} A component declared in a variant_part of an unchecked union type shall not have a controlled, protected, or task part.

11/2
{00216AI95−00216−01} The completion of an incomplete or private type declaration having a known_discriminant_part shall not be an unchecked union type.

12/2
{00216AI95−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.

12.a/2

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

13/2
{00216AI95−00216−01} An unchecked union type is eligible for convention C.

14/2
{00216AI95−00216−01} All objects of an unchecked union type have the same size.

15/2
{00216AI95−00216−01} Discriminants of objects of an unchecked union type are of size zero.

16/2
{00216AI95−00216−01} Any check which would require reading a discriminant of an unchecked union object is suppressed (see 11.5). These checks include:

17/2

18/2

19/2

19.a/2

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

20/2
{00216AI95−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.{inferable discriminants} 21/2
{00216AI95−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.

22/2
{00216AI95−00216−01} Program_Error is raised in the following cases:{Program_Error (raised by failure of run−time check)} 23/2

24/2

25/2

26/2

27/2

28/2

Implementation Permissions

29/2
{00216AI95−00216−01} An implementation may require that pragma Controlled be specified for the type of an access subcomponent of an unchecked union type.

     NOTES

30/2

13  {00216AI95−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:

31/2

     type (Flag Boolean := False) is
        record
            case Flag is
                when False =>
                    F1 Float := 0.0;
                when True =>
                    F2 Integer := 0;
            end case;
         end record;
     pragma Unchecked_Union (T);

32/2

T;
     Y Integer := X.F2; −− erroneous
Extensions to Ada 95

32.a/2

{00216AI95−00216−01} {extensions to Ada 95} Pragma Unchecked_Union is new.