forked from OSchip/llvm-project
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:
parent
4abaf0ec0a
commit
af189c8ab1
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue