diff --git a/clang/test/VFS/Inputs/vfsoverlay-root-relative.yaml b/clang/test/VFS/Inputs/vfsoverlay-root-relative.yaml new file mode 100644 --- /dev/null +++ b/clang/test/VFS/Inputs/vfsoverlay-root-relative.yaml @@ -0,0 +1,17 @@ +{ + 'version': 0, + 'fallthrough': true, + 'overlay-relative': true, + 'roots': [ + { 'name': 'virtual', + 'type': 'directory', + 'contents': [ + { + 'external-contents': 'actual_header.h', + 'type': 'file', + 'name': 'virtual_header.h', + } + ] + } + ] +} diff --git a/clang/test/VFS/vfsoverlay-relative-root.c b/clang/test/VFS/vfsoverlay-relative-root.c new file mode 100644 --- /dev/null +++ b/clang/test/VFS/vfsoverlay-relative-root.c @@ -0,0 +1,4 @@ +// RUN: %clang_cc1 -Werror -ivfsoverlay %S/Inputs/vfsoverlay-root-relative.yaml -I virtual -fsyntax-only %s + +#include "virtual_header.h" + diff --git a/llvm/lib/Support/VirtualFileSystem.cpp b/llvm/lib/Support/VirtualFileSystem.cpp --- a/llvm/lib/Support/VirtualFileSystem.cpp +++ b/llvm/lib/Support/VirtualFileSystem.cpp @@ -1649,10 +1649,17 @@ sys::path::Style::windows_backslash)) { path_style = sys::path::Style::windows_backslash; } else { - assert(NameValueNode && "Name presence should be checked earlier"); - error(NameValueNode, - "entry with relative path at the root level is not discoverable"); - return nullptr; + // Relative VFS root entries are made absolute to the current working + // directory, then we can determine the path style from that. + auto EC = sys::fs::make_absolute(Name); + if (EC) { + assert(NameValueNode && "Name presence should be checked earlier"); + error(NameValueNode, + "entry with relative path at the root level is not discoverable"); + return nullptr; + } + path_style = sys::path::is_absolute(Name, sys::path::Style::posix) ? + sys::path::Style::posix : sys::path::Style::windows_backslash; } }