forked from OSchip/llvm-project
[clang-tidy] fix duplicate '{}' in cppcoreguidelines-pro-type-member-init
The overload of the constructor will repeatedly fix the member variables that need to be initialized. Removed the duplicate '{}'. ``` struct A { A() {} A(int) {} int _var; // int _var{}{}; <-- wrong fix }; ``` Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D107641
This commit is contained in:
parent
2af4db7d5c
commit
1f2d40c47f
|
@ -433,17 +433,25 @@ void ProTypeMemberInitCheck::checkMissingMemberInitializer(
|
|||
[&](const FieldDecl *F) { OrderedFields.push_back(F); });
|
||||
|
||||
// Collect all the fields we need to initialize, including indirect fields.
|
||||
// It only includes fields that have not been fixed
|
||||
SmallPtrSet<const FieldDecl *, 16> AllFieldsToInit;
|
||||
forEachField(ClassDecl, FieldsToInit,
|
||||
[&](const FieldDecl *F) { AllFieldsToInit.insert(F); });
|
||||
if (AllFieldsToInit.empty())
|
||||
forEachField(ClassDecl, FieldsToInit, [&](const FieldDecl *F) {
|
||||
if (!HasRecordClassMemberSet.contains(F)) {
|
||||
AllFieldsToInit.insert(F);
|
||||
HasRecordClassMemberSet.insert(F);
|
||||
}
|
||||
});
|
||||
if (FieldsToInit.empty())
|
||||
return;
|
||||
|
||||
DiagnosticBuilder Diag =
|
||||
diag(Ctor ? Ctor->getBeginLoc() : ClassDecl.getLocation(),
|
||||
"%select{|union }0constructor %select{does not|should}0 initialize "
|
||||
"%select{|one of }0these fields: %1")
|
||||
<< IsUnion << toCommaSeparatedString(OrderedFields, AllFieldsToInit);
|
||||
<< IsUnion << toCommaSeparatedString(OrderedFields, FieldsToInit);
|
||||
|
||||
if (AllFieldsToInit.empty())
|
||||
return;
|
||||
|
||||
// Do not propose fixes for constructors in macros since we cannot place them
|
||||
// correctly.
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_CPPCOREGUIDELINES_PRO_TYPE_MEMBER_INIT_H
|
||||
|
||||
#include "../ClangTidyCheck.h"
|
||||
#include "llvm/ADT/DenseSet.h"
|
||||
|
||||
namespace clang {
|
||||
namespace tidy {
|
||||
|
@ -72,6 +73,10 @@ private:
|
|||
// instead of brace initialization. Only effective in C++11 mode. Default is
|
||||
// false.
|
||||
bool UseAssignment;
|
||||
|
||||
// Record the member variables that have been initialized to prevent repeated
|
||||
// initialization.
|
||||
llvm::DenseSet<const FieldDecl *> HasRecordClassMemberSet;
|
||||
};
|
||||
|
||||
} // namespace cppcoreguidelines
|
||||
|
|
|
@ -208,9 +208,8 @@ struct PositiveMultipleConstructors {
|
|||
PositiveMultipleConstructors(const PositiveMultipleConstructors &) {}
|
||||
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: constructor does not initialize these fields: A, B
|
||||
|
||||
// FIXME: The fix-its here collide providing an erroneous fix
|
||||
int A, B;
|
||||
// CHECK-FIXES: int A{}{}{}, B{}{}{};
|
||||
// CHECK-FIXES: int A{}, B{};
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
|
|
Loading…
Reference in New Issue