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

--- Comment #7 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-11 branch has been updated by Marek Polacek
<mpola...@gcc.gnu.org>:

https://gcc.gnu.org/g:e3fab19a79e3dc3cdf3e54ca20107e1dc15a3927

commit r11-9363-ge3fab19a79e3dc3cdf3e54ca20107e1dc15a3927
Author: Marek Polacek <pola...@redhat.com>
Date:   Sat Dec 4 12:07:41 2021 -0500

    c++: Fix for decltype and bit-fields [PR95009]

    Here, decltype deduces the wrong type for certain expressions involving
    bit-fields.  Unlike in C, in C++ bit-field width is explicitly not part
    of the type, so I think decltype should never deduce to 'int:N'.  The
    problem isn't that we're not calling unlowered_expr_type--we are--it's
    that is_bitfield_expr_with_lowered_type only handles certain codes, but
    not others.  For example, += works fine but ++ does not.

    This also fixes decltype-bitfield2.C where we were crashing (!), but
    unfortunately it does not fix 84516 or 70733 where the problem is likely
    a missing call to unlowered_expr_type.  It occurs to me now that typeof
    likely has had the same issue, but this patch should fix that too.

            PR c++/95009

    gcc/cp/ChangeLog:

            * typeck.c (is_bitfield_expr_with_lowered_type) <case MODIFY_EXPR>:
            Handle UNARY_PLUS_EXPR, NEGATE_EXPR, NON_LVALUE_EXPR, BIT_NOT_EXPR,
            P*CREMENT_EXPR too.

    gcc/testsuite/ChangeLog:

            * g++.dg/cpp0x/decltype-bitfield1.C: New test.
            * g++.dg/cpp0x/decltype-bitfield2.C: New test.

    (cherry picked from commit 3a2257e6b3fa288d6c50831987949b9ff7dfb865)

Reply via email to