This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/35765] New: return type of complex functions not C compatible
- From: "Georg dot Baum at post dot rwth-aachen dot de" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 30 Mar 2008 13:05:14 -0000
- Subject: [Bug fortran/35765] New: return type of complex functions not C compatible
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
As I understand the gfortran docs, the -ff2c/-fno-f2c switches change how
functions returning complex numbers are implemented:
-ff2c: the return value is returned in an additional argument as g77 and other
fortran compilers do it (can be seen e. g. in
http://www.pgroup.com/doc/pvfug.pdf, chapter 11 and
http://www.intel.com/support/performancetools/libraries/mkl/sb/cs-017175.htm)
-fno-f2c (which is the default): the return value is returned in a C compatible
manner without an additional argument.
The latter does not work for me. To reproduce, compile the snippet
complex function fcomplex_func(i)
implicit none
integer i
fcomplex_func = cmplx(i, 2*i)
end
double complex function dcomplex_func(i)
implicit none
integer i
dcomplex_func = dcmplx(i, 2*i)
end
with gfortran and the snippet
#include <stdio.h>
typedef struct { float r; float i; } fcomplex;
typedef struct { double r; double i; } dcomplex;
#ifdef FF2C
extern fcomplex fcomplex_func__(int const *);
extern dcomplex dcomplex_func__(int const *);
#else
extern void fcomplex_func_(fcomplex *, int const *);
extern void dcomplex_func_(dcomplex *, int const *);
#endif
int main(){
int const i = 12;
int const j = 13;
fcomplex fc = {7,8};
dcomplex dc = {9,10};
#ifdef FF2C
printf("c return %d %d\n", i, j);
fc = fcomplex_func__(&i);
dc = dcomplex_func__(&j);
#else
printf("nonc return %d %d\n", i, j);
fcomplex_func_(&fc, &i);
dcomplex_func_(&dc, &j);
#endif
printf("fcomplex_func: %d %g %g\n", i, fc.r, fc.i);
printf("dcomplex_func: %d %lg %lg\n", j, dc.r, dc.i);
return 0;
}
with gcc and link both together. The expected output of the program is
nonc return 12 13
fcomplex_func: 12 12 24
dcomplex_func: 13 13 26
but here it goes into an endless loop and prints
nonc return 12 13
fcomplex_func: 12 7 8
dcomplex_func: 13 13 26
repeatedly until manual abort. Note that the double complex result is correct,
but nevertheless the call of dcomplex_func does something bad (stack
corruption?). The endless loop persists if you comment out the call of
fcomplex_func.
If you use the -ff2c switch of gfortran, and define the FF2C preprocessor
variable for gcc everything works well, and the output is as expected
nonc return 12 13
fcomplex_func: 12 12 24
dcomplex_func: 13 13 26
. I tried 4.2.4 svn from today, and the debian packages 4.2.3-2 and 4.3.0-1,
and all versions show this problem.
--
Summary: return type of complex functions not C compatible
Product: gcc
Version: 4.2.4
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: Georg dot Baum at post dot rwth-aachen dot de
GCC target triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35765