[PATCH] D107641: [clang-tidy] fix duplicate '{}' in cppcoreguidelines-pro-type-member-init
gehry via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 11 23:24:52 PDT 2021
Sockke updated this revision to Diff 365916.
Sockke added a comment.
update! @aaron.ballman @MTC
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D107641/new/
https://reviews.llvm.org/D107641
Files:
clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp
clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.h
clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-member-init.cpp
Index: clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-member-init.cpp
===================================================================
--- clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-member-init.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-member-init.cpp
@@ -208,9 +208,8 @@
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 {
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.h
===================================================================
--- clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.h
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.h
@@ -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 @@
// 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
Index: clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp
+++ clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeMemberInitCheck.cpp
@@ -433,17 +433,25 @@
[&](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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D107641.365916.patch
Type: text/x-patch
Size: 3069 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210812/c72b2af9/attachment-0001.bin>
More information about the cfe-commits
mailing list