https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121819
Bug ID: 121819 Summary: Shall std::is_integral/make_signed/make_unsigned always be defined for int128 ? Product: gcc Version: 15.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: romain.geissler at amadeus dot com Target Milestone: --- Hi, I wish to report something that maybe Peter Dimov did discuss with you already in the past. It follows this comment from him in this pull request: https://github.com/boostorg/lexical_cast/pull/87#discussion_r2326189694 It seems that gcc defines __int128 on 64 bits platforms (at least the most popular ones) no matter if we use -std=gnu++XX or -std=c++XX. However in <type_traits> libstdc++ defines std::is_integral/make_signed/make_unsigned only if: #if defined __SIZEOF_INT128__ && defined __STRICT_ANSI__ so only with -std=gnu++XX and not with -std=c++XX. On Boost side, the detection of the __int128 extension support is done like this: #if defined(__SIZEOF_INT128__) && !defined(BOOST_NVCC_CXX03) # define BOOST_HAS_INT128 #endif (cf: https://github.com/boostorg/config/blob/238e997ecce992e6342218bc580f8e30326ebb53/include/boost/config/compiler/gcc.hpp#L152). Would it make sense to remove the "&& defined __STRICT_ANSI__" part on libstdc++ side so that type_traits work for the __int128 extension even in strict mode ? After all, gcc still defines the extension even in strict mode. Cheers? Romain