From abfccc2cf69459efe189d31f330e4e8164a40ba5 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Sat, 13 Oct 2018 07:58:05 +0000 Subject: [PATCH] [clang-tidy] add IgnoreMacros option to modernize-use-equals-delete And also enable it by default to be consistent with e.g. modernize-use-using. This improves consistency inside the check itself as well: both checks are now disabled in macros by default. This helps e.g. when running this check on client code where the macro is provided by the system, so there is no easy way to modify it. Reviewed By: alexfh Differential Revision: https://reviews.llvm.org/D53217 llvm-svn: 344440 --- .../clang-tidy/modernize/UseEqualsDeleteCheck.cpp | 8 +++++++- clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.h | 7 ++++++- .../docs/clang-tidy/checks/modernize-use-equals-delete.rst | 5 +++++ .../test/clang-tidy/modernize-use-equals-delete-macros.cpp | 10 ++++++++++ .../test/clang-tidy/modernize-use-equals-delete.cpp | 6 ++++++ 5 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 clang-tools-extra/test/clang-tidy/modernize-use-equals-delete-macros.cpp diff --git a/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.cpp index f5adb13..fc8425d 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.cpp @@ -21,6 +21,10 @@ namespace modernize { static const char SpecialFunction[] = "SpecialFunction"; static const char DeletedNotPublic[] = "DeletedNotPublic"; +void UseEqualsDeleteCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "IgnoreMacros", IgnoreMacros); +} + void UseEqualsDeleteCheck::registerMatchers(MatchFinder *Finder) { if (!getLangOpts().CPlusPlus) return; @@ -57,6 +61,8 @@ void UseEqualsDeleteCheck::check(const MatchFinder::MatchResult &Result) { SourceLocation EndLoc = Lexer::getLocForEndOfToken( Func->getEndLoc(), 0, *Result.SourceManager, getLangOpts()); + if (Func->getLocation().isMacroID() && IgnoreMacros) + return; // FIXME: Improve FixItHint to make the method public. diag(Func->getLocation(), "use '= delete' to prohibit calling of a special member function") @@ -66,7 +72,7 @@ void UseEqualsDeleteCheck::check(const MatchFinder::MatchResult &Result) { // Ignore this warning in macros, since it's extremely noisy in code using // DISALLOW_COPY_AND_ASSIGN-style macros and there's no easy way to // automatically fix the warning when macros are in play. - if (Func->getLocation().isMacroID()) + if (Func->getLocation().isMacroID() && IgnoreMacros) return; // FIXME: Add FixItHint to make the method public. diag(Func->getLocation(), "deleted member function should be public"); diff --git a/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.h b/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.h index 1daa1a8..716f045 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.h @@ -38,9 +38,14 @@ namespace modernize { class UseEqualsDeleteCheck : public ClangTidyCheck { public: UseEqualsDeleteCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context) {} + : ClangTidyCheck(Name, Context), + IgnoreMacros(Options.getLocalOrGlobal("IgnoreMacros", 1) != 0) {} + void storeOptions(ClangTidyOptions::OptionMap &Opts) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; + +private: + const bool IgnoreMacros; }; } // namespace modernize diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize-use-equals-delete.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize-use-equals-delete.rst index bfa54e4..f47826f 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/modernize-use-equals-delete.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/modernize-use-equals-delete.rst @@ -23,3 +23,8 @@ all other member functions implemented. A& operator=(const A&) = delete; }; + +.. option:: IgnoreMacros + + If this option is set to non-zero (default is `1`), the check will not warn + about functions declared inside macros. diff --git a/clang-tools-extra/test/clang-tidy/modernize-use-equals-delete-macros.cpp b/clang-tools-extra/test/clang-tidy/modernize-use-equals-delete-macros.cpp new file mode 100644 index 0000000..1b5a89c --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/modernize-use-equals-delete-macros.cpp @@ -0,0 +1,10 @@ +// RUN: %check_clang_tidy %s modernize-use-equals-delete %t -- \ +// RUN: -config="{CheckOptions: [{key: modernize-use-equals-delete.IgnoreMacros, value: 0}]}" \ +// RUN: -- -std=c++11 + +#define MACRO(type) void operator=(type const &) +class C { +private: + MACRO(C); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use '= delete' to prohibit calling of a special member function +}; diff --git a/clang-tools-extra/test/clang-tidy/modernize-use-equals-delete.cpp b/clang-tools-extra/test/clang-tidy/modernize-use-equals-delete.cpp index 6ab2ae4..988c8e5 100644 --- a/clang-tools-extra/test/clang-tidy/modernize-use-equals-delete.cpp +++ b/clang-tools-extra/test/clang-tidy/modernize-use-equals-delete.cpp @@ -185,3 +185,9 @@ protected: DISALLOW_COPY_AND_ASSIGN(ProtectedDeletedMacro2); }; +// This resulted in a warning by default. +#define MACRO(type) void operator=(type const &) +class C { +private: + MACRO(C); +}; -- 2.7.4