aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Basic/FileManager.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-07-29 15:47:24 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-07-29 15:47:24 +0000
commitee30546c007d26d9c0c6f15b0e291a8bb0e651f9 (patch)
tree127c41bf128e0471a021a6fa65ab20ea5918b7c2 /clang/lib/Basic/FileManager.cpp
parentaa5aa98eaba633f693a9ad0d1f781e432bd2fe7d (diff)
downloadllvm-ee30546c007d26d9c0c6f15b0e291a8bb0e651f9.zip
llvm-ee30546c007d26d9c0c6f15b0e291a8bb0e651f9.tar.gz
llvm-ee30546c007d26d9c0c6f15b0e291a8bb0e651f9.tar.bz2
Fix handling of "clang c:foo"
On windows, c:foo is a valid file path, but stat fails on just "c:". This causes a problem for clang since its file manager wants to cache data about the parent directory. There are refactorings to be done in here, but this gives clang the correct behavior and testing first. Patch by Yunzhong Gao! llvm-svn: 187359
Diffstat (limited to 'clang/lib/Basic/FileManager.cpp')
-rw-r--r--clang/lib/Basic/FileManager.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/clang/lib/Basic/FileManager.cpp b/clang/lib/Basic/FileManager.cpp
index d8deac7..651a7a4 100644
--- a/clang/lib/Basic/FileManager.cpp
+++ b/clang/lib/Basic/FileManager.cpp
@@ -292,6 +292,16 @@ const DirectoryEntry *FileManager::getDirectory(StringRef DirName,
DirName != llvm::sys::path::root_path(DirName) &&
llvm::sys::path::is_separator(DirName.back()))
DirName = DirName.substr(0, DirName.size()-1);
+#ifdef LLVM_ON_WIN32
+ // Fixing a problem with "clang C:test.c" on Windows.
+ // Stat("C:") does not recognize "C:" as a valid directory
+ std::string DirNameStr;
+ if (DirName.size() > 1 && DirName.back() == ':' &&
+ DirName.equals_lower(llvm::sys::path::root_name(DirName))) {
+ DirNameStr = DirName.str() + '.';
+ DirName = DirNameStr;
+ }
+#endif
++NumDirLookups;
llvm::StringMapEntry<DirectoryEntry *> &NamedDirEnt =