FluidFFT C++ sources fail to compile with gcc>=6
Created originally on Bitbucket by avmo (Ashwin Vishnu)
For instance with gcc-7.2
» mpicxx --version
g++ (GCC) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
» mpicxx -fwrapv -O2 -Wall -Wno-unused-result -Wsign-compare -Wno-unused-result -Wsign-compare -fwrapv -O2 -Wall -fstack-protector-strong -Wformat -Werror=format-security -flto -fuse-linker-plugin -ffat-lto-objects -fPIC -Isrc_cpp/base -Iinclude -Isrc_cpp/2d -c src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp -o fft2dmpi_with_fftwmpi2d.o
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp: In member function ‘virtual myreal FFT2DMPIWithFFTWMPI2D::compute_energy_from_K(double (*)[2])’:
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp:163:38: error: cannot convert ‘double*’ to ‘__complex__ double’ for argument ‘1’ to ‘double cabs(__complex__ double)’
energy_tmp += pow(cabs(fieldK[i1]), 2);
^
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp:175:46: error: cannot convert ‘double*’ to ‘__complex__ double’ for argument ‘1’ to ‘double cabs(__complex__ double)’
energy_tmp += pow(cabs(fieldK[i1 + i_tmp]), 2);
^
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp:185:49: error: cannot convert ‘double*’ to ‘__complex__ double’ for argument ‘1’ to ‘double cabs(__complex__ double)’
energy_loc += pow(cabs(fieldK[i1 + i0*nK1]), 2);
^
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp: In member function ‘virtual myreal FFT2DMPIWithFFTWMPI2D::compute_mean_from_K(double (*)[2])’:
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp:258:33: error: cannot convert ‘double*’ to ‘__complex__ double’ for argument ‘1’ to ‘double creal(__complex__ double)’
local_mean = creal(fieldK[0]);
^
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp: In member function ‘virtual void FFT2DMPIWithFFTWMPI2D::fft(myreal*, double (*)[2])’:
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp:286:49: error: invalid operands of types ‘mycomplex {aka double [2]}’ and ‘int’ to binary ‘operator/’
fieldK[i1 + i0*nK1] = arrayK[i1 + i0*nK1]/coef_norm;
~~~~~~~~~~~~~~~~~~~^~~~~~~~~~
Similar error has been observed with gcc-6.3
❯ mpicxx -fwrapv -O2 -Wall -Wno-unused-result -Wsign-compare -Wno-unused-result -Wsign-compare -fwrapv -O2 -Wall -fstack-protector-strong -Wformat -Werror=format-security -flto -fuse-linker-plugin -ffat-lto-objects -fPIC -Isrc_cpp/base -Iinclude -I/scratch/avmo/.local/share/fftw/include -Isrc_cpp/2d -c src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp -o fft2dmpi_with_fftwmpi2d.o
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp: In member function ‘virtual myreal FFT2DMPIWithFFTWMPI2D::compute_energy_from_K(double (*)[2])’:
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp:163:38: error: cannot convert ‘double*’ to ‘__complex__ double’ for argument ‘1’ to ‘double cabs(__complex__ double)’
energy_tmp += pow(cabs(fieldK[i1]), 2);
^
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp:175:46: error: cannot convert ‘double*’ to ‘__complex__ double’ for argument ‘1’ to ‘double cabs(__complex__ double)’
energy_tmp += pow(cabs(fieldK[i1 + i_tmp]), 2);
^
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp:185:49: error: cannot convert ‘double*’ to ‘__complex__ double’ for argument ‘1’ to ‘double cabs(__complex__ double)’
energy_loc += pow(cabs(fieldK[i1 + i0*nK1]), 2);
^
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp: In member function ‘virtual myreal FFT2DMPIWithFFTWMPI2D::compute_mean_from_K(double (*)[2])’:
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp:258:33: error: cannot convert ‘double*’ to ‘__complex__ double’ for argument ‘1’ to ‘double creal(__complex__ double)’
local_mean = creal(fieldK[0]);
^
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp: In member function ‘virtual void FFT2DMPIWithFFTWMPI2D::fft(myreal*, double (*)[2])’:
src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp:286:49: error: invalid operands of types ‘mycomplex {aka double [2]}’ and ‘int’ to binary ‘operator/’
fieldK[i1 + i0*nK1] = arrayK[i1 + i0*nK1]/coef_norm; ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~
This does not happen with gcc-4.9
and gcc-5.4
. Verified as follows: by forcing openmpi to use an older gcc version (default being 7.2).
» export OMPI_CXX=g++-5
» export OMPI_CC=gcc-5
» mpicxx -fwrapv -O2 -Wall -Wno-unused-result -Wsign-compare -Wno-unused-result -Wsign-compare -fwrapv -O2 -Wall -fstack-protector-strong -Wformat -Werror=format-security -flto -fuse-linker-plugin -ffat-lto-objects -fPIC -Isrc_cpp/base -Iinclude -Isrc_cpp/2d -c src_cpp/2d/fft2dmpi_with_fftwmpi2d.cpp -o fft2dmpi_with_fftwmpi2d.o
» mpicxx --version
g++-5 (GCC) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.