Subject: bug#76090: Regression in gcc-toolchain version 14: C++ header cfenv

From: Jake <[email-masked]>
Date: Thu, 6 Feb 2025 08:05:25 +0000

Hello

With the latest version of gcc-toolchain in Guix (14.2.0), macros from the
<cfenv> header aren't defined during compilation with g++.  Version 13 of
gcc-toolchain doesn't have this problem.

Reproducer:

Create a file called test.cpp with contents:

    #include <stdio.h>
    #include <cfenv>

    int main() {
        #ifdef FE_DIVBYZERO
            printf("FE_DIVBYZERO is defined\n");
        #else
            printf("FE_DIVBYZERO is NOT defined\n");
        #endif

        return 0;
    }

$ guix shell -C gcc-toolchain@14 -- g++ test.cpp && ./a.out
FE_DIVBYZERO is NOT defined

$ guix shell -C gcc-toolchain@13 -- g++ test.cpp && ./a.out
FE_DIVBYZERO is defined

If we include the C equivalent <fenv.h> instead of <cfenv>, again g++ finds
it in version 13 but not in version 14 of gcc-toolchain.
Note that gcc from gcc-toolchain@14 does find the macro from <fenv.h>
(provided the source file has .c extension).

Other macros from <cfenv> are also affected with g++, including
FE_OVERFLOW, FE_UNDERFLOW, FE_INEXACT, and FE_INVALID.

This bug is probably the same as 43579 (feclearexcept with g++)
https://issues.guix.gnu.org/43579

I've copied in the members of core-packages team.

guix a53bd6f

Thanks!
Jake