https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117805
--- Comment #17 from anlauf at gcc dot gnu.org ---
(In reply to kargls from comment #16)
> > That makes the conversion from real to complex sort of "slightly
> > anti-linear":
> >
> > print *, cmplx (-1.), - cmplx (1.)
> >
> > gives:
> >
> > (-1.00000000,0.00000000) (-1.00000000,-0.00000000)
> >
> > etc.
>
> The '-' is an unary minus operator. In 'cmplx(-1.)', it operates
> on only the real part. In '- cmplx(1.)', it operates on both
> parts. I don't see anything anti-linear here.
OK, then try:
print *, cmplx (-1. * (-1.)), cmplx (-1.) * cmplx (-1.)
which gives:
(1.00000000,0.00000000) (1.00000000,-0.00000000)
This is why I said "slightly anti-linear".
> >>> In your quote I read "the effect is as if ... converted ...".
> >>>
> >>> With IEEE arithmetic available, it seems to be not clear to me if the
> >>> imaginary part has to be +0.; couldn't its sign depend on the sign of
> >>> the real part? Would that be a non-conforming implementation?
> >>
> >> Fortran 2023 does not specify any particular value for the imaginary
> >> part when type conversion occurs. It would be ludicrous to assume
> >> any value other than 0; but hey, got for it set it to -3.141526
> >
> > I was more thinking of e.g.:
> >
> > complex function my_cmplx (r)
> > real, intent(in) :: r
> > my_cmplx = cmplx (r, sign (0., r))
> > end function my_cmplx
> >
> > which when used as:
> >
> > print *, my_cmplx (1.), my_cmplx (-1.)
> >
> > gives:
> >
> > (1.00000000,0.00000000) (-1.00000000,-0.00000000)
>
> If one opens up a descent book on Complex Analysis, the real numbers
> are likely described as a subset of the complex numbers such that
> the imaginary part is 0. But, again, Fortran 2023 does not specify
> the actual value of the imaginary part when a real is converted. Go
> ahead, change gfortran to use -0. I suspect you'll get a few bug
> reports about code suddenly ending up on the wrong Riemann sheet
> or issues with branch cuts.
The mapping of reals onto the complex plane itself is not the problem.
It is the rule that for real*complex one needs to convert the real number
to complex before the arithmetic operation which produces non-analytic
behavior.
> gfortran's current behavior is conforming. More importantly, it is
> consistent for constant folding, simplification, and code generation.
> If you (or anyone) adds a new option for this micro-optimization, then
> please audit constant folding, simplification, and the runtime library.
I did not say that gfortran is not conforming. It is the conversion rules
that are broken.