aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2019-01-04 11:43:09 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2019-01-04 11:43:09 +0000
commitb30802179a0af4a6328b086d7bcab6fa7d294e3c (patch)
tree4243ddb73cbfd3fb790497a98f47362b08bc020c
parent5db78cac104c0427b023b3a21f98bf302aa736e3 (diff)
downloadgcc-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/ChangeLog4
-rw-r--r--libstdc++-v3/src/filesystem/std-path.cc2
-rw-r--r--libstdc++-v3/testsuite/27_io/filesystem/path/concat/path.cc9
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();
}