Author: aaronballman Date: Fri Jan 8 09:50:51 2016 New Revision: 257177 URL: http://llvm.org/viewvc/llvm-project?rev=257177&view=rev Log: Disable part of the misc-move-constructor-init checker when the check is enabled through cert-oop11-cpp. The CERT guideline does not cover moveable parameters as part of the OOP11-CPP recommendation, just copy construction from move constructors.
Added: clang-tools-extra/trunk/test/clang-tidy/cert-oop11-cpp.cpp Modified: clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.cpp clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h clang-tools-extra/trunk/clang-tidy/misc/MoveConstructorInitCheck.cpp clang-tools-extra/trunk/clang-tidy/misc/MoveConstructorInitCheck.h Modified: clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.cpp?rev=257177&r1=257176&r2=257177&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.cpp Fri Jan 8 09:50:51 2016 @@ -233,6 +233,10 @@ GlobList &ClangTidyContext::getChecksFil return *CheckFilter; } +bool ClangTidyContext::isCheckEnabled(StringRef CheckName) const { + return CheckFilter->contains(CheckName); +} + /// \brief Store a \c ClangTidyError. void ClangTidyContext::storeError(const ClangTidyError &Error) { Errors.push_back(Error); Modified: clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h?rev=257177&r1=257176&r2=257177&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h (original) +++ clang-tools-extra/trunk/clang-tidy/ClangTidyDiagnosticConsumer.h Fri Jan 8 09:50:51 2016 @@ -161,6 +161,9 @@ public: /// The \c CurrentFile can be changed using \c setCurrentFile. GlobList &getChecksFilter(); + /// \brief Returns true if the check name is enabled for the \c CurrentFile. + bool isCheckEnabled(StringRef CheckName) const; + /// \brief Returns global options. const ClangTidyGlobalOptions &getGlobalOptions() const; Modified: clang-tools-extra/trunk/clang-tidy/misc/MoveConstructorInitCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/MoveConstructorInitCheck.cpp?rev=257177&r1=257176&r2=257177&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/misc/MoveConstructorInitCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/misc/MoveConstructorInitCheck.cpp Fri Jan 8 09:50:51 2016 @@ -42,7 +42,8 @@ MoveConstructorInitCheck::MoveConstructo ClangTidyContext *Context) : ClangTidyCheck(Name, Context), IncludeStyle(IncludeSorter::parseIncludeStyle( - Options.get("IncludeStyle", "llvm"))) {} + Options.get("IncludeStyle", "llvm"))), + UseCERTSemantics(Context->isCheckEnabled("cert-oop11-cpp")) {} void MoveConstructorInitCheck::registerMatchers(MatchFinder *Finder) { // Only register the matchers for C++11; the functionality currently does not @@ -67,21 +68,26 @@ void MoveConstructorInitCheck::registerM hasDeclaration(cxxRecordDecl(hasMethod(cxxConstructorDecl( isMoveConstructor(), unless(isDeleted()))))), matchers::isExpensiveToCopy())); - Finder->addMatcher( - cxxConstructorDecl( - allOf( - unless(isMoveConstructor()), - hasAnyConstructorInitializer(withInitializer(cxxConstructExpr( - hasDeclaration(cxxConstructorDecl(isCopyConstructor())), - hasArgument( - 0, declRefExpr( - to(parmVarDecl( - hasType( - NonConstValueMovableAndExpensiveToCopy)) - .bind("movable-param"))) - .bind("init-arg"))))))) - .bind("ctor-decl"), - this); + + // This checker is also used to implement cert-oop11-cpp, but when using that + // form of the checker, we do not want to diagnose movable parameters. + if (!UseCERTSemantics) + Finder->addMatcher( + cxxConstructorDecl( + allOf( + unless(isMoveConstructor()), + hasAnyConstructorInitializer(withInitializer(cxxConstructExpr( + hasDeclaration(cxxConstructorDecl(isCopyConstructor())), + hasArgument( + 0, + declRefExpr( + to(parmVarDecl( + hasType( + NonConstValueMovableAndExpensiveToCopy)) + .bind("movable-param"))) + .bind("init-arg"))))))) + .bind("ctor-decl"), + this); } void MoveConstructorInitCheck::check(const MatchFinder::MatchResult &Result) { Modified: clang-tools-extra/trunk/clang-tidy/misc/MoveConstructorInitCheck.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/MoveConstructorInitCheck.h?rev=257177&r1=257176&r2=257177&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/misc/MoveConstructorInitCheck.h (original) +++ clang-tools-extra/trunk/clang-tidy/misc/MoveConstructorInitCheck.h Fri Jan 8 09:50:51 2016 @@ -39,6 +39,7 @@ private: std::unique_ptr<IncludeInserter> Inserter; const IncludeSorter::IncludeStyle IncludeStyle; + const bool UseCERTSemantics; }; } // namespace tidy Added: clang-tools-extra/trunk/test/clang-tidy/cert-oop11-cpp.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/cert-oop11-cpp.cpp?rev=257177&view=auto ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/cert-oop11-cpp.cpp (added) +++ clang-tools-extra/trunk/test/clang-tidy/cert-oop11-cpp.cpp Fri Jan 8 09:50:51 2016 @@ -0,0 +1,21 @@ +// RUN: %check_clang_tidy %s cert-oop11-cpp %t -- -- -std=c++11 + +struct B { + B(B&&) noexcept = default; + + B(const B &) = default; + B& operator=(const B&) = default; + ~B() {} +}; + +struct D { + B b; + + // CHECK-MESSAGES: :[[@LINE+1]]:14: warning: move constructor initializes class member by calling a copy constructor [cert-oop11-cpp] + D(D &&d) : b(d.b) {} + + // This should not produce a diagnostic because it is not covered under + // the CERT guideline for OOP11-CPP. However, this will produce a diagnostic + // under misc-move-constructor-init. + D(B b) : b(b) {} +}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits