Fix constant evaluation of zero-initialization of a union whose first

FieldDecl is an unamed bitfield.

Unnamed bitfields aren't non-static data member, so such a bitfield
isn't actually the first non-static data member.
This commit is contained in:
Richard Smith 2020-10-22 17:02:28 -07:00
parent 4abaf0ec0a
commit af189c8ab1
2 changed files with 10 additions and 0 deletions

View File

@ -9630,6 +9630,8 @@ bool RecordExprEvaluator::ZeroInitialization(const Expr *E, QualType T) {
// C++11 [dcl.init]p5: If T is a (possibly cv-qualified) union type, the
// object's first non-static named data member is zero-initialized
RecordDecl::field_iterator I = RD->field_begin();
while (I != RD->field_end() && (*I)->isUnnamedBitfield())
++I;
if (I == RD->field_end()) {
Result = APValue((const FieldDecl*)nullptr);
return true;

View File

@ -2021,6 +2021,14 @@ namespace Bitfields {
const HasUnnamedBitfield oneZero{1, 0};
int b = 1 / oneZero.b; // expected-warning {{division by zero is undefined}}
}
union UnionWithUnnamedBitfield {
int : 3;
int n;
};
static_assert(UnionWithUnnamedBitfield().n == 0, "");
static_assert(UnionWithUnnamedBitfield{}.n == 0, "");
static_assert(UnionWithUnnamedBitfield{1}.n == 1, "");
}
namespace ZeroSizeTypes {