Index: clang-tidy/ClangTidy.cpp =================================================================== --- clang-tidy/ClangTidy.cpp +++ clang-tidy/ClangTidy.cpp @@ -42,6 +42,9 @@ #include #include + +#include "llvm/ADT/StringExtras.h" + using namespace clang::ast_matchers; using namespace clang::driver; using namespace clang::tooling; @@ -376,6 +379,20 @@ std::vector *Errors, ProfileData *Profile) { ClangTool Tool(Compilations, InputFiles); clang::tidy::ClangTidyContext Context(std::move(OptionsProvider)); + ArgumentsAdjuster PerFileExtraArgumentsInserter = [&Context]( + const CommandLineArguments &Args, StringRef Filename) { + Context.setCurrentFile(Filename); + const ClangTidyOptions &Opts = Context.getOptions(); + CommandLineArguments AdjustedArgs; + if (Opts.ExtraArgsBefore) + AdjustedArgs = *Opts.ExtraArgsBefore; + AdjustedArgs.insert(AdjustedArgs.begin(), Args.begin(), Args.end()); + if (Opts.ExtraArgs) + AdjustedArgs.insert(AdjustedArgs.end(), Opts.ExtraArgs->begin(), + Opts.ExtraArgs->end()); + return AdjustedArgs; + }; + Tool.appendArgumentsAdjuster(PerFileExtraArgumentsInserter); if (Profile) Context.setCheckProfileData(Profile); Index: clang-tidy/ClangTidyOptions.h =================================================================== --- clang-tidy/ClangTidyOptions.h +++ clang-tidy/ClangTidyOptions.h @@ -83,6 +83,14 @@ /// \brief Key-value mapping used to store check-specific options. OptionMap CheckOptions; + + typedef std::vector ArgList; + + /// \brief Add extra compilation arguments to the end of the list. + llvm::Optional ExtraArgs; + + /// \brief Add extra compilation arguments to the start of the list. + llvm::Optional ExtraArgsBefore; }; /// \brief Abstract interface for retrieving various ClangTidy options. Index: clang-tidy/ClangTidyOptions.cpp =================================================================== --- clang-tidy/ClangTidyOptions.cpp +++ clang-tidy/ClangTidyOptions.cpp @@ -27,6 +27,7 @@ LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(FileFilter) LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(FileFilter::LineRange) LLVM_YAML_IS_SEQUENCE_VECTOR(ClangTidyOptions::StringPair) +LLVM_YAML_IS_SEQUENCE_VECTOR(std::string) namespace llvm { namespace yaml { @@ -88,6 +89,8 @@ IO.mapOptional("AnalyzeTemporaryDtors", Options.AnalyzeTemporaryDtors); IO.mapOptional("User", Options.User); IO.mapOptional("CheckOptions", NOpts->Options); + IO.mapOptional("ExtraArgs", Options.ExtraArgs); + IO.mapOptional("ExtraArgsBefore", Options.ExtraArgsBefore); } }; @@ -129,6 +132,10 @@ Result.AnalyzeTemporaryDtors = Other.AnalyzeTemporaryDtors; if (Other.User) Result.User = Other.User; + if (Other.ExtraArgs) + Result.ExtraArgs = Other.ExtraArgs; + if (Other.ExtraArgsBefore) + Result.ExtraArgsBefore = Other.ExtraArgsBefore; for (const auto &KeyValue : Other.CheckOptions) Result.CheckOptions[KeyValue.first] = KeyValue.second; Index: modularize/Modularize.cpp =================================================================== --- modularize/Modularize.cpp +++ modularize/Modularize.cpp @@ -356,7 +356,8 @@ // if no other "-x" option is present. static ArgumentsAdjuster getModularizeArgumentsAdjuster(DependencyMap &Dependencies) { - return [&Dependencies](const CommandLineArguments &Args) { + return [&Dependencies](const CommandLineArguments &Args, + StringRef /*unused*/) { std::string InputFile = findInputFile(Args); DependentsVector &FileDependents = Dependencies[InputFile]; CommandLineArguments NewArgs(Args); Index: test/clang-tidy/custom-diagnostics.cpp =================================================================== --- /dev/null +++ test/clang-tidy/custom-diagnostics.cpp @@ -0,0 +1,10 @@ +// RUN: clang-tidy -checks='-*,modernize-use-override,clang-diagnostic-shadow' %s -- | count 0 +// RUN: clang-tidy -checks='-*,modernize-use-override,clang-diagnostic-shadow' \ +// RUN: -config='{ExtraArgs: ["-Wshadow"]}' %s -- \ +// RUN: | FileCheck -implicit-check-not='{{warning:|error:}}' %s + +void f() { + int a; + { int a; } + // CHECK: :[[@LINE-1]]:9: warning: declaration shadows a local variable [clang-diagnostic-shadow] +}