[clang-move] Fix a potential bug where realpath doesn't work on VFS.
authorEric Liu <ioeric@google.com>
Wed, 16 May 2018 20:10:10 +0000 (20:10 +0000)
committerEric Liu <ioeric@google.com>
Wed, 16 May 2018 20:10:10 +0000 (20:10 +0000)
llvm-svn: 332518

clang-tools-extra/clang-move/ClangMove.cpp

index 16b0f72..7626d1c 100644 (file)
@@ -95,12 +95,16 @@ std::string MakeAbsolutePath(const SourceManager &SM, StringRef Path) {
       llvm::sys::path::parent_path(AbsolutePath.str()));
   if (Dir) {
     StringRef DirName = SM.getFileManager().getCanonicalName(Dir);
-    SmallVector<char, 128> AbsoluteFilename;
-    llvm::sys::path::append(AbsoluteFilename, DirName,
-                            llvm::sys::path::filename(AbsolutePath.str()));
-    return llvm::StringRef(AbsoluteFilename.data(), AbsoluteFilename.size())
-        .str();
+    // FIXME: getCanonicalName might fail to get real path on VFS.
+    if (llvm::sys::path::is_absolute(DirName)) {
+      SmallVector<char, 128> AbsoluteFilename;
+      llvm::sys::path::append(AbsoluteFilename, DirName,
+                              llvm::sys::path::filename(AbsolutePath.str()));
+      return llvm::StringRef(AbsoluteFilename.data(), AbsoluteFilename.size())
+          .str();
+    }
   }
+  llvm::sys::path::remove_dots(AbsolutePath, /*remove_dot_dot=*/true);
   return AbsolutePath.str();
 }