Author: hokein Date: Wed Apr 18 01:54:28 2018 New Revision: 330245 URL: http://llvm.org/viewvc/llvm-project?rev=330245&view=rev Log: [clang-tidy] Fix clang-tidy doesn't read .clangtidy configuration file.
Summary: Fix https://bugs.llvm.org/show_bug.cgi?id=34900. Reviewers: alexfh Reviewed By: alexfh Subscribers: JonasToth, klimek, xazax.hun, cfe-commits Differential Revision: https://reviews.llvm.org/D45697 Added: clang-tools-extra/trunk/test/clang-tidy/read_file_config.cpp Modified: clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.cpp clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.h clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp Modified: clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.cpp?rev=330245&r1=330244&r2=330245&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.cpp Wed Apr 18 01:54:28 2018 @@ -204,9 +204,12 @@ ConfigOptionsProvider::getRawOptions(llv FileOptionsProvider::FileOptionsProvider( const ClangTidyGlobalOptions &GlobalOptions, const ClangTidyOptions &DefaultOptions, - const ClangTidyOptions &OverrideOptions) + const ClangTidyOptions &OverrideOptions, + llvm::IntrusiveRefCntPtr<vfs::FileSystem> VFS) : DefaultOptionsProvider(GlobalOptions, DefaultOptions), - OverrideOptions(OverrideOptions) { + OverrideOptions(OverrideOptions), FS(std::move(VFS)) { + if (!FS) + FS = vfs::getRealFileSystem(); ConfigHandlers.emplace_back(".clang-tidy", parseConfiguration); } @@ -224,14 +227,19 @@ FileOptionsProvider::FileOptionsProvider std::vector<OptionsSource> FileOptionsProvider::getRawOptions(StringRef FileName) { DEBUG(llvm::dbgs() << "Getting options for file " << FileName << "...\n"); + assert(FS && "FS must be set."); + + llvm::SmallString<128> AbsoluteFilePath(FileName); + if (std::error_code ec = FS->makeAbsolute(AbsoluteFilePath)) + return {}; std::vector<OptionsSource> RawOptions = - DefaultOptionsProvider::getRawOptions(FileName); + DefaultOptionsProvider::getRawOptions(AbsoluteFilePath.str()); OptionsSource CommandLineOptions(OverrideOptions, OptionsSourceTypeCheckCommandLineOption); // Look for a suitable configuration file in all parent directories of the // file. Start with the immediate parent directory and move up. - StringRef Path = llvm::sys::path::parent_path(FileName); + StringRef Path = llvm::sys::path::parent_path(AbsoluteFilePath.str()); for (StringRef CurrentPath = Path; !CurrentPath.empty(); CurrentPath = llvm::sys::path::parent_path(CurrentPath)) { llvm::Optional<OptionsSource> Result; Modified: clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.h?rev=330245&r1=330244&r2=330245&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.h (original) +++ clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.h Wed Apr 18 01:54:28 2018 @@ -13,7 +13,9 @@ #include "llvm/ADT/Optional.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/IntrusiveRefCntPtr.h" #include "llvm/Support/ErrorOr.h" +#include "clang/Basic/VirtualFileSystem.h" #include <functional> #include <map> #include <string> @@ -221,7 +223,8 @@ public: /// whatever options are read from the configuration file. FileOptionsProvider(const ClangTidyGlobalOptions &GlobalOptions, const ClangTidyOptions &DefaultOptions, - const ClangTidyOptions &OverrideOptions); + const ClangTidyOptions &OverrideOptions, + llvm::IntrusiveRefCntPtr<vfs::FileSystem> FS = nullptr); /// \brief Initializes the \c FileOptionsProvider instance with a custom set /// of configuration file handlers. @@ -255,6 +258,7 @@ protected: llvm::StringMap<OptionsSource> CachedOptions; ClangTidyOptions OverrideOptions; ConfigFileHandlers ConfigHandlers; + llvm::IntrusiveRefCntPtr<vfs::FileSystem> FS; }; /// \brief Parses LineFilter from JSON and stores it to the \p Options. Modified: clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp?rev=330245&r1=330244&r2=330245&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp Wed Apr 18 01:54:28 2018 @@ -286,7 +286,8 @@ static void printProfileData(const Profi OS.flush(); } -static std::unique_ptr<ClangTidyOptionsProvider> createOptionsProvider() { +static std::unique_ptr<ClangTidyOptionsProvider> createOptionsProvider( + llvm::IntrusiveRefCntPtr<vfs::FileSystem> FS) { ClangTidyGlobalOptions GlobalOptions; if (std::error_code Err = parseLineFilter(LineFilter, GlobalOptions)) { llvm::errs() << "Invalid LineFilter: " << Err.message() << "\n\nUsage:\n"; @@ -334,7 +335,7 @@ static std::unique_ptr<ClangTidyOptionsP } } return llvm::make_unique<FileOptionsProvider>(GlobalOptions, DefaultOptions, - OverrideOptions); + OverrideOptions, std::move(FS)); } llvm::IntrusiveRefCntPtr<vfs::FileSystem> @@ -364,8 +365,13 @@ getVfsOverlayFromFile(const std::string static int clangTidyMain(int argc, const char **argv) { CommonOptionsParser OptionsParser(argc, argv, ClangTidyCategory, cl::ZeroOrMore); + llvm::IntrusiveRefCntPtr<vfs::FileSystem> BaseFS( + VfsOverlay.empty() ? vfs::getRealFileSystem() + : getVfsOverlayFromFile(VfsOverlay)); + if (!BaseFS) + return 1; - auto OwningOptionsProvider = createOptionsProvider(); + auto OwningOptionsProvider = createOptionsProvider(BaseFS); auto *OptionsProvider = OwningOptionsProvider.get(); if (!OptionsProvider) return 1; @@ -432,12 +438,6 @@ static int clangTidyMain(int argc, const llvm::cl::PrintHelpMessage(/*Hidden=*/false, /*Categorized=*/true); return 1; } - llvm::IntrusiveRefCntPtr<vfs::FileSystem> BaseFS( - VfsOverlay.empty() ? vfs::getRealFileSystem() - : getVfsOverlayFromFile(VfsOverlay)); - if (!BaseFS) - return 1; - ProfileData Profile; llvm::InitializeAllTargetInfos(); Added: clang-tools-extra/trunk/test/clang-tidy/read_file_config.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/read_file_config.cpp?rev=330245&view=auto ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/read_file_config.cpp (added) +++ clang-tools-extra/trunk/test/clang-tidy/read_file_config.cpp Wed Apr 18 01:54:28 2018 @@ -0,0 +1,12 @@ +// RUN: mkdir -p %T/read-file-config/ +// RUN: cp %s %T/read-file-config/test.cpp +// RUN: echo 'Checks: "-*,modernize-use-nullptr"' > %T/read-file-config/.clang-tidy +// RUN: echo '[{"command": "cc -c -o test.o test.cpp", "directory": "%T/read-file-config", "file": "%T/read-file-config/test.cpp"}]' > %T/read-file-config/compile_commands.json +// RUN: clang-tidy %T/read-file-config/test.cpp | not grep "warning: .*\[clang-analyzer-deadcode.DeadStores\]$" +// RUN: clang-tidy -checks="-*,clang-analyzer-*" %T/read-file-config/test.cpp | grep "warning: .*\[clang-analyzer-deadcode.DeadStores\]$" + +void f() { + int x; + x = 1; + x = 2; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits