diff options
author | Alex Lorenz <arphaman@gmail.com> | 2019-09-13 22:12:02 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2019-09-13 22:12:02 +0000 |
commit | bac35bd8530000c1e3840f8ccdad8b82f4bc3d8b (patch) | |
tree | a2be9e7e7ec07c60f12386ed115a0cf2f040d0ef | |
parent | 7343eabc6b4054b7ca2f4455361d5f891f482626 (diff) | |
download | clang-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
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 |