https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117805
--- Comment #15 from anlauf at gcc dot gnu.org --- (In reply to kargls from comment #14) > > > If 'r' is of type REAL and 'z' is of type COMPLEX, the Fortran standard > > > is clear that the interpretation is > > > > > > <result is complex> = r * z > > > = (r, 0.) * z > > > > Is that really clear from the standard? > > Not in F2023. It is very clear in F77, 6.1.4 "Type and Interpretation > of Arithmetic Expressions", Table 2. That table explicitly says the > type conversion is > > <result is complex> = cmplx(r, 0.) * z 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. > > 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)