Index: clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.h =================================================================== --- clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.h +++ clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.h @@ -1,4 +1,4 @@ -//===--- SpecialMemberFunctionsCheck.h - clang-tidy-------------------*- C++ -*-===// +//===--- SpecialMemberFunctionsCheck.h - clang-tidy--------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -30,7 +30,7 @@ void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; void onEndOfTranslationUnit() override; - + enum class SpecialMemberFunctionKind { Destructor, CopyConstructor, @@ -41,15 +41,11 @@ using ClassDefId = std::pair; - using ClassDefiningSpecialMembersMap = llvm::DenseMap>; + using ClassDefiningSpecialMembersMap = + llvm::DenseMap>; private: - - static llvm::StringRef toString(SpecialMemberFunctionKind K); - - static std::string join(llvm::ArrayRef SMFS, - llvm::StringRef AndOr); - ClassDefiningSpecialMembersMap ClassWithSpecialMembers; }; @@ -60,12 +56,12 @@ namespace llvm { /// Specialisation of DenseMapInfo to allow ClassDefId objects in DenseMaps /// FIXME: Move this to the corresponding cpp file as is done for -/// clang-tidy/readability/IdentifierNamingCheck.cpp. +/// clang-tidy/readability/IdentifierNamingCheck.cpp. 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( Index: clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp =================================================================== --- clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp +++ clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp @@ -43,25 +43,25 @@ 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 SMFS, llvm::StringRef AndOr) { +template +static std::string join(const R &SMFS, llvm::StringRef AndOr) { assert(!SMFS.empty() && "List of defined or undefined members should never be empty."); @@ -97,7 +97,7 @@ for (const auto &KV : Matchers) if (Result.Nodes.getNodeAs(KV.first)) - ClassWithSpecialMembers[ID].push_back(KV.second); + ClassWithSpecialMembers[ID].insert(KV.second); } void SpecialMemberFunctionsCheck::onEndOfTranslationUnit() { @@ -112,7 +112,7 @@ } for (const auto &C : ClassWithSpecialMembers) { - ArrayRef DefinedSpecialMembers = C.second; + const auto &DefinedSpecialMembers = C.second; if (DefinedSpecialMembers.size() == AllSpecialMembers.size()) continue;