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

--- Comment #8 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:981bd3e62cd271f620892cf5db56f00b4df50156

commit r16-2206-g981bd3e62cd271f620892cf5db56f00b4df50156
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Fri Jul 11 19:05:38 2025 +0200

    c++: Implement C++26 P2786R13 - Trivial Relocatability [PR119064]

    The following patch implements the compiler side of the C++26 paper.
    Based on the https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119064#c3
    feedback, the patch enables the new conditional keywords
    trivially_relocatable_if_eligible and replaceable_if_eligible only
    for C++26, for older versions those conditional keywords yield
    -Wc++26-compat warning and are treated as normal identifiers.
    Plus __trivially_relocatable_if_eligible and __replaceable_if_eligible
    are handled as conditional keywords always without diagnostics (similarly
    to __final in C++98).
    The patch uses __builtin_ prefix on the new traits (but unlike clang
    which for some weird reason chose to name one __builtin_is_replaceable
    and another __builtin_is_cpp_trivially_relocatable this one uses
    __builtin_is_replaceable and __builtin_is_trivially_relocatable.
    I'll try to convince clang to change, they've only implemented it
    recently.
    The patch computes these properties on demand, only when something needs
    them (at the expense of eating 2 more bits per lang_type, but I've recently
    saved 64 bits and a patch to save another 64 bits is pending; and even
    4 bits wouldn't fit).
    The patch doesn't add __builtin_trivially_relocate builtin that clang has,
    std::trivially_relocate is not constexpr and I think we don't need it for
    now at least until we implement some kind of vtable pointer signing
    __builtin_memmove should do the job.  Especially if libstdc++ will for
clang
    compatibility use the builtin if available and __builtin_memmove otherwise,
    we can switch any time.
    I've cross-tested all testcases also against the clang++ trunk
    implementation, and both compilers agreed in everything except for
    https://github.com/llvm/llvm-project/issues/143599
    where clang++ was changed already and
    https://github.com/llvm/llvm-project/issues/144232
    where I believe clang++ got it wrong too.
    The first testcase comes from
   
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2786r13.html#simple-worked-examples
    just tweaked so that the classes are named differently each time and that
it
    compiles.  There are 3 differences from the paper vs. the g++ as well as
    clang++ implementation, I've added comments into
    trivially-relocatable1.C but I think either that part of the paper wasn't
    updated through the later changes or it got it wrong.

    2025-07-11  Jakub Jelinek  <ja...@redhat.com>

            PR c++/119064
    gcc/
            * doc/invoke.texi (Wc++26-compat): Document.
    gcc/c-family/
            * c.opt (Wc++26-compat): New option.
            * c.opt.urls: Regenerate.
            * c-opts.cc (c_common_post_options): Clear warn_cxx26_compat for
            C++26 or later.
            * c-cppbuiltin.cc (c_cpp_builtins): For C++26 predefine
            __cpp_trivial_relocatability=202502L.
    gcc/cp/
            * cp-tree.h: Implement C++26 P2786R13 - Trivial Relocatability.
            (struct lang_type): Add trivially_relocatable,
            trivially_relocatable_computed, replaceable and
replaceable_computed
            bitfields.  Change width of dummy from 2 to 30.
            (CLASSTYPE_TRIVIALLY_RELOCATABLE_BIT,
            CLASSTYPE_TRIVIALLY_RELOCATABLE_COMPUTED,
CLASSTYPE_REPLACEABLE_BIT,
            CLASSTYPE_REPLACEABLE_COMPUTED): Define.
            (enum virt_specifier): Add
VIRT_SPEC_TRIVIALLY_RELOCATABLE_IF_ELIGIBLE
            and VIRT_SPEC_REPLACEABLE_IF_ELIGIBLE enumerators.
            (trivially_relocatable_type_p, replaceable_type_p): Declare.
            * cp-trait.def (IS_NOTHROW_RELOCATABLE, IS_REPLACEABLE,
            IS_TRIVIALLY_RELOCATABLE): New traits.
            * parser.cc (cp_parser_class_property_specifier_seq_opt): Handle
            trivially_relocatable_if_eligible,
            __trivially_relocatable_if_eligible, replaceable_if_eligible and
            __replaceable_if_eligible.
            (cp_parser_class_head): Set CLASSTYPE_REPLACEABLE_BIT
            and/or CLASSTYPE_TRIVIALLY_RELOCATABLE_BIT if corresponding
            conditional keywords were parsed and assert corresponding
*_COMPUTED
            macro is false.
            * pt.cc (instantiate_class_template): Copy over also
            CLASSTYPE_TRIVIALLY_RELOCATABLE_{BIT,COMPUTED} and
            CLASSTYPE_REPLACEABLE_{BIT,COMPUTED} bits.
            * semantics.cc (referenceable_type_p): Move definition earlier.
            (trait_expr_value): Handle CPTK_IS_NOTHROW_RELOCATABLE,
            CPTK_IS_REPLACEABLE and CPTK_IS_TRIVIALLY_RELOCATABLE.
            (finish_trait_expr): Likewise.
            * tree.cc (default_movable_type_p): New function.
            (union_with_no_declared_special_member_fns): Likewise.
            (trivially_relocatable_type_p): Likewise.
            (replaceable_type_p): Likewise.
            * constraint.cc (diagnose_trait_expr): Handle
            CPTK_IS_NOTHROW_RELOCATABLE, CPTK_IS_REPLACEABLE and
            CPTK_IS_TRIVIALLY_RELOCATABLE.
    gcc/testsuite/
            * g++.dg/cpp26/feat-cxx26.C: Add test for
            __cpp_trivial_relocatability.
            * g++.dg/cpp26/trivially-relocatable1.C: New test.
            * g++.dg/cpp26/trivially-relocatable2.C: New test.
            * g++.dg/cpp26/trivially-relocatable3.C: New test.
            * g++.dg/cpp26/trivially-relocatable4.C: New test.
            * g++.dg/cpp26/trivially-relocatable5.C: New test.
            * g++.dg/cpp26/trivially-relocatable6.C: New test.
            * g++.dg/cpp26/trivially-relocatable7.C: New test.
            * g++.dg/cpp26/trivially-relocatable8.C: New test.
            * g++.dg/cpp26/trivially-relocatable9.C: New test.
            * g++.dg/cpp26/trivially-relocatable10.C: New test.
            * g++.dg/cpp26/trivially-relocatable11.C: New test.
  • [Bug c++/119064] [C++26] P2786R... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to