diff options
-rw-r--r-- | clang/lib/Basic/FileManager.cpp | 10 | ||||
-rw-r--r-- | clang/unittests/Basic/FileManagerTest.cpp | 17 |
2 files changed, 27 insertions, 0 deletions
diff --git a/clang/lib/Basic/FileManager.cpp b/clang/lib/Basic/FileManager.cpp index d8deac72c46..651a7a430a3 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 = diff --git a/clang/unittests/Basic/FileManagerTest.cpp b/clang/unittests/Basic/FileManagerTest.cpp index a55fcbf76cf..d86c96f5a2c 100644 --- a/clang/unittests/Basic/FileManagerTest.cpp +++ b/clang/unittests/Basic/FileManagerTest.cpp @@ -125,6 +125,14 @@ TEST_F(FileManagerTest, getFileReturnsValidFileEntryForExistingRealFile) { FakeStatCache *statCache = new FakeStatCache; statCache->InjectDirectory("/tmp", 42); statCache->InjectFile("/tmp/test", 43); + +#ifdef _WIN32 + const char *DirName = "C:."; + const char *FileName = "C:test"; + statCache->InjectDirectory(DirName, 44); + statCache->InjectFile(FileName, 45); +#endif + manager.addStatCache(statCache); const FileEntry *file = manager.getFile("/tmp/test"); @@ -134,6 +142,15 @@ TEST_F(FileManagerTest, getFileReturnsValidFileEntryForExistingRealFile) { const DirectoryEntry *dir = file->getDir(); ASSERT_TRUE(dir != NULL); EXPECT_STREQ("/tmp", dir->getName()); + +#ifdef _WIN32 + file = manager.getFile(FileName); + ASSERT_TRUE(file != NULL); + + dir = file->getDir(); + ASSERT_TRUE(dir != NULL); + EXPECT_STREQ(DirName, dir->getName()); +#endif } // getFile() returns non-NULL if a virtual file exists at the given path. |