all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "Ludovic Courtès" <ludo@gnu.org>
To: Andreas Enge <andreas@enge.fr>
Cc: 43579@debbugs.gnu.org, Maxim Cournoyer <maxim.cournoyer@gmail.com>
Subject: bug#43579: g++ does not provide std::fegetround
Date: Sat, 03 Oct 2020 12:02:18 +0200	[thread overview]
Message-ID: <87362vhbkl.fsf@gnu.org> (raw)
In-Reply-To: <20201002180621.GA4862@jurong> (Andreas Enge's message of "Fri, 2 Oct 2020 20:06:21 +0200")

Hi,

(Cc’ing Maxim who’s looked into this before.)

Andreas Enge <andreas@enge.fr> skribis:

> well, just put these lines into a file called "round.cpp" (as attached),
> and then
>    gcc round.cpp

Ah yes, I wasn’t sure if this was ‘gcc-toolchain’ or not.  Only 7.x (the
current ‘gcc-final’) works:

--8<---------------cut here---------------start------------->8---
$ cat t.cpp
#include <cfenv>
int main () {
   return std::fegetround ();
}

$ guix environment -C --ad-hoc gcc-toolchain@7 -- g++ -Wall -c t.cpp
$ guix environment -C --ad-hoc gcc-toolchain -- g++ -Wall -c t.cpp
t.cpp: In function 'int main()':
t.cpp:3:16: error: 'fegetround' is not a member of 'std'; did you mean 'fegetround'?
    3 |    return std::fegetround ();
      |                ^~~~~~~~~~
In file included from /gnu/store/maa9v3r0l3kzi9y20mz5m5c1f83m75n5-profile/include/c++/fenv.h:36,
                 from /gnu/store/maa9v3r0l3kzi9y20mz5m5c1f83m75n5-profile/include/c++/cfenv:41,
                 from t.cpp:1:
/gnu/store/maa9v3r0l3kzi9y20mz5m5c1f83m75n5-profile/include/fenv.h:104:12: note: 'fegetround' declared here
  104 | extern int fegetround (void) __THROW __attribute_pure__;
      |            ^~~~~~~~~~
$ guix describe
Generacio 162   Oct 01 2020 00:23:38    (nuna)
  guix 7607ace
    repository URL: https://git.savannah.gnu.org/git/guix.git
    branch: master
    commit: 7607ace5091aea0157ba5c8a508129cc5fc4f931
--8<---------------cut here---------------end--------------->8---

It’s the same story as <https://issues.guix.gnu.org/42392>.

> The difference to the Opensuse headers is that in bits/c++config.h,
> they define _GLIBCXX_USE_C99_FENV_TR1, which, as I understand it,
> removes the fe* functions from the global namespace to put them back into
> the std:: namespace.

Indeed, the build log of ‘gcc-10’ for instance has this:

--8<---------------cut here---------------start------------->8---
checking fenv.h usability... yes
checking fenv.h presence... yes
checking for fenv.h... yes
checking for complex.h... (cached) yes
checking for complex.h... (cached) yes
checking for ISO C99 support to TR1 in <complex.h>... yes
checking for ISO C99 support to TR1 in <ctype.h>... yes
checking for fenv.h... (cached) yes
checking for ISO C99 support to TR1 in <fenv.h>... no
--8<---------------cut here---------------end--------------->8---

Here’s the ‘prev-x86_64-unknown-linux-gnu/libstdc++-v3/config.log’
excerpt:

--8<---------------cut here---------------start------------->8---
configure:16448: checking for fenv.h
configure:16448: result: yes
configure:16462: checking for ISO C99 support to TR1 in <fenv.h>
configure:16490:  /tmp/guix-build-gcc-10.2.0.drv-0/build/./gcc/xgcc -shared-libgcc -B/tmp/guix-build-gcc-10.2.0.drv-0/build/./gcc -nostdinc++ -L/tmp/guix-build-gcc-10.2.0.drv-0/build/x86_64-unknown-linux-gnu/libstdc++-v3/src -L/tmp/guix-build-gcc-10.2.0.drv-0/build/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs -L/tmp/guix-build-gcc-10.2.0.drv-0/build/x86_64-unknown-linux-gnu/libstdc++-v3/libsupc++/.libs -B/gnu/store/xpdy9vvqym9xv7praqkwsm3gdzn2kv1p-gcc-10.2.0/x86_64-unknown-linux-gnu/bin/ -B/gnu/store/xpdy9vvqym9xv7praqkwsm3gdzn2kv1p-gcc-10.2.0/x86_64-unknown-linux-gnu/lib/ -isystem /gnu/store/xpdy9vvqym9xv7praqkwsm3gdzn2kv1p-gcc-10.2.0/x86_64-unknown-linux-gnu/include -isystem /gnu/store/xpdy9vvqym9xv7praqkwsm3gdzn2kv1p-gcc-10.2.0/x86_64-unknown-linux-gnu/sys-include   -fno-checking -c -g -O2 -D_GNU_SOURCE -std=c++98  conftest.cpp >&5
conftest.cpp: In function 'int main()':
conftest.cpp:102:7: error: 'fexcept_t' was not declared in this scope; did you mean 'except'?
  102 |       fexcept_t* pflag;
      |       ^~~~~~~~~
      |       except
conftest.cpp:102:18: error: 'pflag' was not declared in this scope
  102 |       fexcept_t* pflag;
      |                  ^~~~~
conftest.cpp:103:7: error: 'fenv_t' was not declared in this scope
  103 |       fenv_t* penv;
      |       ^~~~~~
conftest.cpp:103:15: error: 'penv' was not declared in this scope
  103 |       fenv_t* penv;
      |               ^~~~
conftest.cpp:105:13: error: 'feclearexcept' was not declared in this scope
  105 |       ret = feclearexcept(except);
      |             ^~~~~~~~~~~~~
conftest.cpp:106:13: error: 'fegetexceptflag' was not declared in this scope
  106 |       ret = fegetexceptflag(pflag, except);
      |             ^~~~~~~~~~~~~~~
conftest.cpp:107:13: error: 'feraiseexcept' was not declared in this scope
  107 |       ret = feraiseexcept(except);
      |             ^~~~~~~~~~~~~
conftest.cpp:108:13: error: 'fesetexceptflag' was not declared in this scope
  108 |       ret = fesetexceptflag(pflag, except);
      |             ^~~~~~~~~~~~~~~
conftest.cpp:109:13: error: 'fetestexcept' was not declared in this scope
  109 |       ret = fetestexcept(except);
      |             ^~~~~~~~~~~~
conftest.cpp:110:13: error: 'fegetround' was not declared in this scope
  110 |       ret = fegetround();
      |             ^~~~~~~~~~
conftest.cpp:111:13: error: 'fesetround' was not declared in this scope
  111 |       ret = fesetround(mode);
      |             ^~~~~~~~~~
conftest.cpp:112:13: error: 'fegetenv' was not declared in this scope
  112 |       ret = fegetenv(penv);
      |             ^~~~~~~~
conftest.cpp:113:13: error: 'feholdexcept' was not declared in this scope
  113 |       ret = feholdexcept(penv);
      |             ^~~~~~~~~~~~
conftest.cpp:114:13: error: 'fesetenv' was not declared in this scope
  114 |       ret = fesetenv(penv);
      |             ^~~~~~~~
conftest.cpp:115:13: error: 'feupdateenv' was not declared in this scope
  115 |       ret = feupdateenv(penv);
      |             ^~~~~~~~~~~
configure:16490: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "package-unused"
| #define PACKAGE_TARNAME "libstdc++"
| #define PACKAGE_VERSION "version-unused"
| #define PACKAGE_STRING "package-unused version-unused"
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE_URL ""
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
| #define HAVE_STDLIB_H 1
| #define HAVE_STRING_H 1
| #define HAVE_MEMORY_H 1
| #define HAVE_STRINGS_H 1
| #define HAVE_INTTYPES_H 1
| #define HAVE_STDINT_H 1
| #define HAVE_UNISTD_H 1
| #define HAVE_DLFCN_H 1
| #define LT_OBJDIR ".libs/"
| #define _GLIBCXX_HOSTED 1
| #define _GLIBCXX_VERBOSE 1
| #define _GLIBCXX_ATOMIC_BUILTINS 1
| #define HAVE_ATOMIC_LOCK_POLICY 1
| #define _GLIBCXX_USE_DECIMAL_FLOAT 1
| #define _GLIBCXX_USE_INT128 1
| #define HAVE_STRXFRM_L 1
| #define HAVE_STRERROR_L 1
| #define HAVE_STRERROR_R 1
| #define _GLIBCXX_USE_LONG_LONG 1
| #define HAVE_WCHAR_H 1
| #define HAVE_MBSTATE_T 1
| #define HAVE_WCTYPE_H 1
| #define _GLIBCXX_USE_WCHAR_T 1
| #define _GLIBCXX98_USE_C99_MATH 1
| #define HAVE_TGMATH_H 1
| #define HAVE_COMPLEX_H 1
| #define _GLIBCXX98_USE_C99_COMPLEX 1
| #define _GLIBCXX98_USE_C99_STDIO 1
| #define _GLIBCXX98_USE_C99_STDLIB 1
| #define HAVE_VFWSCANF 1
| #define HAVE_VSWSCANF 1
| #define HAVE_VWSCANF 1
| #define HAVE_WCSTOF 1
| #define HAVE_ISWBLANK 1
| #define _GLIBCXX98_USE_C99_WCHAR 1
| #define _GLIBCXX_USE_C99 1
| #define _GLIBCXX11_USE_C99_MATH 1
| #define HAVE_TGMATH_H 1
| #define HAVE_COMPLEX_H 1
| #define _GLIBCXX11_USE_C99_COMPLEX 1
| #define _GLIBCXX11_USE_C99_STDIO 1
| #define _GLIBCXX11_USE_C99_STDLIB 1
| #define HAVE_VFWSCANF 1
| #define HAVE_VSWSCANF 1
| #define HAVE_VWSCANF 1
| #define HAVE_WCSTOF 1
| #define HAVE_ISWBLANK 1
| #define _GLIBCXX11_USE_C99_WCHAR 1
| #define _GLIBCXX_FULLY_DYNAMIC_STRING 0
| #define HAVE_GETS 1
| #define HAVE_EOWNERDEAD 1
| #define HAVE_ENOTRECOVERABLE 1
| #define HAVE_ENOLINK 1
| #define HAVE_EPROTO 1
| #define HAVE_ENODATA 1
| #define HAVE_ENOSR 1
| #define HAVE_ENOSTR 1
| #define HAVE_ETIME 1
| #define HAVE_EBADMSG 1
| #define HAVE_ECANCELED 1
| #define HAVE_EOVERFLOW 1
| #define HAVE_ENOTSUP 1
| #define HAVE_EIDRM 1
| #define HAVE_ETXTBSY 1
| #define HAVE_ECHILD 1
| #define HAVE_ENOSPC 1
| #define HAVE_EPERM 1
| #define HAVE_ETIMEDOUT 1
| #define HAVE_EWOULDBLOCK 1
| #define HAVE_UCHAR_H 1
| #define _GLIBCXX_USE_C11_UCHAR_CXX11 1
| #define HAVE_INT64_T 1
| #define HAVE_INT64_T_LONG 1
| #define _GLIBCXX_USE_LFS 1
| #define HAVE_SYS_IOCTL_H 1
| #define HAVE_POLL 1
| #define HAVE_S_ISREG 1
| #define HAVE_SYS_UIO_H 1
| #define HAVE_WRITEV 1
| #define HAVE_FENV_H 1
| #define HAVE_COMPLEX_H 1
| #define HAVE_COMPLEX_H 1
| #define _GLIBCXX_USE_C99_COMPLEX_TR1 1
| #define _GLIBCXX_USE_C99_CTYPE_TR1 1
| #define HAVE_FENV_H 1
| /* end confdefs.h.  */
| #include <fenv.h>
| int
| main ()
| {
| int except, mode;
| 		    fexcept_t* pflag;
| 		    fenv_t* penv;
| 		    int ret;
| 		    ret = feclearexcept(except);
| 		    ret = fegetexceptflag(pflag, except);
| 		    ret = feraiseexcept(except);
| 		    ret = fesetexceptflag(pflag, except);
| 		    ret = fetestexcept(except);
| 		    ret = fegetround();
| 		    ret = fesetround(mode);
| 		    ret = fegetenv(penv);
| 		    ret = feholdexcept(penv);
| 		    ret = fesetenv(penv);
| 		    ret = feupdateenv(penv);
| 
|   ;
|   return 0;
| }
configure:16497: result: no
--8<---------------cut here---------------end--------------->8---

The same program builds fine outside.

Turns out GCC provides <fenv.h>, too:

--8<---------------cut here---------------start------------->8---
$ find /tmp/guix-build-gcc-10.2.0.drv-0/ -name fenv.h
/tmp/guix-build-gcc-10.2.0.drv-0/gcc-10.2.0/fixincludes/tests/base/bits/fenv.h
/tmp/guix-build-gcc-10.2.0.drv-0/gcc-10.2.0/libstdc++-v3/include/tr1/fenv.h
/tmp/guix-build-gcc-10.2.0.drv-0/gcc-10.2.0/libstdc++-v3/include/c_compatibility/fenv.h
/tmp/guix-build-gcc-10.2.0.drv-0/build/prev-x86_64-unknown-linux-gnu/libstdc++-v3/include/tr1/fenv.h
/tmp/guix-build-gcc-10.2.0.drv-0/build/prev-x86_64-unknown-linux-gnu/libstdc++-v3/include/fenv.h
--8<---------------cut here---------------end--------------->8---

So this is again #include_next not picking the right <fenv.h> due to
search path ordering issues and/or duplicate entries.

Thoughts anyone?

I think we need a proper fix but the feedback we got from GCC folks last
time didn’t give me much insight as to what we should do.

> This should happen somewhere in a configure phase inside the gcc build, but
> I do not know how to obtain the config.log file easily (short of adding a
> phase "(const #f)" to the build recipe and doing a "guix build -K").

I do:

  guix build -e '(@ (gnu packages gcc) gcc-10)' --no-grafts --check -K

Then I hit C-c once the relevant ‘configure’ has run (you can check
what’s in /tmp/guix-build-gcc-10*).  :-)

Thanks,
Ludo’.




  reply	other threads:[~2020-10-03 10:03 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-23 16:21 bug#43579: g++ does not provide std::fegetround Andreas Enge
2020-09-23 16:36 ` Andreas Enge
2020-09-23 19:03 ` Ricardo Wurmus
2020-09-23 20:05   ` Andreas Enge
2020-09-23 20:20     ` Andreas Enge
2020-09-23 21:28       ` Ricardo Wurmus
2020-10-01 12:36 ` Ludovic Courtès
2020-10-02  2:39   ` Brett Gilio
2020-10-02 18:06     ` Andreas Enge
2020-10-03 10:02       ` Ludovic Courtès [this message]
2020-11-13 17:59         ` Miguel Ángel Arruga Vivas
2021-12-27 21:48 ` Ricardo Wurmus
2022-06-13 17:03 ` bug#43579: Problem still present Andreas Enge
2023-01-29 23:19 ` bug#43579: Sharlatan Hellseher

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87362vhbkl.fsf@gnu.org \
    --to=ludo@gnu.org \
    --cc=43579@debbugs.gnu.org \
    --cc=andreas@enge.fr \
    --cc=maxim.cournoyer@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.