c++: Fix for decltype and bit-fields [PR95009]
commit3a2257e6b3fa288d6c50831987949b9ff7dfb865
authorMarek Polacek <polacek@redhat.com>
Sat, 4 Dec 2021 17:07:41 +0000 (4 12:07 -0500)
committerMarek Polacek <polacek@redhat.com>
Tue, 7 Dec 2021 13:26:25 +0000 (7 08:26 -0500)
tree90a5927585968e6fbe3f12a1432dbb6a8c7959f5
parent7ef68c37b3a46e69ed4a5ff6b2b368e2c9a8023f
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.
gcc/cp/typeck.c
gcc/testsuite/g++.dg/cpp0x/decltype-bitfield1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/decltype-bitfield2.C [new file with mode: 0644]