bitwiseworks / gcc-os2

Port of GCC compiler to OS/2
GNU General Public License v2.0
16 stars 2 forks source link

#include <cfenv> fails with multiple errors #31

Open dmik opened 3 years ago

dmik commented 3 years ago

Test case:

#include <cfenv>

int main()
{
  return 0;
}

Output:

[11 Sep 2020 22:51:14, g++ -Zomf test.cpp]

In file included from C:/usr/include/c++/9/cfenv:41,
                 from test.cpp:3:
C:/usr/include/c++/9/fenv.h:58:11: error: '::fenv_t' has not been declared
   58 |   using ::fenv_t;
      |           ^~~~~~
C:/usr/include/c++/9/fenv.h:59:11: error: '::fexcept_t' has not been declared
   59 |   using ::fexcept_t;
      |           ^~~~~~~~~
C:/usr/include/c++/9/fenv.h:62:11: error: '::feclearexcept' has not been declared
   62 |   using ::feclearexcept;
      |           ^~~~~~~~~~~~~
C:/usr/include/c++/9/fenv.h:63:11: error: '::fegetexceptflag' has not been declared
   63 |   using ::fegetexceptflag;
      |           ^~~~~~~~~~~~~~~
C:/usr/include/c++/9/fenv.h:64:11: error: '::feraiseexcept' has not been declared
   64 |   using ::feraiseexcept;
      |           ^~~~~~~~~~~~~
C:/usr/include/c++/9/fenv.h:65:11: error: '::fesetexceptflag' has not been declared
   65 |   using ::fesetexceptflag;
      |           ^~~~~~~~~~~~~~~
C:/usr/include/c++/9/fenv.h:66:11: error: '::fetestexcept' has not been declared
   66 |   using ::fetestexcept;
      |           ^~~~~~~~~~~~
C:/usr/include/c++/9/fenv.h:68:11: error: '::fegetround' has not been declared
   68 |   using ::fegetround;
      |           ^~~~~~~~~~
C:/usr/include/c++/9/fenv.h:69:11: error: '::fesetround' has not been declared
   69 |   using ::fesetround;
      |           ^~~~~~~~~~
C:/usr/include/c++/9/fenv.h:71:11: error: '::fegetenv' has not been declared
   71 |   using ::fegetenv;
      |           ^~~~~~~~
C:/usr/include/c++/9/fenv.h:72:11: error: '::feholdexcept' has not been declared
   72 |   using ::feholdexcept;
      |           ^~~~~~~~~~~~
C:/usr/include/c++/9/fenv.h:73:11: error: '::fesetenv' has not been declared
   73 |   using ::fesetenv;
      |           ^~~~~~~~
C:/usr/include/c++/9/fenv.h:74:11: error: '::feupdateenv' has not been declared
   74 |   using ::feupdateenv;
      |           ^~~~~~~~~~~
In file included from test.cpp:3:
C:/usr/include/c++/9/cfenv:61:11: error: '::fenv_t' has not been declared
   61 |   using ::fenv_t;
      |           ^~~~~~
C:/usr/include/c++/9/cfenv:62:11: error: '::fexcept_t' has not been declared
   62 |   using ::fexcept_t;
      |           ^~~~~~~~~
C:/usr/include/c++/9/cfenv:65:11: error: '::feclearexcept' has not been declared
   65 |   using ::feclearexcept;
      |           ^~~~~~~~~~~~~
C:/usr/include/c++/9/cfenv:66:11: error: '::fegetexceptflag' has not been declared
   66 |   using ::fegetexceptflag;
      |           ^~~~~~~~~~~~~~~
C:/usr/include/c++/9/cfenv:67:11: error: '::feraiseexcept' has not been declared
   67 |   using ::feraiseexcept;
      |           ^~~~~~~~~~~~~
C:/usr/include/c++/9/cfenv:68:11: error: '::fesetexceptflag' has not been declared
   68 |   using ::fesetexceptflag;
      |           ^~~~~~~~~~~~~~~
C:/usr/include/c++/9/cfenv:69:11: error: '::fetestexcept' has not been declared
   69 |   using ::fetestexcept;
      |           ^~~~~~~~~~~~
C:/usr/include/c++/9/cfenv:71:11: error: '::fegetround' has not been declared
   71 |   using ::fegetround;
      |           ^~~~~~~~~~
C:/usr/include/c++/9/cfenv:72:11: error: '::fesetround' has not been declared
   72 |   using ::fesetround;
      |           ^~~~~~~~~~
C:/usr/include/c++/9/cfenv:74:11: error: '::fegetenv' has not been declared
   74 |   using ::fegetenv;
      |           ^~~~~~~~
C:/usr/include/c++/9/cfenv:75:11: error: '::feholdexcept' has not been declared
   75 |   using ::feholdexcept;
      |           ^~~~~~~~~~~~
C:/usr/include/c++/9/cfenv:76:11: error: '::fesetenv' has not been declared
   76 |   using ::fesetenv;
      |           ^~~~~~~~
C:/usr/include/c++/9/cfenv:77:11: error: '::feupdateenv' has not been declared
   77 |   using ::feupdateenv;
      |           ^~~~~~~~~~~

[11 Sep 2020 22:51:15, exit code 0, took 1.13s]

It's unclear why it happens as LIBC fenv.h contains all declarations that are needed here. Looks like # include_next <fenv.h> in /usr/include/c++/9/fenv.h for some reason has no effect... This header is simply not included. Weird.

dmik commented 3 years ago

Quick testing shows that # include_next <fenv.h> includes the same /usr/include/c++/9/fenv.h file again instead of going to a next directory in the include search list and finally find /usr/include/fenv.h. And I guess I know why. Here is the result of running g++ -E -x c++ - -v < /dev/null:

Using built-in specs.
COLLECT_GCC=C:\USR\BIN\g++.exe
Target: i686-pc-os2-emx
Configured with: D:/Users/dmik/rpmbuild/BUILD/gcc-9.2.0/configure --disable-bootstrap --enable-languages=c,c++ --build=i686-pc-os2-emx --with-sysroot=/@unixroot --prefix=/@unixroot/usr --mandir=/@unixroot/usr/share/man --infodir=/@unixroot/usr/share/info --with-bugurl=https://github.com/bitwiseworks/gcc-os2/issues --enable-shared --enable-threads --enable-checking=release --disable-multilib --with-system-zlib --with-gcc-major-version-only --without-isl --with-tune=generic --with-arch=i686 --with-gnu-as --disable-libstdcxx-pch
Thread model: os2
gcc version 9.2.0 20190812 (OS/2 RPM build 9.2.0-5) (GCC) 
COLLECT_GCC_OPTIONS='-E' '-v' '-mtune=generic' '-march=i686'
 C:/usr/bin/../libexec/gcc/i686-pc-os2-emx/9/cc1plus.exe -E -quiet -v -iprefix C:/usr/bin/../lib/gcc/i686-pc-os2-emx/9/ - -mtune=generic -march=i686
ignoring nonexistent directory "C:/usr/bin/../lib/gcc/i686-pc-os2-emx/9/../../../../i686-pc-os2-emx/include"
ignoring nonexistent directory "C:/usr/bin/../lib/gcc/../../lib/gcc/i686-pc-os2-emx/9/../../../../i686-pc-os2-emx/include"
#include "..." search starts here:
#include <...> search starts here:
 C:/usr/bin/../lib/gcc/i686-pc-os2-emx/9/../../../../include/c++/9
 C:/usr/bin/../lib/gcc/i686-pc-os2-emx/9/../../../../include/c++/9/i686-pc-os2-emx
 C:/usr/bin/../lib/gcc/i686-pc-os2-emx/9/../../../../include/c++/9/backward
 C:/usr/bin/../lib/gcc/i686-pc-os2-emx/9/include
 C:/usr/bin/../lib/gcc/i686-pc-os2-emx/9/include-fixed
 C:/usr/bin/../lib/gcc/../../lib/gcc/i686-pc-os2-emx/9/../../../../include/c++/9
 C:/usr/bin/../lib/gcc/../../lib/gcc/i686-pc-os2-emx/9/../../../../include/c++/9/i686-pc-os2-emx
 C:/usr/bin/../lib/gcc/../../lib/gcc/i686-pc-os2-emx/9/../../../../include/c++/9/backward
 C:/usr/bin/../lib/gcc/../../lib/gcc/i686-pc-os2-emx/9/include
 /@unixroot/usr/local/include
 C:/usr/bin/../lib/gcc/../../lib/gcc/i686-pc-os2-emx/9/include-fixed
 /@unixroot/usr/include
End of search list.

Due to some mess with resolving relative paths, include/c++/9 appears twice on the search list and hence the result. This looks like a gcc configure/compile time issue. Needs debugging.