From 883ebacd7885be5299e171da2e46e278c13bf671 Mon Sep 17 00:00:00 2001 From: Malcolm Parsons Date: Tue, 1 Nov 2016 21:26:53 +0000 Subject: [PATCH] [clang-tidy] Handle bitfields in cppcoreguidelines-pro-type-member-init Summary: Unnamed bitfields cannot be initialized. Bitfields cannot be in-class initialized. Reviewers: alexfh, hokein, aaron.ballman Subscribers: Prazek, nemanjai, cfe-commits Differential Revision: https://reviews.llvm.org/D26119 llvm-svn: 285752 --- .../ProTypeMemberInitCheck.cpp | 6 ++++-- .../cppcoreguidelines-pro-type-member-init.cpp | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp index 272e2dad1bef..a5c26482e4d6 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp @@ -358,7 +358,7 @@ void ProTypeMemberInitCheck::checkMissingMemberInitializer( if (!F->hasInClassInitializer() && utils::type_traits::isTriviallyDefaultConstructible(F->getType(), Context) && - !isEmpty(Context, F->getType())) + !isEmpty(Context, F->getType()) && !F->isUnnamedBitfield()) FieldsToInit.insert(F); }); if (FieldsToInit.empty()) @@ -407,7 +407,9 @@ void ProTypeMemberInitCheck::checkMissingMemberInitializer( SmallPtrSet FieldsToFix; forEachField(ClassDecl, FieldsToInit, true, [&](const FieldDecl *F) { // Don't suggest fixes for enums because we don't know a good default. - if (!F->getType()->isEnumeralType()) + // Don't suggest fixes for bitfields because in-class initialization is not + // possible. + if (!F->getType()->isEnumeralType() && !F->isBitField()) FieldsToFix.insert(F); }); if (FieldsToFix.empty()) diff --git a/clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-type-member-init.cpp b/clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-type-member-init.cpp index c287c5c4eace..08481a8918c6 100644 --- a/clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-type-member-init.cpp +++ b/clang-tools-extra/test/clang-tidy/cppcoreguidelines-pro-type-member-init.cpp @@ -456,3 +456,20 @@ template class NoCrash { template B(U u) {} }; }; + +struct PositiveBitfieldMember { + PositiveBitfieldMember() {} + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructor does not initialize these fields: F + unsigned F : 5; +}; + +struct NegativeUnnamedBitfieldMember { + NegativeUnnamedBitfieldMember() {} + unsigned : 5; +}; + +struct NegativeInitializedBitfieldMembers { + NegativeInitializedBitfieldMembers() : F(3) { G = 2; } + unsigned F : 5; + unsigned G : 5; +};