Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,9 @@ bool FindUninitializedFields::isNonUnionUninit(const TypedValueRegion *R,

// Are all of this non-union's fields initialized?
for (const FieldDecl *I : RD->fields()) {

if (I->isUnnamedBitField()) {
continue;
}
const auto FieldVal =
State->getLValue(I, loc::MemRegionVal(R)).castAs<loc::MemRegionVal>();
const auto *FR = FieldVal.getRegionAs<FieldRegion>();
Expand Down
21 changes: 21 additions & 0 deletions clang/test/Analysis/cxx-uninitialized-object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1182,3 +1182,24 @@ void fComplexTest() {
// TODO: we should emit a warning for x2.x and x2.y.
ComplexUninitTest x2;
}

struct PaddingBitfieldTest {
int a;
long long : 7; // padding, previously flagged as uninitialized
PaddingBitfieldTest(int a) : a(a) {}
};

void fPaddingBitfieldTest() {
PaddingBitfieldTest pb(42);
// no-warning: Unnamed bitfield is now ignored, fixing false positive
}

struct NamedBitfieldTest {
int b;
long long named : 7; // expected-note{{uninitialized field 'this->named'}}
NamedBitfieldTest(int b) : b(b) {} // expected-warning{{1 uninitialized field at the end of the constructor call}}
};

void fNamedBitfieldTest() {
NamedBitfieldTest nb(42);
}