`REAL()`

and `AIMAG()`

of Complex
The GNU Fortran language disallows `REAL(`

`expr``)`

and `AIMAG(`

`expr``)`

,
where `expr` is any `COMPLEX`

type other than `COMPLEX(KIND=1)`

,
except when they are used in the following way:

REAL(REAL(expr)) REAL(AIMAG(expr))

The above forms explicitly specify that the desired effect
is to convert the real or imaginary part of `expr`, which might
be some `REAL`

type other than `REAL(KIND=1)`

,
to type `REAL(KIND=1)`

,
and have that serve as the value of the expression.

The GNU Fortran language offers clearly named intrinsics to extract the real and imaginary parts of a complex entity without any conversion:

REALPART(expr) IMAGPART(expr)

To express the above using typical extended FORTRAN 77,
use the following constructs
(when `expr` is `COMPLEX(KIND=2)`

):

DBLE(expr) DIMAG(expr)

The FORTRAN 77 language offers no way
to explicitly specify the real and imaginary parts of a complex expression of
arbitrary type, apparently as a result of requiring support for
only one `COMPLEX`

type (`COMPLEX(KIND=1)`

).
The concepts of converting an expression to type `REAL(KIND=1)`

and
of extracting the real part of a complex expression were
thus “smooshed” by FORTRAN 77 into a single intrinsic, since
they happened to have the exact same effect in that language
(due to having only one `COMPLEX`

type).

*Note:* When -ff90 is in effect,
g77 treats REAL(`expr`), where `expr` is of
type `COMPLEX`

, as REALPART(`expr`),
whereas with -fugly-complex -fno-f90 in effect, it is
treated as REAL(REALPART(`expr`)).

See Ugly Complex Part Extraction, for more information.