[clang-tidy] Handle bitfields in cppcoreguidelines-pro-type-member-init if using C++2a

Summary:
C++2a allows bitfields to have default member initializers.
Add support for this to clang-tidy's cppcoreguidelines-pro-type-member-init check.

Reviewers: aaron.ballman, alexfh

Reviewed By: aaron.ballman

Subscribers: klimek, nemanjai, xazax.hun, kbarton, cfe-commits

Differential Revision: https://reviews.llvm.org/D42426

llvm-svn: 323227
This commit is contained in:
Malcolm Parsons 2018-01-23 17:13:57 +00:00
parent c068ff72c5
commit 6e4d53bc2b
3 changed files with 23 additions and 2 deletions

View File

@ -404,8 +404,9 @@ void ProTypeMemberInitCheck::checkMissingMemberInitializer(
return;
// Don't suggest fixes for enums because we don't know a good default.
// Don't suggest fixes for bitfields because in-class initialization is not
// possible.
if (F->getType()->isEnumeralType() || F->isBitField())
// possible until C++2a.
if (F->getType()->isEnumeralType() ||
(!getLangOpts().CPlusPlus2a && F->isBitField()))
return;
if (!F->getParent()->isUnion() || UnionsSeen.insert(F->getParent()).second)
FieldsToFix.insert(F);

View File

@ -0,0 +1,19 @@
// RUN: %check_clang_tidy %s cppcoreguidelines-pro-type-member-init %t -- -- -std=c++2a -fno-delayed-template-parsing
struct PositiveBitfieldMember {
PositiveBitfieldMember() {}
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructor does not initialize these fields: F
unsigned F : 5;
// CHECK-FIXES: unsigned F : 5{};
};
struct NegativeUnnamedBitfieldMember {
NegativeUnnamedBitfieldMember() {}
unsigned : 5;
};
struct NegativeInitializedBitfieldMembers {
NegativeInitializedBitfieldMembers() : F(3) { G = 2; }
unsigned F : 5;
unsigned G : 5;
};

View File

@ -474,6 +474,7 @@ struct PositiveBitfieldMember {
PositiveBitfieldMember() {}
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructor does not initialize these fields: F
unsigned F : 5;
// CHECK-FIXES-NOT: unsigned F : 5{};
};
struct NegativeUnnamedBitfieldMember {