summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lorenz <arphaman@gmail.com>2019-09-13 22:12:02 +0000
committerAlex Lorenz <arphaman@gmail.com>2019-09-13 22:12:02 +0000
commitbac35bd8530000c1e3840f8ccdad8b82f4bc3d8b (patch)
treea2be9e7e7ec07c60f12386ed115a0cf2f040d0ef
parent7343eabc6b4054b7ca2f4455361d5f891f482626 (diff)
downloadclang-bac35bd8530000c1e3840f8ccdad8b82f4bc3d8b.tar.gz
[clang-scan-deps] Fix for headers having the same name as a directory
Scan deps tool crashes when called on a C++ file, containing an include that has the same name as a directory. The tool crashes since it finds foo/dir and tries to read that as a file and fails. Patch by: kousikk (Kousik Kumar) Differential Revision: https://reviews.llvm.org/D67091 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@371903 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h3
-rw-r--r--lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp3
-rw-r--r--test/ClangScanDeps/Inputs/foodir1
-rw-r--r--test/ClangScanDeps/Inputs/headerwithdirname.json7
-rw-r--r--test/ClangScanDeps/headerwithdirname.cpp17
5 files changed, 31 insertions, 0 deletions
diff --git a/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h b/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h
index 94b3705200..1d0d26589e 100644
--- a/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h
+++ b/include/clang/Tooling/DependencyScanning/DependencyScanningFilesystem.h
@@ -56,6 +56,9 @@ public:
/// \returns True if the entry is valid.
bool isValid() const { return !MaybeStat || MaybeStat->isStatusKnown(); }
+ /// \returns True if the current entry points to a directory.
+ bool isDirectory() const { return MaybeStat && MaybeStat->isDirectory(); }
+
/// \returns The error or the file's contents.
llvm::ErrorOr<StringRef> getContents() const {
if (!MaybeStat)
diff --git a/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp b/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp
index 7a3d189ada..35ecbd4a7f 100644
--- a/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp
+++ b/lib/Tooling/DependencyScanning/DependencyScanningFilesystem.cpp
@@ -193,6 +193,9 @@ private:
llvm::ErrorOr<std::unique_ptr<llvm::vfs::File>>
createFile(const CachedFileSystemEntry *Entry,
ExcludedPreprocessorDirectiveSkipMapping *PPSkipMappings) {
+ if (Entry->isDirectory())
+ return llvm::ErrorOr<std::unique_ptr<llvm::vfs::File>>(
+ std::make_error_code(std::errc::is_a_directory));
llvm::ErrorOr<StringRef> Contents = Entry->getContents();
if (!Contents)
return Contents.getError();
diff --git a/test/ClangScanDeps/Inputs/foodir b/test/ClangScanDeps/Inputs/foodir
new file mode 100644
index 0000000000..c2e511e0cb
--- /dev/null
+++ b/test/ClangScanDeps/Inputs/foodir
@@ -0,0 +1 @@
+// A C++ header with same name as that of a directory in the include path.
diff --git a/test/ClangScanDeps/Inputs/headerwithdirname.json b/test/ClangScanDeps/Inputs/headerwithdirname.json
new file mode 100644
index 0000000000..2ae561935b
--- /dev/null
+++ b/test/ClangScanDeps/Inputs/headerwithdirname.json
@@ -0,0 +1,7 @@
+[
+ {
+ "directory": "DIR",
+ "command": "clang -c -IDIR -IDIR/foodir -IInputs DIR/headerwithdirname_input.cpp",
+ "file": "DIR/headerwithdirname_input.cpp"
+ }
+]
diff --git a/test/ClangScanDeps/headerwithdirname.cpp b/test/ClangScanDeps/headerwithdirname.cpp
new file mode 100644
index 0000000000..b0f60333aa
--- /dev/null
+++ b/test/ClangScanDeps/headerwithdirname.cpp
@@ -0,0 +1,17 @@
+// RUN: rm -rf %t.dir
+// RUN: rm -rf %t.dir/foodir
+// RUN: rm -rf %t.cdb
+// RUN: mkdir -p %t.dir
+// RUN: mkdir -p %t.dir/foodir
+// RUN: cp %s %t.dir/headerwithdirname_input.cpp
+// RUN: mkdir %t.dir/Inputs
+// RUN: cp %S/Inputs/foodir %t.dir/Inputs/foodir
+// RUN: sed -e "s|DIR|%/t.dir|g" %S/Inputs/headerwithdirname.json > %t.cdb
+//
+// RUN: clang-scan-deps -compilation-database %t.cdb -j 1 | FileCheck %s
+
+#include <foodir>
+
+// CHECK: headerwithdirname_input.o
+// CHECK-NEXT: headerwithdirname_input.cpp
+// CHECK-NEXT: Inputs{{/|\\}}foodir