diff options
author | Jonathan Coe <jbcoe@me.com> | 2016-08-02 21:18:37 +0000 |
---|---|---|
committer | Jonathan Coe <jbcoe@me.com> | 2016-08-02 21:18:37 +0000 |
commit | 77ec263e6025155850f117c934ae11eceaba5f3a (patch) | |
tree | dfeb80312feeb81c156fbfcb9a37e38cd99b0ac0 /clang-tools-extra/clang-tidy/cppcoreguidelines | |
parent | 6eb1ca74165a4e17d4f0193e879e729170257e39 (diff) | |
download | bcm5719-llvm-77ec263e6025155850f117c934ae11eceaba5f3a.tar.gz bcm5719-llvm-77ec263e6025155850f117c934ae11eceaba5f3a.zip |
[clang-tidy] Fix segfault in cppcore-guidelines-special-member-functions check
Summary:
Use a set rather than a vector of defined special member functions so
that multiple declarations of the same function are only counted once.
Move some private static member functions into the cpp file.
Run clang-format on header.
Reviewers: ericLemanissier, Prazek, aaron.ballman
Subscribers: Prazek, cfe-commits, nemanjai
Projects: #clang-tools-extra
Differential Revision: https://reviews.llvm.org/D23008
llvm-svn: 277523
Diffstat (limited to 'clang-tools-extra/clang-tidy/cppcoreguidelines')
-rw-r--r-- | clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp | 25 | ||||
-rw-r--r-- | clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.h | 14 |
2 files changed, 18 insertions, 21 deletions
diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp index 9a0ffa97a86..5a487d54e81 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp @@ -43,25 +43,26 @@ void SpecialMemberFunctionsCheck::registerMatchers(MatchFinder *Finder) { this); } -llvm::StringRef SpecialMemberFunctionsCheck::toString( - SpecialMemberFunctionsCheck::SpecialMemberFunctionKind K) { +static llvm::StringRef +toString(SpecialMemberFunctionsCheck::SpecialMemberFunctionKind K) { switch (K) { - case SpecialMemberFunctionKind::Destructor: + case SpecialMemberFunctionsCheck::SpecialMemberFunctionKind::Destructor: return "a destructor"; - case SpecialMemberFunctionKind::CopyConstructor: + case SpecialMemberFunctionsCheck::SpecialMemberFunctionKind::CopyConstructor: return "a copy constructor"; - case SpecialMemberFunctionKind::CopyAssignment: + case SpecialMemberFunctionsCheck::SpecialMemberFunctionKind::CopyAssignment: return "a copy assignment operator"; - case SpecialMemberFunctionKind::MoveConstructor: + case SpecialMemberFunctionsCheck::SpecialMemberFunctionKind::MoveConstructor: return "a move constructor"; - case SpecialMemberFunctionKind::MoveAssignment: + case SpecialMemberFunctionsCheck::SpecialMemberFunctionKind::MoveAssignment: return "a move assignment operator"; } llvm_unreachable("Unhandled SpecialMemberFunctionKind"); } -std::string SpecialMemberFunctionsCheck::join( - llvm::ArrayRef<SpecialMemberFunctionKind> SMFS, llvm::StringRef AndOr) { +static std::string +join(ArrayRef<SpecialMemberFunctionsCheck::SpecialMemberFunctionKind> SMFS, + llvm::StringRef AndOr) { assert(!SMFS.empty() && "List of defined or undefined members should never be empty."); @@ -97,7 +98,7 @@ void SpecialMemberFunctionsCheck::check( for (const auto &KV : Matchers) if (Result.Nodes.getNodeAs<CXXMethodDecl>(KV.first)) - ClassWithSpecialMembers[ID].push_back(KV.second); + ClassWithSpecialMembers[ID].insert(KV.second); } void SpecialMemberFunctionsCheck::onEndOfTranslationUnit() { @@ -112,7 +113,7 @@ void SpecialMemberFunctionsCheck::onEndOfTranslationUnit() { } for (const auto &C : ClassWithSpecialMembers) { - ArrayRef<SpecialMemberFunctionKind> DefinedSpecialMembers = C.second; + const auto &DefinedSpecialMembers = C.second; if (DefinedSpecialMembers.size() == AllSpecialMembers.size()) continue; @@ -124,7 +125,7 @@ void SpecialMemberFunctionsCheck::onEndOfTranslationUnit() { std::back_inserter(UndefinedSpecialMembers)); diag(C.first.first, "class '%0' defines %1 but does not define %2") - << C.first.second << join(DefinedSpecialMembers, " and ") + << C.first.second << join(DefinedSpecialMembers.getArrayRef(), " and ") << join(UndefinedSpecialMembers, " or "); } } diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.h b/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.h index 508ce6411cf..227d3591cf0 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.h +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.h @@ -1,4 +1,4 @@ -//===--- SpecialMemberFunctionsCheck.h - clang-tidy-------------------*- C++ -*-===// +//===--- SpecialMemberFunctionsCheck.h - clang-tidy--------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -41,15 +41,11 @@ public: using ClassDefId = std::pair<SourceLocation, std::string>; - using ClassDefiningSpecialMembersMap = llvm::DenseMap<ClassDefId, llvm::SmallVector<SpecialMemberFunctionKind, 5>>; + using ClassDefiningSpecialMembersMap = + llvm::DenseMap<ClassDefId, + llvm::SmallSetVector<SpecialMemberFunctionKind, 5>>; private: - - static llvm::StringRef toString(SpecialMemberFunctionKind K); - - static std::string join(llvm::ArrayRef<SpecialMemberFunctionKind> SMFS, - llvm::StringRef AndOr); - ClassDefiningSpecialMembersMap ClassWithSpecialMembers; }; @@ -65,7 +61,7 @@ template <> struct DenseMapInfo< clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::ClassDefId> { using ClassDefId = - clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::ClassDefId; + clang::tidy::cppcoreguidelines::SpecialMemberFunctionsCheck::ClassDefId; static inline ClassDefId getEmptyKey() { return ClassDefId( |