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( + "abseil-alias-free-headers"); CheckFactories.registerCheck( "abseil-duration-division"); CheckFactories.registerCheck( 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("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/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: docs/ReleaseNotes.rst =================================================================== --- docs/ReleaseNotes.rst +++ docs/ReleaseNotes.rst @@ -67,6 +67,12 @@ Improvements to clang-tidy -------------------------- +- New :doc:`abseil-alias-free-headers + ` check. + + Flags using declarations in header files, and suggests that + these aliases be removed + - New :doc:`abseil-duration-division ` check. 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/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-static-assert (redirects to misc-static-assert) hicpp-undelegated-constructor (redirects to bugprone-undelegated-constructor) + hicpp-uppercase-literal-suffix (redirects to readability-uppercase-literal-suffix) hicpp-use-auto (redirects to modernize-use-auto) hicpp-use-emplace (redirects to modernize-use-emplace) hicpp-use-equals-default (redirects to modernize-use-equals-default) @@ -159,7 +161,6 @@ hicpp-use-nullptr (redirects to modernize-use-nullptr) hicpp-use-override (redirects to modernize-use-override) hicpp-vararg (redirects to cppcoreguidelines-pro-type-vararg) - hicpp-uppercase-literal-suffix (redirects to readability-uppercase-literal-suffix) llvm-header-guard llvm-include-order llvm-namespace-comment 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();