Fortran Extensions supported by Flang¶
For better compatibility with GNU Fortran and Sun Fortran,
this compiler supports an option (-funsigned) that enables
the UNSIGNED data type, constants, intrinsic functions,
its use with intrinsic operations and SELECT CASE, and C
language interoperability.
UNSIGNED type¶
UNSIGNED is a numeric type with the same kinds as INTEGER.
It may appear as a type-spec in any context, including
a type declaration statement, a type-decl in an array
constructor or ALLOCATE statement, IMPLICIT, or a
function statement’s prefix.
UNSIGNED constants are nonempty strings of decimal digits
followed by the letter U and optionally a kind suffix with
an underscore.
UNSIGNED operations¶
UNSIGNED operands are accepted for unary negation (-),
the basic four binary arithmetic intrinsic operations +, -, *, and /,
components in complex constructors,
and for numeric relational operators.
The power operator ** does not accept UNSIGNED operands.
Mixed operations with other types are not allowed.
Mixed operations with one UNSIGNED operand and one BOZ literal
constant operand are allowed.
When the operands’ kinds differ, the smaller operand is zero-extended
to the size of the larger.
The arithmetic operations u+v, -u, u-v, and u*v are implemented
modulo MAX(HUGE(u),HUGE(v))+1;
informally speaking, they always truncate their results, or are
guaranteed to “wrap”.
UNSIGNED intrinsic functions¶
UNSIGNED operands are accepted as operands to,
or may be returned as results from,
several intrinsic procedures.
Bitwise operations:
NOTIAND,IOR,IEOR,IBCLR,IBSET,IBITS,MERGE_BITSBTESTISHFT,ISHFTCSHIFTA,SHIFTL,SHIFTRTRANSFERMVBITS
The existing unsigned comparisons BLT, BLE, BGE, and BGT.
The inquiries BIT_SIZE, DIGITS, HUGE, and RANGE.
Homogeneous MAX and MIN.
RANDOM_NUMBER.
The intrinsic array functions:
MAXVAL,MINVALSUM,PRODUCTIALL,IANY,IPARITYDOT_PRODUCT,MATMUL
All of the restructuring array transformational intrinsics: CSHIFT, EOSHIFT,
PACK, RESHAPE, SPREAD, TRANSPOSE, and UNPACK.
The location transformationals FINDLOC, MAXLOC, and MINLOC.
There is a new SELECTED_UNSIGNED_KIND intrinsic function; it happens
to work identically to the existing SELECTED_INT_KIND.
Two new intrinsic functions UMASKL and UMASKR work just like
MASKL and MASKR, returning unsigned results instead of integers.
Conversions to UNSIGNED, or between UNSIGNED kinds, can be done
via the new UINT intrinsic. The UNSIGNED intrinsic name is also
supported as an alias.
Support for UNSIGNED in the OUT_OF_RANGE predicate remains to be implemented.
Other usage¶
UNSIGNED is allowed in SELECT CASE, but not in DO loop indices or
limits, or an arithmetic IF expression.
UNSIGNED array indices are not allowed.
UNSIGNED data may be used as data items in I/O statements, including
list-directed and NAMELIST I/O.
Format-directed I/O may edit UNSIGNED data with I, G, B, O, and Z
edit descriptors.
C interoperability¶
UNSIGNED data map to type codes for C’s unsigned types in the
type member of a cdesc_t descriptor in the ISO_Fortran_binding.h
header file.
Standard modules¶
New definitions (C_UNSIGNED, C_UINT8_T, &c.) were added to ISO_C_BINDING
and new constants (UINT8, UINT16, &c.) to ISO_FORTRAN_ENV.