Contents   Index   Search   Related Documents   Previous   Next


B.3.3 Pragma Unchecked_Union

1/2
     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
The form of a pragma Unchecked_Union is as follows:
3/2
  pragma Unchecked_Union (first_subtype_local_name);

Legality Rules

4/2
     Unchecked_Union is a representation pragma, specifying the unchecked union aspect of representation.
5/2
     The first_subtype_local_name of a pragma Unchecked_Union shall denote an unconstrained discriminated record subtype having a variant_part.
6/2
     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
     All component subtypes of an unchecked union type shall be C-compatible.
8/2
     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
     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
      A component declared in a variant_part of an unchecked union type shall not have a controlled, protected, or task part.
11/2
      The completion of an incomplete or private type declaration having a known_discriminant_part shall not be an unchecked union type.
12/2
      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.

Static Semantics

13/2
      An unchecked union type is eligible for convention C.
14/2
      All objects of an unchecked union type have the same size.
15/2
      Discriminants of objects of an unchecked union type are of size zero.
16/2
      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

Dynamic Semantics

20/2
      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.
21/2
      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
      Program_Error is raised in the following cases:
23/2
24/2
25/2
26/2
27/2
28/2

Implementation Permissions

29/2
      An implementation may require that pragma Controlled be specified for the type of an access subcomponent of an unchecked union type.
NOTES
30/2
14  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 T (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
X : T;
Y : Integer := X.F2; -- erroneous

Contents   Index   Search   Related Documents   Previous   Next   Legal