13.9 Unchecked Type Conversions
An 
unchecked type conversion can be achieved by a call to an instance of 
the generic function Unchecked_Conversion. 
 
Static Semantics
The following language-defined 
generic library function exists: 
generic
   type Source(<>) 
is limited private;
   
type Target(<>) 
is limited private;
function Ada.Unchecked_Conversion(S : Source) 
return Target
   
with Convention => Intrinsic;
pragma Pure(Ada.Unchecked_Conversion);
 
Dynamic Semantics
The size of the formal parameter S in an instance 
of Unchecked_Conversion is that of its subtype. This is the actual subtype 
passed to Source, except when the actual is an unconstrained composite 
subtype, in which case the subtype is constrained by the bounds or discriminants 
of the value of the actual expression passed to S.
If all of the following 
are true, the effect of an unchecked conversion is to return the value 
of an object of the target subtype whose representation is the same as 
that of the source object S: 
S'Size = Target'Size. 
S'Alignment is a multiple of Target'Alignment or 
Target'Alignment is zero.
The target subtype is not an unconstrained composite 
subtype.
S and the 
target subtype both have a contiguous representation.
 
The representation of S is a representation of 
an object of the target subtype. 
 Otherwise, if the result type is scalar, the result 
of the function is implementation defined, and can have an invalid representation 
(see 
13.9.1). If the result type is nonscalar, 
the effect is implementation defined; in particular, the result can be 
abnormal (see 
13.9.1).
 
Implementation Permissions
An implementation may return the result of an unchecked 
conversion by reference, if the Source type is not a by-copy type. In 
this case, the result of the unchecked conversion represents simply a 
different (read-only) view of the operand of the conversion. 
An implementation may place restrictions on Unchecked_Conversion. 
Implementation Advice
 Since the Size of an array object generally does 
not include its bounds, the bounds should not be part of the converted 
data. 
The implementation should not generate unnecessary 
run-time checks to ensure that the representation of S is a representation 
of the target type. It should take advantage of the permission to return 
by reference when possible. Restrictions on unchecked conversions should 
be avoided unless required by the target environment. 
The 
recommended level of support for unchecked conversions is: 
 
Unchecked conversions should be supported and should 
be reversible in the cases where this subclause defines the result.
 
To enable meaningful use of unchecked conversion, 
a contiguous representation should be used for elementary subtypes, for 
statically constrained array subtypes whose component subtype is one 
of the subtypes described in this paragraph, and for record subtypes 
without discriminants whose component subtypes are described in this 
paragraph. 
 
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe