Package: gfortran-6 Version: 6.2.0-10 Severity: normal Hello, I think I found a bug in gfortran.
Please consider the following simple program: $ cat cpxparam.f program main complex iu parameter (iu=(0,1)) complex val1,val2 write (*,*) 'iu = ',iu val1 = (+2.0,+3.0) val2 = (+4.0,-1.0) c the following should write (2 + j3)/(j*(4 - j) = (14 - j*5)/17 c that is to say about (0.8235294 , -0.2941176) write (*,*) val1/(iu*val2) end If I try to compile this with the following command line: $ gfortran -pedantic -Wall -fimplicit-none -o cpxparam cpxparam.f cpxparam.f:4:20: parameter (iu=(0,1)) 1 Warning: Non-zero imaginary part discarded in conversion from ‘COMPLEX(4)’ to ‘REAL(4)’ at (1) [-Wconversion] I get the above-quoted scary warning about an unintended conversion of iu to real type!!! But this conversion seems to never take place (luckily): $ ./cpxparam iu = ( 0.00000000 , 1.00000000 ) ( 0.823529422 ,-0.294117659 ) As you can see, the output is the expected one. At first I thought a recent gfortran could maybe have some issues in dealing with the old Fortran77-style syntax. So, let's try with some more modern style: $ cat cpxparam_modern.f program main complex,parameter :: iu=(0,1) complex :: val1,val2 write (*,*) 'iu = ',iu val1 = (+2.0,+3.0) val2 = (+4.0,-1.0) c the following should write (2 + j3)/(j*(4 - j) = (14 - j*5)/17 c that is to say about (0.8235294 , -0.2941176) write (*,*) val1/(iu*val2) end Same story: $ gfortran -pedantic -Wall -fimplicit-none -o cpxparam_modern cpxparam_modern.f cpxparam_modern.f:3:30: complex,parameter :: iu=(0,1) 1 Warning: Non-zero imaginary part discarded in conversion from ‘COMPLEX(4)’ to ‘REAL(4)’ at (1) [-Wconversion] $ ./cpxparam_modern iu = ( 0.00000000 , 1.00000000 ) ( 0.823529422 ,-0.294117659 ) The scary warning is still produced and the executable output is still correct, despite the compile-time warning. Curiously, changing the last expression to be evaluated into a different, but mathematically equivalent one makes the warning go away: $ cat cpxparam2.f program main complex iu parameter (iu=(0,1)) complex val1,val2 write (*,*) 'iu = ',iu val1 = (+2.0,+3.0) val2 = (+4.0,-1.0) c the following should write (2 + j3)/(j*(4 - j) = (14 - j*5)/17 c that is to say about (0.8235294 , -0.2941176) write (*,*) -iu*val1/val2 end $ gfortran -pedantic -Wall -fimplicit-none -o cpxparam2 cpxparam2.f $ ./cpxparam2 iu = ( 0.00000000 , 1.00000000 ) ( 0.823529422 ,-0.294117659 ) No warning and correct output from the compiled program. Please investigate this bug and/or forward my bug report upstream, as appropriate. Thanks for your time! Bye. P.S.: the above-quoted simple programs are probably trivial enough to not be copyrighted; in case this turns out to be false, I hereby release them under the terms of the Expat license <http://www.jclark.com/xml/copying.txt> -- System Information: Debian Release: stretch/sid APT prefers testing APT policy: (800, 'testing'), (500, 'unstable') Architecture: amd64 (x86_64) Kernel: Linux 4.7.0-1-amd64 (SMP w/4 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system) Versions of packages gfortran-6 depends on: ii gcc-6 6.2.0-10 ii gcc-6-base 6.2.0-10 ii libc6 2.24-5 ii libc6-dev 2.24-5 ii libgfortran-6-dev 6.2.0-10 ii libgmp10 2:6.1.1+dfsg-1 ii libisl15 0.17.1-1 ii libmpc3 1.0.3-1 ii libmpfr4 3.1.5-1 ii zlib1g 1:1.2.8.dfsg-2+b3 gfortran-6 recommends no packages. Versions of packages gfortran-6 suggests: pn gfortran-6-doc <none> pn gfortran-6-multilib <none> pn libcoarrays-dev <none> pn libgfortran3-dbg <none> -- no debconf information