diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2019-01-04 11:43:09 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2019-01-04 11:43:09 +0000 |
commit | b30802179a0af4a6328b086d7bcab6fa7d294e3c (patch) | |
tree | 4243ddb73cbfd3fb790497a98f47362b08bc020c | |
parent | 5db78cac104c0427b023b3a21f98bf302aa736e3 (diff) | |
download | gcc-b30802179a0af4a6328b086d7bcab6fa7d294e3c.zip gcc-b30802179a0af4a6328b086d7bcab6fa7d294e3c.tar.gz gcc-b30802179a0af4a6328b086d7bcab6fa7d294e3c.tar.bz2 |
Fix concatenation bug in filesystem::path
When erasing a trailing empty filename component, the output iterator
was not decremented, causing the next component to be created at the
wrong position.
* src/filesystem/std-path.cc (path::operator+=(const path&)): Fix
incorrect treatment of empty filename after trailing slash.
* testsuite/27_io/filesystem/path/concat/path.cc: Test problem case.
From-SVN: r267574
-rw-r--r-- | libstdc++-v3/ChangeLog | 4 | ||||
-rw-r--r-- | libstdc++-v3/src/filesystem/std-path.cc | 2 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/27_io/filesystem/path/concat/path.cc | 9 |
3 files changed, 14 insertions, 1 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index e6a2dc2..483a602 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,9 @@ 2019-01-04 Jonathan Wakely <jwakely@redhat.com> + * src/filesystem/std-path.cc (path::operator+=(const path&)): Fix + incorrect treatment of empty filename after trailing slash. + * testsuite/27_io/filesystem/path/concat/path.cc: Test problem case. + * testsuite/21_strings/basic_string/modifiers/assign/char/ move_assign_optim.cc: Avoid spurious failure when -fno-inline added to test flags. diff --git a/libstdc++-v3/src/filesystem/std-path.cc b/libstdc++-v3/src/filesystem/std-path.cc index bf6f377..b7315ad 100644 --- a/libstdc++-v3/src/filesystem/std-path.cc +++ b/libstdc++-v3/src/filesystem/std-path.cc @@ -945,7 +945,7 @@ path::operator+=(const path& p) else if (orig_filenamelen == 0 && it != last) { // Remove empty filename at end of original path. - _M_cmpts.erase(std::prev(output)); + _M_cmpts.erase(--output); } if (it != last && it->_M_type() == _Type::_Root_name) diff --git a/libstdc++-v3/testsuite/27_io/filesystem/path/concat/path.cc b/libstdc++-v3/testsuite/27_io/filesystem/path/concat/path.cc index b653219..e2a14bd 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/path/concat/path.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/path/concat/path.cc @@ -59,9 +59,18 @@ test02() } } +void +test03() +{ + path p = "a/"; + p += path("/b"); + compare_paths(p, "a//b"); +} + int main() { test01(); test02(); + test03(); } |