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

--- Comment #9 from CVS 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:896048cf43d5eb21ab7c16553bb9d13b0f890b81

commit r11-5704-g896048cf43d5eb21ab7c16553bb9d13b0f890b81
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Thu Dec 3 15:46:54 2020 +0100

    c++: Add __builtin_bit_cast to implement std::bit_cast [PR93121]

    The following patch adds __builtin_bit_cast builtin, similarly to
    clang or MSVC which implement std::bit_cast using such an builtin too.
    It checks the various std::bit_cast requirements, when not constexpr
    evaluated acts pretty much like VIEW_CONVERT_EXPR of the source argument
    to the destination type and the hardest part is obviously the constexpr
    evaluation.
    I've left out PDP11 handling of those, couldn't figure out how exactly are
    bitfields laid out there

    2020-12-03  Jakub Jelinek  <ja...@redhat.com>

            PR libstdc++/93121
            * fold-const.h (native_encode_initializer): Add mask argument
            defaulted to nullptr.
            (find_bitfield_repr_type): Declare.
            (native_interpret_aggregate): Declare.
            * fold-const.c (find_bitfield_repr_type): New function.
            (native_encode_initializer): Add mask argument and support for
            filling it.  Handle also some bitfields without integral
            DECL_BIT_FIELD_REPRESENTATIVE.
            (native_interpret_aggregate): New function.
            * gimple-fold.h (clear_type_padding_in_mask): Declare.
            * gimple-fold.c (struct clear_padding_struct): Add clear_in_mask
            member.
            (clear_padding_flush): Handle buf->clear_in_mask.
            (clear_padding_union): Copy clear_in_mask.  Don't error if
            buf->clear_in_mask is set.
            (clear_padding_type): Don't error if buf->clear_in_mask is set.
            (clear_type_padding_in_mask): New function.
            (gimple_fold_builtin_clear_padding): Set buf.clear_in_mask to
false.
            * doc/extend.texi (__builtin_bit_cast): Document.

            * c-common.h (enum rid): Add RID_BUILTIN_BIT_CAST.
            * c-common.c (c_common_reswords): Add __builtin_bit_cast.

            * cp-tree.h (cp_build_bit_cast): Declare.
            * cp-tree.def (BIT_CAST_EXPR): New tree code.
            * cp-objcp-common.c (names_builtin_p): Handle RID_BUILTIN_BIT_CAST.
            (cp_common_init_ts): Handle BIT_CAST_EXPR.
            * cxx-pretty-print.c (cxx_pretty_printer::postfix_expression):
            Likewise.
            * parser.c (cp_parser_postfix_expression): Handle
            RID_BUILTIN_BIT_CAST.
            * semantics.c (cp_build_bit_cast): New function.
            * tree.c (cp_tree_equal): Handle BIT_CAST_EXPR.
            (cp_walk_subtrees): Likewise.
            * pt.c (tsubst_copy): Likewise.
            * constexpr.c (check_bit_cast_type, cxx_eval_bit_cast): New
functions.
            (cxx_eval_constant_expression): Handle BIT_CAST_EXPR.
            (potential_constant_expression_1): Likewise.
            * cp-gimplify.c (cp_genericize_r): Likewise.

            * g++.dg/cpp2a/bit-cast1.C: New test.
            * g++.dg/cpp2a/bit-cast2.C: New test.
            * g++.dg/cpp2a/bit-cast3.C: New test.
            * g++.dg/cpp2a/bit-cast4.C: New test.
            * g++.dg/cpp2a/bit-cast5.C: New test.

Reply via email to