Index: clang-tools-extra/trunk/clang-tidy/readability/RedundantSmartptrGetCheck.h =================================================================== --- clang-tools-extra/trunk/clang-tidy/readability/RedundantSmartptrGetCheck.h +++ clang-tools-extra/trunk/clang-tidy/readability/RedundantSmartptrGetCheck.h @@ -28,9 +28,14 @@ class RedundantSmartptrGetCheck : public ClangTidyCheck { public: RedundantSmartptrGetCheck(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 readability Index: clang-tools-extra/trunk/clang-tidy/readability/RedundantSmartptrGetCheck.cpp =================================================================== --- clang-tools-extra/trunk/clang-tidy/readability/RedundantSmartptrGetCheck.cpp +++ clang-tools-extra/trunk/clang-tidy/readability/RedundantSmartptrGetCheck.cpp @@ -91,6 +91,11 @@ } // namespace +void RedundantSmartptrGetCheck::storeOptions( + ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "IgnoreMacros", IgnoreMacros); +} + void RedundantSmartptrGetCheck::registerMatchers(MatchFinder *Finder) { // Only register the matchers for C++; the functionality currently does not // provide any benefit to other languages, despite being benign. @@ -126,6 +131,9 @@ bool IsPtrToPtr = Result.Nodes.getNodeAs("ptr_to_ptr") != nullptr; bool IsMemberExpr = Result.Nodes.getNodeAs("memberExpr") != nullptr; const auto *GetCall = Result.Nodes.getNodeAs("redundant_get"); + if (GetCall->getBeginLoc().isMacroID() && IgnoreMacros) + return; + const auto *Smartptr = Result.Nodes.getNodeAs("smart_pointer"); if (IsPtrToPtr && IsMemberExpr) { Index: clang-tools-extra/trunk/docs/ReleaseNotes.rst =================================================================== --- clang-tools-extra/trunk/docs/ReleaseNotes.rst +++ clang-tools-extra/trunk/docs/ReleaseNotes.rst @@ -67,6 +67,10 @@ Improvements to clang-tidy -------------------------- +- The :doc:`readability-redundant-smartptr-get + ` check does not warn + about calls inside macros anymore by default. + - New :doc:`abseil-duration-division ` check. Index: clang-tools-extra/trunk/docs/clang-tidy/checks/readability-redundant-smartptr-get.rst =================================================================== --- clang-tools-extra/trunk/docs/clang-tidy/checks/readability-redundant-smartptr-get.rst +++ clang-tools-extra/trunk/docs/clang-tidy/checks/readability-redundant-smartptr-get.rst @@ -14,3 +14,8 @@ *ptr->get() ==> **ptr if (ptr.get() == nullptr) ... => if (ptr == nullptr) ... + +.. option:: IgnoreMacros + + If this option is set to non-zero (default is `1`), the check will not warn + about calls inside macros. Index: clang-tools-extra/trunk/test/clang-tidy/readability-redundant-smartptr-get-macros.cpp =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/readability-redundant-smartptr-get-macros.cpp +++ clang-tools-extra/trunk/test/clang-tidy/readability-redundant-smartptr-get-macros.cpp @@ -0,0 +1,24 @@ +// RUN: %check_clang_tidy %s readability-redundant-smartptr-get %t -- \ +// RUN: -config="{CheckOptions: [{key: readability-redundant-smartptr-get.IgnoreMacros, value: 0}]}" \ +// RUN: -- -std=c++11 + +namespace std { + +template +struct shared_ptr { + T &operator*() const; + T *operator->() const; + T *get() const; + explicit operator bool() const noexcept; +}; + +} // namespace std + +#define MACRO(p) p.get() + +void Positive() { + std::shared_ptr x; + if (MACRO(x) == nullptr) + ; + // CHECK-MESSAGES: :[[@LINE-2]]:13: warning: redundant get() call on smart pointer +}; Index: clang-tools-extra/trunk/test/clang-tidy/readability-redundant-smartptr-get.cpp =================================================================== --- clang-tools-extra/trunk/test/clang-tidy/readability-redundant-smartptr-get.cpp +++ clang-tools-extra/trunk/test/clang-tidy/readability-redundant-smartptr-get.cpp @@ -168,6 +168,8 @@ // CHECK-FIXES: if (NULL == x); } +#define MACRO(p) p.get() + void Negative() { struct NegPtr { int* get(); @@ -193,4 +195,7 @@ bool bb = ip.get() == nullptr; bb = !ip.get(); bb = ip.get() ? true : false; + std::unique_ptr x; + if (MACRO(x) == nullptr) + ; }