[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:
liuke 2021-08-14 10:47:27 +08:00 committed by wangliushuai
parent 2af4db7d5c
commit 1f2d40c47f
3 changed files with 18 additions and 6 deletions

View File

@ -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.

View File

@ -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

View File

@ -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 {