comp.lang.ada
 help / color / mirror / Atom feed
From: dewar@cs.nyu.edu (Robert Dewar)
Subject: Unchecked_Union
Date: 1996/02/24
Date: 1996-02-24T00:00:00+00:00	[thread overview]
Message-ID: <dewar.825178652@schonberg> (raw)

The following is a description of pragma Unchecked_Union as we are
implementing it in GNAT. This description is compatible with the
current Intermetrics usage in their binding generator tool.

Comments welcome -- to CLA, since I think this is of general interest

Note that we intend that other compilers than GNAT will implement this
pragma.

   --  pragma Unchecked_Union (first_subtype_LOCAL_NAME)
   --    This pragma is implementation (GNAT) defined. It is used to declare
   --    that the named type should be equivalent to a C union type, and is
   --    intended only for use in interfacing with C code that uses union
   --    types. In Ada terms, the named type must obey the following rules:

   --       It is a non-tagged non-limited record type
   --       It has a single discrete discriminant with a default value
   --       Pragma Suppress (Discriminant_Check) applies implicitly
   --       The component list consists of a single variant part
   --       The default convention is C
   --       Each variant has a component list with a single component
   --       No nested variants are allowed
   --       No component can have an explicit default value
   --       No component can have a non-static constraint
   --
   --    In addition, given a type that meets the above requirements, the
   --    following restrictions apply to its use throughout the program:
   --
   --       The discriminant name can be mentioned only in an aggregate
   --       No subtypes may be created of this type
   --       The type may not be constrained by giving a discriminant value
   --       An unchecked union type cannot be passed as the actual for a
   --        generic formal with a discriminant.

   --    Also, equality and inequality operations on unchecked_unions are not
   --    available, since there is no discriminant to compare, and in general
   --    the compiler does not even know how many bits to compare. It is
   --    implementation dependent whether this is detected at compile time
   --    as an illegality, or whether it is undetected and considered to be
   --    an erroneous construct. In GNAT, a direct comparison is illegal,
   --    but GNAT does not attempt to catch the composite case (where two
   --    composites are compared that contain an unchecked union component),
   --    so such comparisons are simply considered erroneous.
   --
   --    The layout of the resulting type corresponds exactly to a C union,
   --    where each branch of the union corresponds to a single variant in
   --    the Ada record. The semantics of the Ada program is not changed in
   --    any way by the pragma, i.e. provided the above restrictions are
   --    followed, and no erroneous incorrect references to fields or
   --    erroneous comparisons occur, the semantics is exactly as described
   --    by the Ada reference manual.





             reply	other threads:[~1996-02-24  0:00 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1996-02-24  0:00 Robert Dewar [this message]
1996-02-27  0:00 ` Unchecked_Union Arthur Evans Jr
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox