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:
NOT
IAND
,IOR
,IEOR
,IBCLR
,IBSET
,IBITS
,MERGE_BITS
BTEST
ISHFT
,ISHFTC
SHIFTA
,SHIFTL
,SHIFTR
TRANSFER
MVBITS
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
,MINVAL
SUM
,PRODUCT
IALL
,IANY
,IPARITY
DOT_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.