diff --git a/include/llvm/Support/VirtualFileSystem.h b/include/llvm/Support/VirtualFileSystem.h index cdbfdbf0c4d..3b4c4aff9bd 100644 --- a/include/llvm/Support/VirtualFileSystem.h +++ b/include/llvm/Support/VirtualFileSystem.h @@ -532,7 +532,7 @@ class RedirectingFileSystemParser; /// \endverbatim /// /// All configuration options are optional. -/// 'case-sensitive': +/// 'case-sensitive': /// 'use-external-names': /// 'overlay-relative': /// 'fallthrough': @@ -651,6 +651,17 @@ private: return ExternalFSValidWD && IsFallthrough; } + // In a RedirectingFileSystem, keys can be specified in Posix or Windows + // style (or even a mixture of both), so this comparison helper allows + // slashes (representing a root) to match backslashes (and vice versa). Note + // that, other than the root, patch components should not contain slashes or + // backslashes. + bool pathComponentMatches(llvm::StringRef lhs, llvm::StringRef rhs) const { + if ((CaseSensitive ? lhs.equals(rhs) : lhs.equals_lower(rhs))) + return true; + return (lhs == "/" && rhs == "\\") || (lhs == "\\" && rhs == "/"); + } + /// The root(s) of the virtual file system. std::vector> Roots; @@ -674,7 +685,12 @@ private: /// Whether to perform case-sensitive comparisons. /// /// Currently, case-insensitive matching only works correctly with ASCII. - bool CaseSensitive = true; + bool CaseSensitive = +#ifdef _WIN32 + false; +#else + true; +#endif /// IsRelativeOverlay marks whether a ExternalContentsPrefixDir path must /// be prefixed in every 'external-contents' when reading from YAML files. diff --git a/lib/Support/VirtualFileSystem.cpp b/lib/Support/VirtualFileSystem.cpp index 40b748eab18..2d5c04baa57 100644 --- a/lib/Support/VirtualFileSystem.cpp +++ b/lib/Support/VirtualFileSystem.cpp @@ -1671,9 +1671,7 @@ RedirectingFileSystem::lookupPath(sys::path::const_iterator Start, // Forward the search to the next component in case this is an empty one. if (!FromName.empty()) { - if (CaseSensitive ? !Start->equals(FromName) - : !Start->equals_lower(FromName)) - // failure to match + if (!pathComponentMatches(*Start, FromName)) return make_error_code(llvm::errc::no_such_file_or_directory); ++Start; @@ -1695,6 +1693,7 @@ RedirectingFileSystem::lookupPath(sys::path::const_iterator Start, if (Result || Result.getError() != llvm::errc::no_such_file_or_directory) return Result; } + return make_error_code(llvm::errc::no_such_file_or_directory); }