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

Reply via email to