[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
This commit is contained in:
Miklos Vajna 2018-10-13 07:58:05 +00:00
parent 162435e7b5
commit abfccc2cf6
5 changed files with 34 additions and 2 deletions

View File

@ -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");

View File

@ -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

View File

@ -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.

View File

@ -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
};

View File

@ -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);
};