Attempt to make clang-x64-ninja-win7 happy.
authorSean Silva <chisophugis@gmail.com>
Thu, 30 Jul 2015 00:52:32 +0000 (00:52 +0000)
committerSean Silva <chisophugis@gmail.com>
Thu, 30 Jul 2015 00:52:32 +0000 (00:52 +0000)
It looks like we were somehow relying somewhere on removing 'foo/./bar'
but *not* 'foo/../foo/bar'. Currently investigating.

llvm-svn: 243600

clang/include/clang/Basic/FileManager.h
clang/lib/Basic/FileManager.cpp

index ac0d7a1..a08d3c8 100644 (file)
@@ -267,7 +267,7 @@ public:
                               time_t ModificationTime);
 
   /// \brief Remove any './' components from a path.
-  static bool removeDotPaths(SmallVectorImpl<char> &Path);
+  static bool removeDotPaths(SmallVectorImpl<char> &Path, bool RemoveDotDot = false);
 
   /// \brief Retrieve the canonical name for a given directory.
   ///
index 3d16056..209abad 100644 (file)
@@ -517,7 +517,7 @@ void FileManager::modifyFileEntry(FileEntry *File,
 /// Remove '.' and '..' path components from the given absolute path.
 /// \return \c true if any changes were made.
 // FIXME: Move this to llvm::sys::path.
-bool FileManager::removeDotPaths(SmallVectorImpl<char> &Path) {
+bool FileManager::removeDotPaths(SmallVectorImpl<char> &Path, bool RemoveDotDot) {
   using namespace llvm::sys;
 
   SmallVector<StringRef, 16> ComponentStack;
@@ -528,10 +528,12 @@ bool FileManager::removeDotPaths(SmallVectorImpl<char> &Path) {
   for (StringRef C : llvm::make_range(path::begin(Rel), path::end(Rel))) {
     if (C == ".")
       continue;
-    if (C == "..") {
-      if (!ComponentStack.empty())
-        ComponentStack.pop_back();
-      continue;
+    if (RemoveDotDot) {
+      if (C == "..") {
+        if (!ComponentStack.empty())
+          ComponentStack.pop_back();
+        continue;
+      }
     }
     ComponentStack.push_back(C);
   }
@@ -566,7 +568,7 @@ StringRef FileManager::getCanonicalName(const DirectoryEntry *Dir) {
   SmallString<256> CanonicalNameBuf(CanonicalName);
   llvm::sys::fs::make_absolute(CanonicalNameBuf);
   llvm::sys::path::native(CanonicalNameBuf);
-  removeDotPaths(CanonicalNameBuf);
+  removeDotPaths(CanonicalNameBuf, true);
   char *Mem = CanonicalNameStorage.Allocate<char>(CanonicalNameBuf.size());
   memcpy(Mem, CanonicalNameBuf.data(), CanonicalNameBuf.size());
   CanonicalName = StringRef(Mem, CanonicalNameBuf.size());