From 77ec263e6025155850f117c934ae11eceaba5f3a Mon Sep 17 00:00:00 2001 From: Jonathan Coe Date: Tue, 2 Aug 2016 21:18:37 +0000 Subject: [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 --- .../SpecialMemberFunctionsCheck.cpp | 25 +++++++++++----------- 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp') 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 SMFS, llvm::StringRef AndOr) { +static std::string +join(ArrayRef 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(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 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 "); } } -- cgit v1.2.3