[PATCH] D53217: clang-tidy: add IgnoreMacros option to modernize-use-equals-delete

Miklos Vajna via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 12 14:19:57 PDT 2018


vmiklos created this revision.
vmiklos added reviewers: alexfh, malcolm.parsons.
Herald added a subscriber: cfe-commits.

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.


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D53217

Files:
  clang-tidy/modernize/UseEqualsDeleteCheck.cpp
  clang-tidy/modernize/UseEqualsDeleteCheck.h
  docs/clang-tidy/checks/modernize-use-equals-delete.rst
  test/clang-tidy/modernize-use-equals-delete-macros.cpp
  test/clang-tidy/modernize-use-equals-delete.cpp


Index: test/clang-tidy/modernize-use-equals-delete.cpp
===================================================================
--- test/clang-tidy/modernize-use-equals-delete.cpp
+++ test/clang-tidy/modernize-use-equals-delete.cpp
@@ -185,3 +185,9 @@
   DISALLOW_COPY_AND_ASSIGN(ProtectedDeletedMacro2);
 };
 
+// This resulted in a warning by default.
+#define MACRO(type) void operator=(type const &)
+class C {
+private:
+  MACRO(C);
+};
Index: test/clang-tidy/modernize-use-equals-delete-macros.cpp
===================================================================
--- /dev/null
+++ 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
+};
Index: docs/clang-tidy/checks/modernize-use-equals-delete.rst
===================================================================
--- docs/clang-tidy/checks/modernize-use-equals-delete.rst
+++ docs/clang-tidy/checks/modernize-use-equals-delete.rst
@@ -23,3 +23,8 @@
     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.
Index: clang-tidy/modernize/UseEqualsDeleteCheck.h
===================================================================
--- clang-tidy/modernize/UseEqualsDeleteCheck.h
+++ clang-tidy/modernize/UseEqualsDeleteCheck.h
@@ -38,9 +38,13 @@
 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
Index: clang-tidy/modernize/UseEqualsDeleteCheck.cpp
===================================================================
--- clang-tidy/modernize/UseEqualsDeleteCheck.cpp
+++ clang-tidy/modernize/UseEqualsDeleteCheck.cpp
@@ -21,6 +21,10 @@
 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 @@
     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 @@
     // 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");


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D53217.169490.patch
Type: text/x-patch
Size: 3799 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20181012/78006bb5/attachment.bin>


More information about the cfe-commits mailing list