aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-05-15 13:07:09 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2018-05-15 13:07:09 +0100
commit6cda876da273e36bb65f843a9bf39576258ebf19 (patch)
tree7d4b3f2e2b2fc7b7fb1c963aa9aabb5b8659f94a /libstdc++-v3/include
parente4a5135fe3cfc77a2f7ea8d2fc55a346ed711789 (diff)
downloadgcc-6cda876da273e36bb65f843a9bf39576258ebf19.zip
gcc-6cda876da273e36bb65f843a9bf39576258ebf19.tar.gz
gcc-6cda876da273e36bb65f843a9bf39576258ebf19.tar.bz2
PR libstdc++/84159 fix appending strings to paths
The path::operator/=(const Source&) and path::append overloads were still following the semantics of the Filesystem TS not C++17. Only the path::operator/=(const path&) overload was correct. This change adds more tests for path::operator/=(const path&) and adds new tests to verify that the other append operations have equivalent behaviour. PR libstdc++/84159 * include/bits/fs_path.h (path::operator/=, path::append): Construct temporary path before calling _M_append. (path::_M_append): Change parameter to path and implement C++17 semantics. * testsuite/27_io/filesystem/path/append/path.cc: Add helper function and more examples from the standard. * testsuite/27_io/filesystem/path/append/source.cc: New. * testsuite/27_io/filesystem/path/decompose/filename.cc: Add comment. * testsuite/27_io/filesystem/path/nonmember/append.cc: New. From-SVN: r260255
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r--libstdc++-v3/include/bits/fs_path.h25
1 files changed, 11 insertions, 14 deletions
diff --git a/libstdc++-v3/include/bits/fs_path.h b/libstdc++-v3/include/bits/fs_path.h
index 6703e91..53bf237 100644
--- a/libstdc++-v3/include/bits/fs_path.h
+++ b/libstdc++-v3/include/bits/fs_path.h
@@ -265,20 +265,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
template <class _Source>
_Path<_Source>&
operator/=(_Source const& __source)
- { return append(__source); }
+ { return _M_append(path(__source)); }
template<typename _Source>
_Path<_Source>&
append(_Source const& __source)
- {
- return _M_append(_S_convert(_S_range_begin(__source),
- _S_range_end(__source)));
- }
+ { return _M_append(path(__source)); }
template<typename _InputIterator>
_Path<_InputIterator, _InputIterator>&
append(_InputIterator __first, _InputIterator __last)
- { return _M_append(_S_convert(__first, __last)); }
+ { return _M_append(path(__first, __last)); }
// concatenation
@@ -406,17 +403,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
enum class _Split { _Stem, _Extension };
- path& _M_append(string_type&& __str)
+ path&
+ _M_append(path __p)
{
+ if (__p.is_absolute())
+ operator=(std::move(__p));
#ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS
- operator/=(path(std::move(__str)));
-#else
- if (!_M_pathname.empty() && !_S_is_dir_sep(_M_pathname.back())
- && (__str.empty() || !_S_is_dir_sep(__str.front())))
- _M_pathname += preferred_separator;
- _M_pathname += __str;
- _M_split_cmpts();
+ else if (__p.has_root_name() && __p.root_name() != root_name())
+ operator=(std::move(__p));
#endif
+ else
+ operator/=(const_cast<const path&>(__p));
return *this;
}