public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "cvs-commit at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/101539] [C++20] Implement builtins for layout-compatibility and pointer-interconvertibility traits
Date: Tue, 17 Aug 2021 19:18:38 +0000	[thread overview]
Message-ID: <bug-101539-4-FZQO6CvVcC@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-101539-4@http.gcc.gnu.org/bugzilla/>

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

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

https://gcc.gnu.org/g:32c3a75390623a0470df52af13f78baddd562981

commit r12-2975-g32c3a75390623a0470df52af13f78baddd562981
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Tue Aug 17 21:06:39 2021 +0200

    c++: Implement P0466R5 __cpp_lib_is_layout_compatible compiler helpers
[PR101539]

    The following patch implements __is_layout_compatible trait and
    __builtin_is_corresponding_member helper function for the
    std::is_corresponding_member template function.

    As the current definition of layout compatible type has various problems,
    which result e.g. in corresponding members in layout compatible types
having
    different member offsets, the patch anticipates some changes to the C++
    standard:
    1) class or enumeral types aren't layout compatible if they have different
       alignment or size
    2) if two members have different offsets, they can't be corresponding
members
       ([[no_unique_address]] with empty types can change that, or alignas
       on the member decls)
    3) in unions, bitfields can't correspond to non-unions, or bitfields can't
       correspond to bitfields with different widths, or members with
       [[no_unique_address]] can't correspond to members without that attribute

    __builtin_is_corresponding_member for anonymous structs (GCC extension)
will
    recurse into the anonymous structs.  For anonymous unions it will emit
    a sorry if it can't prove such member types can't appear in the
    anonymous unions or anonymous aggregates in that union, because
    corresponding member is defined only using common initial sequence which is
    only defined for std-layout non-union class types and so I have no idea
what
    to do otherwise in that case.

    2021-08-17  Jakub Jelinek  <jakub@redhat.com>

            PR c++/101539
    gcc/c-family/
            * c-common.h (enum rid): Add RID_IS_LAYOUT_COMPATIBLE.
            * c-common.c (c_common_reswords): Add __is_layout_compatible.
    gcc/cp/
            * cp-tree.h (enum cp_trait_kind): Add CPTK_IS_LAYOUT_COMPATIBLE.
            (enum cp_built_in_function): Add
CP_BUILT_IN_IS_CORRESPONDING_MEMBER.
            (fold_builtin_is_corresponding_member, next_common_initial_seqence,
            layout_compatible_type_p): Declare.
            * parser.c (cp_parser_primary_expression): Handle
            RID_IS_LAYOUT_COMPATIBLE.
            (cp_parser_trait_expr): Likewise.
            * cp-objcp-common.c (names_builtin_p): Likewise.
            * constraint.cc (diagnose_trait_expr): Handle
            CPTK_IS_LAYOUT_COMPATIBLE.
            * decl.c (cxx_init_decl_processing): Register
            __builtin_is_corresponding_member builtin.
            * constexpr.c (cxx_eval_builtin_function_call): Handle
            CP_BUILT_IN_IS_CORRESPONDING_MEMBER builtin.
            * semantics.c (is_corresponding_member_union,
            is_corresponding_member_aggr,
fold_builtin_is_corresponding_member):
            New functions.
            (trait_expr_value): Handle CPTK_IS_LAYOUT_COMPATIBLE.
            (finish_trait_expr): Likewise.
            * typeck.c (next_common_initial_seqence, layout_compatible_type_p):
            New functions.
            * cp-gimplify.c (cp_gimplify_expr): Fold
            CP_BUILT_IN_IS_CORRESPONDING_MEMBER.
            (cp_fold): Likewise.
            * tree.c (builtin_valid_in_constant_expr_p): Handle
            CP_BUILT_IN_IS_CORRESPONDING_MEMBER.
            * cxx-pretty-print.c (pp_cxx_trait_expression): Handle
            CPTK_IS_LAYOUT_COMPATIBLE.
            * class.c (remove_zero_width_bit_fields): Remove.
            (layout_class_type): Don't call it.
    gcc/testsuite/
            * g++.dg/cpp2a/is-corresponding-member1.C: New test.
            * g++.dg/cpp2a/is-corresponding-member2.C: New test.
            * g++.dg/cpp2a/is-corresponding-member3.C: New test.
            * g++.dg/cpp2a/is-corresponding-member4.C: New test.
            * g++.dg/cpp2a/is-corresponding-member5.C: New test.
            * g++.dg/cpp2a/is-corresponding-member6.C: New test.
            * g++.dg/cpp2a/is-corresponding-member7.C: New test.
            * g++.dg/cpp2a/is-corresponding-member8.C: New test.
            * g++.dg/cpp2a/is-layout-compatible1.C: New test.
            * g++.dg/cpp2a/is-layout-compatible2.C: New test.
            * g++.dg/cpp2a/is-layout-compatible3.C: New test.

  parent reply	other threads:[~2021-08-17 19:18 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-20 20:41 [Bug c++/101539] New: " jason at gcc dot gnu.org
2021-07-20 20:42 ` [Bug c++/101539] " mpolacek at gcc dot gnu.org
2021-07-21 13:58 ` jakub at gcc dot gnu.org
2021-07-21 14:10 ` jakub at gcc dot gnu.org
2021-07-21 15:12 ` jakub at gcc dot gnu.org
2021-07-22  7:42 ` jakub at gcc dot gnu.org
2021-07-28 15:57 ` jakub at gcc dot gnu.org
2021-07-28 17:16 ` jakub at gcc dot gnu.org
2021-07-30 16:51 ` cvs-commit at gcc dot gnu.org
2021-08-02 14:40 ` jakub at gcc dot gnu.org
2021-08-17 19:18 ` cvs-commit at gcc dot gnu.org [this message]
2021-08-17 19:21 ` jakub at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-101539-4-FZQO6CvVcC@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).