Hi,

On 04/18/2018 10:54 AM, Haojian Wu via cfe-commits wrote:
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 {};

This causes a compilation warning:

../tools/clang/tools/extra/clang-tidy/ClangTidyOptions.cpp:233:23: error: unused variable 'ec' [-Werror,-Wunused-variable]
  if (std::error_code ec = FS->makeAbsolute(AbsoluteFilePath))
                      ^
1 error generated.

Regards,
Mikael


    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

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to