summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Basic/VirtualFileSystem.cpp13
-rw-r--r--clang/test/VFS/relative-path.c11
2 files changed, 21 insertions, 3 deletions
diff --git a/clang/lib/Basic/VirtualFileSystem.cpp b/clang/lib/Basic/VirtualFileSystem.cpp
index 43b203a334e..dc0f52f72b4 100644
--- a/clang/lib/Basic/VirtualFileSystem.cpp
+++ b/clang/lib/Basic/VirtualFileSystem.cpp
@@ -733,8 +733,12 @@ VFSFromYAML *VFSFromYAML::create(MemoryBuffer *Buffer,
}
ErrorOr<Entry *> VFSFromYAML::lookupPath(const Twine &Path_) {
- SmallVector<char, 256> Storage;
- StringRef Path = Path_.toNullTerminatedStringRef(Storage);
+ SmallString<256> Path;
+ Path_.toVector(Path);
+
+ // Handle relative paths
+ if (error_code EC = sys::fs::make_absolute(Path))
+ return EC;
if (Path.empty())
return error_code(errc::invalid_argument, system_category());
@@ -753,7 +757,10 @@ ErrorOr<Entry *> VFSFromYAML::lookupPath(const Twine &Path_) {
ErrorOr<Entry *> VFSFromYAML::lookupPath(sys::path::const_iterator Start,
sys::path::const_iterator End,
Entry *From) {
- // FIXME: handle . and ..
+ if (Start->equals("."))
+ ++Start;
+
+ // FIXME: handle ..
if (CaseSensitive ? !Start->equals(From->getName())
: !Start->equals_lower(From->getName()))
// failure to match
diff --git a/clang/test/VFS/relative-path.c b/clang/test/VFS/relative-path.c
new file mode 100644
index 00000000000..e7101fb3a82
--- /dev/null
+++ b/clang/test/VFS/relative-path.c
@@ -0,0 +1,11 @@
+// RUN: mkdir -p %t
+// RUN: cd %t
+// RUN: sed -e "s:INPUT_DIR:%S/Inputs:g" -e "s:OUT_DIR:%t:g" %S/Inputs/vfsoverlay.yaml > %t.yaml
+// RUN: %clang_cc1 -Werror -I . -ivfsoverlay %t.yaml -fsyntax-only %s
+// REQUIRES: shell
+
+#include "not_real.h"
+
+void foo() {
+ bar();
+}
OpenPOWER on IntegriCloud