diff options
author | Eric Fiselier <eric@efcs.ca> | 2018-12-21 04:25:40 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2018-12-21 04:25:40 +0000 |
commit | da05bdc85c1b8ef6e14f95a74d426256132eba81 (patch) | |
tree | 1f1541c63b38b2b39d22427c6fdaa5bbe580b1f9 /src | |
parent | 3cf34d1caf53a2c286e7b5f869599be94c4ec559 (diff) | |
download | libcxx-da05bdc85c1b8ef6e14f95a74d426256132eba81.tar.gz |
Implement LWG 3096: path::lexically_relative is confused by trailing slashes
path("/dir/").lexically_relative("/dir"); now returns "." instead of ""
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@349885 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'src')
-rw-r--r-- | src/filesystem/operations.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/filesystem/operations.cpp b/src/filesystem/operations.cpp index 0b79ef1cd..e3bbc7b64 100644 --- a/src/filesystem/operations.cpp +++ b/src/filesystem/operations.cpp @@ -1478,7 +1478,7 @@ static int DetermineLexicalElementCount(PathParser PP) { auto Elem = *PP; if (Elem == "..") --Count; - else if (Elem != ".") + else if (Elem != "." && Elem != "") ++Count; } return Count; @@ -1492,8 +1492,7 @@ path path::lexically_relative(const path& base) const { return PP.State != PPBase.State && (PP.inRootPath() || PPBase.inRootPath()); }; - if (PP.State == PathParser::PS_InRootName && - PPBase.State == PathParser::PS_InRootName) { + if (PP.inRootName() && PPBase.inRootName()) { if (*PP != *PPBase) return {}; } else if (CheckIterMismatchAtBase()) @@ -1525,6 +1524,10 @@ path path::lexically_relative(const path& base) const { if (ElemCount < 0) return {}; + // if n == 0 and (a == end() || a->empty()), returns path("."); otherwise + if (ElemCount == 0 && (PP.atEnd() || *PP == "")) + return "."; + // return a path constructed with 'n' dot-dot elements, followed by the the // elements of '*this' after the mismatch. path Result; |