Ywicheng updated this revision to Diff 194623. Ywicheng marked 2 inline comments as done.
CHANGES SINCE LAST ACTION https://reviews.llvm.org/D55411/new/ https://reviews.llvm.org/D55411 Files: clang-tidy/abseil/AbseilTidyModule.cpp clang-tidy/abseil/CMakeLists.txt clang-tidy/abseil/SafelyScopedCheck.cpp clang-tidy/abseil/SafelyScopedCheck.h docs/ReleaseNotes.rst docs/clang-tidy/checks/abseil-safely-scoped.rst docs/clang-tidy/checks/list.rst test/clang-tidy/abseil-safely-scoped.cpp
Index: test/clang-tidy/abseil-safely-scoped.cpp =================================================================== --- /dev/null +++ test/clang-tidy/abseil-safely-scoped.cpp @@ -0,0 +1,43 @@ +// RUN: %check_clang_tidy %s abseil-safely-scoped %t +namespace bar { + +class A {}; +class B {}; +} // namespace bar + +namespace foo1 { + +using bar::A; +void f(A a); + +namespace {} // anonymous namespace +} // namespace foo1 +// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: using declaration 'A' not +// declared in the innermost namespace. [abseil-safely-scoped] + +namespace foo2 { + +namespace { + +using ::bar::B; + +} // anonymous namespace +void g(B b); +} // namespace foo2 + + +// Check should not be triggered below when we are at +// function (instead of namespace) scope. +namespace outer { + + int fun_scope() { + using ::bar::A; + return 0; + } // function scope + + namespace inner { + + } // namespace inner + +} // namespace outer + Index: docs/clang-tidy/checks/list.rst =================================================================== --- docs/clang-tidy/checks/list.rst +++ docs/clang-tidy/checks/list.rst @@ -16,6 +16,7 @@ abseil-no-internal-dependencies abseil-no-namespace abseil-redundant-strcat-calls + abseil-safely-scoped abseil-str-cat-append abseil-string-find-startswith abseil-time-subtraction Index: docs/clang-tidy/checks/abseil-safely-scoped.rst =================================================================== --- /dev/null +++ docs/clang-tidy/checks/abseil-safely-scoped.rst @@ -0,0 +1,28 @@ +.. title:: clang-tidy - abseil-safely-scoped + +abseil-safely-scoped +==================== + +Flags using declarations that are not contained in an innermost +namespace, and suggests these declarations be moved elsewhere. + +Example: + +.. code-block:: c++ + + using something; // should be inside the innermost namespace bar below + + namespace foo { + namespace bar { + + } // bar + + using something_else; // shoulw be inside the innermost namespace bar above + + } // foo + +Placing convenience aliases in upper level namespaces can lead to ambiguity in +which name the compiler should use. + +See https://abseil.io/tips/119 for more explanation. + Index: docs/ReleaseNotes.rst =================================================================== --- docs/ReleaseNotes.rst +++ docs/ReleaseNotes.rst @@ -67,8 +67,15 @@ Improvements to clang-tidy -------------------------- +- New :doc:`abseil-safely-scoped + <clang-tidy/checks/abseil-safely-scoped>` check. + + Finds instances of using declarations not in the innermost layer + of a series of namespaces. + - New :doc:`abseil-duration-addition <clang-tidy/checks/abseil-duration-addition>` check. +>>>>>>> master Checks for cases where addition should be performed in the ``absl::Time`` domain. Index: clang-tidy/abseil/SafelyScopedCheck.h =================================================================== --- /dev/null +++ clang-tidy/abseil/SafelyScopedCheck.h @@ -0,0 +1,36 @@ +//===--- SafelyScopedCheck.h - clang-tidy -----------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ABSEIL_SAFELYSCOPEDCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ABSEIL_SAFELYSCOPEDCHECK_H + +#include "../ClangTidy.h" + +namespace clang { +namespace tidy { +namespace abseil { + +/// Detecting using declarations not in a namespace declaration or not in +/// the innermost layer of namespace declarations. +/// +/// For the user-facing documentation see: +/// http://clang.llvm.org/extra/clang-tidy/checks/abseil-safely-scoped.html +class SafelyScopedCheck : public ClangTidyCheck { +public: + SafelyScopedCheck(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context) {} + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; +}; + +} // namespace abseil +} // namespace tidy +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ABSEIL_SAFELYSCOPEDCHECK_H Index: clang-tidy/abseil/SafelyScopedCheck.cpp =================================================================== --- /dev/null +++ clang-tidy/abseil/SafelyScopedCheck.cpp @@ -0,0 +1,43 @@ +//===--- SafelyScopedCheck.cpp - clang-tidy -------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "SafelyScopedCheck.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { +namespace abseil { + +void SafelyScopedCheck::registerMatchers(MatchFinder *Finder) { + // The target using declaration is either: + // 1. not in any scope, or + // 2. in some namespace declaration but not in the innermost layer + Finder->addMatcher( + usingDecl( + eachOf(allOf(usingDecl(unless(hasAncestor(functionDecl()))), + usingDecl(unless(hasAncestor(cxxRecordDecl()))), + usingDecl(unless(hasAncestor(namespaceDecl())))), + usingDecl(hasParent(namespaceDecl(forEach(namespaceDecl())))))) + .bind("use"), + this); +} + +void SafelyScopedCheck::check(const MatchFinder::MatchResult &Result) { + const auto *MatchedDecl = Result.Nodes.getNodeAs<UsingDecl>("use"); + diag(MatchedDecl->getLocation(), + "using declaration %0 not declared in the innermost namespace.") + << MatchedDecl; +} + +} // namespace abseil +} // namespace tidy +} // namespace clang Index: clang-tidy/abseil/CMakeLists.txt =================================================================== --- clang-tidy/abseil/CMakeLists.txt +++ clang-tidy/abseil/CMakeLists.txt @@ -15,6 +15,7 @@ NoInternalDependenciesCheck.cpp NoNamespaceCheck.cpp RedundantStrcatCallsCheck.cpp + SafelyScopedCheck.cpp StrCatAppendCheck.cpp StringFindStartswithCheck.cpp TimeSubtractionCheck.cpp Index: clang-tidy/abseil/AbseilTidyModule.cpp =================================================================== --- clang-tidy/abseil/AbseilTidyModule.cpp +++ clang-tidy/abseil/AbseilTidyModule.cpp @@ -21,6 +21,7 @@ #include "NoInternalDependenciesCheck.h" #include "NoNamespaceCheck.h" #include "RedundantStrcatCallsCheck.h" +#include "SafelyScopedCheck.h" #include "StringFindStartswithCheck.h" #include "StrCatAppendCheck.h" #include "TimeSubtractionCheck.h" @@ -56,6 +57,8 @@ CheckFactories.registerCheck<NoNamespaceCheck>("abseil-no-namespace"); CheckFactories.registerCheck<RedundantStrcatCallsCheck>( "abseil-redundant-strcat-calls"); + CheckFactories.registerCheck<SafelyScopedCheck>( + "abseil-safely-scoped"); CheckFactories.registerCheck<StrCatAppendCheck>( "abseil-str-cat-append"); CheckFactories.registerCheck<StringFindStartswithCheck>(
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits