diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Basic/VirtualFileSystem.cpp | 13 | ||||
| -rw-r--r-- | clang/test/VFS/relative-path.c | 11 |
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(); +} |

