mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-02 16:56:50 +00:00
Fix an inconsistency in treatment of trailing / in path::const_iterator
When using a //net/ path, we were transforming the trailing / into a '.' when the path was just the root path and we were iterating backwards. Forwards iteration and other kinds of root path (C:\, /) were already correct. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202999 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4d36f91c08
commit
82d372e12b
@ -307,21 +307,18 @@ const_iterator &const_iterator::operator++() {
|
||||
}
|
||||
|
||||
const_iterator &const_iterator::operator--() {
|
||||
// If we're at the end and the previous char was a '/', return '.'.
|
||||
// If we're at the end and the previous char was a '/', return '.' unless
|
||||
// we are the root path.
|
||||
size_t root_dir_pos = root_dir_start(Path);
|
||||
if (Position == Path.size() &&
|
||||
Path.size() > 1 &&
|
||||
is_separator(Path[Position - 1])
|
||||
#ifdef LLVM_ON_WIN32
|
||||
&& Path[Position - 2] != ':'
|
||||
#endif
|
||||
) {
|
||||
Path.size() > root_dir_pos + 1 &&
|
||||
is_separator(Path[Position - 1])) {
|
||||
--Position;
|
||||
Component = ".";
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Skip separators unless it's the root directory.
|
||||
size_t root_dir_pos = root_dir_start(Path);
|
||||
size_t end_pos = Position;
|
||||
|
||||
while(end_pos > 0 &&
|
||||
|
@ -210,6 +210,35 @@ TEST(Support, AbsolutePathIteratorWin32) {
|
||||
}
|
||||
#endif // LLVM_ON_WIN32
|
||||
|
||||
TEST(Support, AbsolutePathIteratorEnd) {
|
||||
// Trailing slashes are converted to '.' unless they are part of the root path.
|
||||
SmallVector<StringRef, 4> Paths;
|
||||
Paths.push_back("/foo/");
|
||||
Paths.push_back("/foo//");
|
||||
Paths.push_back("//net//");
|
||||
#ifdef LLVM_ON_WIN32
|
||||
Paths.push_back("c:\\\\");
|
||||
#endif
|
||||
|
||||
for (StringRef Path : Paths) {
|
||||
StringRef LastComponent = *--path::end(Path);
|
||||
EXPECT_EQ(".", LastComponent);
|
||||
}
|
||||
|
||||
SmallVector<StringRef, 3> RootPaths;
|
||||
RootPaths.push_back("/");
|
||||
RootPaths.push_back("//net/");
|
||||
#ifdef LLVM_ON_WIN32
|
||||
RootPaths.push_back("c:\\");
|
||||
#endif
|
||||
|
||||
for (StringRef Path : RootPaths) {
|
||||
StringRef LastComponent = *--path::end(Path);
|
||||
EXPECT_EQ(1u, LastComponent.size());
|
||||
EXPECT_TRUE(path::is_separator(LastComponent[0]));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(Support, HomeDirectory) {
|
||||
#ifdef LLVM_ON_UNIX
|
||||
// This test only makes sense on Unix if $HOME is set.
|
||||
|
Loading…
Reference in New Issue
Block a user