Unions

Unions have the semantics of records, however, only one field in the union can contain data at any particular point in the program’s execution. Unions are safe so that an access to a field that does not contain data is a runtime error. When a union is initialized, it is in an unset state so that no field contains data.

Union Types

The syntax of a union type is summarized as follows:

union-type:
  identifier

The union type is specified by the name of the union type. This simplification from class and record types is possible because generic unions are not supported.

Union Declarations

A union is defined with the following syntax:

union-declaration-statement:
  'extern'[OPT] 'union' identifier { union-statement-list }

union-statement-list:
  union-statement
  union-statement union-statement-list

union-statement:
  type-declaration-statement
  procedure-declaration-statement
  iterator-declaration-statement
  variable-declaration-statement
  empty-statement

If the extern keyword appears before the union keyword, then an external union type is declared. An external union is used within Chapel for type and field resolution, but no corresponding backend definition is generated. It is presumed that the definition of an external union type is supplied by a library or the execution environment.

Union Fields

Union fields are accessed in the same way that record fields are accessed. It is a runtime error to access a field that is not currently set.

Union fields should not be specified with initialization expressions.

Union Assignment

Union assignment is by value. The field set by the union on the right-hand side of the assignment is assigned to the union on the left-hand side of the assignment and this same field is marked as set.