https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123176

--- Comment #6 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Rainer Orth <[email protected]>:

https://gcc.gnu.org/g:0a48b1fe9866556ce41295d1e3b739c608ea5f22

commit r16-7526-g0a48b1fe9866556ce41295d1e3b739c608ea5f22
Author: Rainer Orth <[email protected]>
Date:   Sun Feb 15 23:11:44 2026 +0100

    Change int8_t to signed char on Solaris [PR113450,PR123176]

    int8_t is currently defined as char in Solaris <sys/int_types.h>

    /*
     * Basic / Extended integer types
     *
     * The following defines the basic fixed-size integer types.
     *
     * Implementations are free to typedef them to Standard C integer types or
     * extensions that they support. If an implementation does not support one
     * of the particular integer data types below, then it should not define
the
     * typedefs and macros corresponding to that data type.  Note that int8_t
     * is not defined in -Xs mode on ISAs for which the ABI specifies "char"
     * as an unsigned entity because there is no way to define an eight bit
     * signed integral.
     */
    typedef char                    int8_t;
    typedef signed char             int8_t;

    and _CHAR_IS_SIGNED defined as 1 in <sys/isa_defs.h>.  As has long been
    known, this violates C99, 7.18.1.1, Exact-width integer types.

    While this works in general nonetheless, it creates constant trouble for
    C++ code as can be seen in PRs libstdc++/113450 and recently
    libstdc++/123176, but also in LLVM.

    While Oracle Solaris engineering is amenable to changing int8_t to
    signed char, this will take time.  However, it proved easy to do so now
    using fixincludes.

    This works for a GCC bootstrap just fine with one exception: as
    documented in PR d/123509, libdruntime has its own definition of int8_t
    which is now inconsistent with GCC's.  This leads to some gdc.test and
    libphobos testsuite failures, which can easily be fixed with the patch
    attached to that PR.  I wouldn't consider this a showstopper for GCC 16
    if that patch wouldn't make it to the release.

    However, the failures point to another problem: with this change, the
    mangling of

            void func(int8_t);

    changes in C++, creating an ABI break.  Fortunately, this isn't seen in
    libstdc++, so the impact should be reasonable compared to the constant
    trouble the current definition causes for C++.

    Besides, clang already uses

            #define __INT8_TYPE__ signed char

    apparently without problems.

    In case users do run into the incompatiblity, the fixed definitions are
    wrapped in #if !defined(_LEGACY_INT8_T)/#endif so there's an easy way back
    to the original definition.

    Bootstrapped on i386-pc-solaris2.11, amd64-pc-solaris2.11,
    sparc-sun-solaris2.11, and sparcv9-sun-solaris2.11 with only the D
    failure described above.

    I've also run 1-stage and bootstrap builds of LLVM main using a patched
    GCC 16 as bootstrap compiler on amd64-pc-solaris2.11 and
    sparcv9-sun-solaris2.11 without regressions.

    2026-01-07  Rainer Orth  <[email protected]>

            fixincludes:
            PR libstdc++/113450
            PR libstdc++/123176
            * inclhack.def (solaris_int8_t): New fix.
            * fixincl.x: Regenerate.

            gcc:
            PR libstdc++/113450
            PR libstdc++/123176
            * config/sol2.h (INT8_TYPE): Change to signed char.
            (INT_LEAST8_TYPE): Likewise.
            (INT_FAST8_TYPE): Likewise.

Reply via email to