#include <cfenv> fails with multiple errors #38

Open
opened 2026-01-29 22:24:13 +00:00 by claunia · 1 comment
Owner

Originally created by @dmik on GitHub (Sep 11, 2020).

Originally assigned to: @dmik on GitHub.

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.

Originally created by @dmik on GitHub (Sep 11, 2020). Originally assigned to: @dmik on GitHub. Test case: ```c++ #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.
Author
Owner

@dmik commented on GitHub (Sep 11, 2020):

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.

@dmik commented on GitHub (Sep 11, 2020): 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.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bitwiseworks/gcc-os2#38