Naysh created this revision. Naysh added reviewers: EricWF, JonasToth. Herald added subscribers: cfe-commits, xazax.hun, mgorny.
This patch adds an "Alias Free Headers" check, based off the guidelines at http://google.github.io/styleguide/cppguide.html#Aliases, to the abseil module. The purpose of the check is to eliminate using declarations from header files. Repository: rCTE Clang Tools Extra https://reviews.llvm.org/D55410 Files: clang-tidy/abseil/AbseilTidyModule.cpp clang-tidy/abseil/AliasFreeHeadersCheck.cpp clang-tidy/abseil/AliasFreeHeadersCheck.h clang-tidy/abseil/CMakeLists.txt docs/ReleaseNotes.rst docs/clang-tidy/checks/abseil-alias-free-headers.rst docs/clang-tidy/checks/list.rst test/clang-tidy/abseil-alias-free-headers.hpp
Index: test/clang-tidy/abseil-alias-free-headers.hpp =================================================================== --- /dev/null +++ test/clang-tidy/abseil-alias-free-headers.hpp @@ -0,0 +1,10 @@ +// RUN: %check_clang_tidy %s abseil-alias-free-headers %t + +namespace foo { + void f(); +} + +using foo::f; +// CHECK-MESSAGES: :[[@LINE-1]]:12: warning: convenience aliases in header files are dangerous: see http://google.github.io/styleguide/cppguide.html#Aliases [abseil-alias-free-headers] + +void other_function(); Index: docs/clang-tidy/checks/list.rst =================================================================== --- docs/clang-tidy/checks/list.rst +++ docs/clang-tidy/checks/list.rst @@ -4,14 +4,15 @@ ================= .. toctree:: + abseil-alias-free-headers abseil-duration-division abseil-duration-factory-float abseil-faster-strsplit-delimiter abseil-no-internal-dependencies abseil-no-namespace abseil-redundant-strcat-calls - abseil-string-find-startswith abseil-str-cat-append + abseil-string-find-startswith android-cloexec-accept android-cloexec-accept4 android-cloexec-creat @@ -151,6 +152,7 @@ hicpp-special-member-functions (redirects to cppcoreguidelines-special-member-functions) <hicpp-special-member-functions> hicpp-static-assert (redirects to misc-static-assert) <hicpp-static-assert> hicpp-undelegated-constructor (redirects to bugprone-undelegated-constructor) <hicpp-undelegated-constructor> + hicpp-uppercase-literal-suffix (redirects to readability-uppercase-literal-suffix) <hicpp-uppercase-literal-suffix> hicpp-use-auto (redirects to modernize-use-auto) <hicpp-use-auto> hicpp-use-emplace (redirects to modernize-use-emplace) <hicpp-use-emplace> hicpp-use-equals-default (redirects to modernize-use-equals-default) <hicpp-use-equals-default> @@ -159,7 +161,6 @@ hicpp-use-nullptr (redirects to modernize-use-nullptr) <hicpp-use-nullptr> hicpp-use-override (redirects to modernize-use-override) <hicpp-use-override> hicpp-vararg (redirects to cppcoreguidelines-pro-type-vararg) <hicpp-vararg> - hicpp-uppercase-literal-suffix (redirects to readability-uppercase-literal-suffix) <hicpp-uppercase-literal-suffix> llvm-header-guard llvm-include-order llvm-namespace-comment Index: docs/clang-tidy/checks/abseil-alias-free-headers.rst =================================================================== --- /dev/null +++ docs/clang-tidy/checks/abseil-alias-free-headers.rst @@ -0,0 +1,13 @@ +.. title:: clang-tidy - abseil-alias-free-headers + +abseil-alias-free-headers +========================= + +Flags using declarations in header files, and suggests that these aliases be removed. + +A using declaration placed in a header file forces users of that header file +accept the specified alias. Because of this, using declarations should almost never +be used in a header file + +The style guide http://google.github.io/styleguide/cppguide.html#Aliases discusses this +issue in more detail Index: docs/ReleaseNotes.rst =================================================================== --- docs/ReleaseNotes.rst +++ docs/ReleaseNotes.rst @@ -67,6 +67,12 @@ Improvements to clang-tidy -------------------------- +- New :doc:`abseil-alias-free-headers + <clang-tidy/checks/abseil-alias-free-headers>` check. + + Flags using declarations in header files, and suggests that + these aliases be removed + - New :doc:`abseil-duration-division <clang-tidy/checks/abseil-duration-division>` check. Index: clang-tidy/abseil/CMakeLists.txt =================================================================== --- clang-tidy/abseil/CMakeLists.txt +++ clang-tidy/abseil/CMakeLists.txt @@ -2,6 +2,7 @@ add_clang_library(clangTidyAbseilModule AbseilTidyModule.cpp + AliasFreeHeadersCheck.cpp DurationDivisionCheck.cpp DurationFactoryFloatCheck.cpp FasterStrsplitDelimiterCheck.cpp Index: clang-tidy/abseil/AliasFreeHeadersCheck.h =================================================================== --- /dev/null +++ clang-tidy/abseil/AliasFreeHeadersCheck.h @@ -0,0 +1,35 @@ +//===--- AliasFreeHeadersCheck.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_ALIASFREEHEADERSCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ABSEIL_ALIASFREEHEADERSCHECK_H + +#include "../ClangTidy.h" + +namespace clang { +namespace tidy { +namespace abseil { + +/// FIXME: Write a short description. +/// +/// For the user-facing documentation see: +/// http://clang.llvm.org/extra/clang-tidy/checks/abseil-alias-free-headers.html +class AliasFreeHeadersCheck : public ClangTidyCheck { +public: + AliasFreeHeadersCheck(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_ALIASFREEHEADERSCHECK_H Index: clang-tidy/abseil/AliasFreeHeadersCheck.cpp =================================================================== --- /dev/null +++ clang-tidy/abseil/AliasFreeHeadersCheck.cpp @@ -0,0 +1,34 @@ +//===--- AliasFreeHeadersCheck.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 "AliasFreeHeadersCheck.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { +namespace abseil { + +void AliasFreeHeadersCheck::registerMatchers(MatchFinder *Finder) { + // Match all using declarations in header files. + Finder->addMatcher(usingDecl(isExpansionInFileMatching(".*\\.h.*")).bind("x"), + this); +} + +void AliasFreeHeadersCheck::check(const MatchFinder::MatchResult &Result) { + const auto *MatchedDecl = Result.Nodes.getNodeAs<UsingDecl>("x"); + diag(MatchedDecl->getLocation(), "convenience aliases in header files are " + "dangerous: see http://google.github.io/styleguide/cppguide.html#Aliases"); +} + +} // namespace abseil +} // namespace tidy +} // namespace clang Index: clang-tidy/abseil/AbseilTidyModule.cpp =================================================================== --- clang-tidy/abseil/AbseilTidyModule.cpp +++ clang-tidy/abseil/AbseilTidyModule.cpp @@ -10,6 +10,7 @@ #include "../ClangTidy.h" #include "../ClangTidyModule.h" #include "../ClangTidyModuleRegistry.h" +#include "AliasFreeHeadersCheck.h" #include "DurationDivisionCheck.h" #include "DurationFactoryFloatCheck.h" #include "FasterStrsplitDelimiterCheck.h" @@ -26,6 +27,8 @@ class AbseilModule : public ClangTidyModule { public: void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { + CheckFactories.registerCheck<AliasFreeHeadersCheck>( + "abseil-alias-free-headers"); CheckFactories.registerCheck<DurationDivisionCheck>( "abseil-duration-division"); CheckFactories.registerCheck<DurationFactoryFloatCheck>(
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits