gcc/libstdc++-v3/testsuite
Jonathan Wakely 73d968d945 Fix bugs in filesystem::path::lexically_normal()
Using path::_List::erase(const_iterator) to remove a non-final component
in path::lexically_normal() is a bug, because it leaves the following
component with an incorrect _M_pos value.

Instead of providing erase members that allow removing components from
the middle, replace them with pop_back() and
_M_erase_from(const_iterator) which only allow removing elements at the
end. Most uses of erase are unaffected, because they only remove
elements from the end anyway. The one use of erasure from the middle in
lexically_normal() is replaced by calls to pop_back() and/or clearing
the last component to leave it as an empty final filename.

Also replace the "???" comment in lexically_normal() to document when
that branch is taken.

	* include/bits/fs_path.h (path::_List::erase): Replace both overloads
	with ...
	(path::pop_back(), path::_M_erase_from(const_iterator)): New member
	functions that will only erase elements at the end.
	* src/filesystem/std-path.cc (path::_List::_Impl::pop_back()): Define.
	(path::_List::_Impl::_M_erase_from(const_iterator)): Define.
	(path::_List::operator=(const _List&)): Use _M_erase_from(p) instead
	of erase(p, end()).
	(path::_List::pop_back()): Define.
	(path::_List::_M_erase_from(const_iterator)): Define.
	(path::operator/=(const path&)): Use pop_back to remove last component
	and _M_erase_from to remove multiple components.
	(path::_M_append(basic_string_view<value_type>)): Likewise.
	(path::operator+=(const path&)): Likewise.
	(path::_M_concat(basic_string_view<value_type>)): Likewise.
	(path::remove_filename()): Likewise.
	(path::lexically_normal()): Use _List::_Impl iterators instead of
	path::iterator. Use pop_back to remove components from the end. Clear
	trailing filename, instead of using erase(const_iterator) to remove
	a non-final component.
	* testsuite/27_io/filesystem/path/generation/normal.cc: Test
	additional cases.
	* testsuite/27_io/filesystem/path/generation/normal2.cc: New test.

From-SVN: r267576
2019-01-04 14:03:59 +00:00
..
17_intro Update copyright years. 2019-01-01 13:31:55 +01:00
18_support Update copyright years. 2019-01-01 13:31:55 +01:00
19_diagnostics Update copyright years. 2019-01-01 13:31:55 +01:00
20_util Update copyright years. 2019-01-01 13:31:55 +01:00
21_strings Avoid spurious test failures when -fno-inline in test flags 2019-01-04 11:06:49 +00:00
22_locale PR libstdc++/88681 export missing symbols 2019-01-03 20:38:04 +00:00
23_containers Add more testcases for class template argument deduction of maps 2019-01-02 16:30:49 +00:00
24_iterators Update copyright years. 2019-01-01 13:31:55 +01:00
25_algorithms Update copyright years. 2019-01-01 13:31:55 +01:00
26_numerics Update copyright years. 2019-01-01 13:31:55 +01:00
27_io Fix bugs in filesystem::path::lexically_normal() 2019-01-04 14:03:59 +00:00
28_regex Update copyright years. 2019-01-01 13:31:55 +01:00
29_atomics Update copyright years. 2019-01-01 13:31:55 +01:00
30_threads Update copyright years. 2019-01-01 13:31:55 +01:00
abi Update copyright years. 2019-01-01 13:31:55 +01:00
backward Update copyright years. 2019-01-01 13:31:55 +01:00
config Update copyright years. 2019-01-01 13:31:55 +01:00
data
decimal Update copyright years. 2019-01-01 13:31:55 +01:00
experimental Fix year range in copyright header 2019-01-02 10:44:35 +00:00
ext Update copyright years. 2019-01-01 13:31:55 +01:00
lib Update copyright years. 2019-01-01 13:31:55 +01:00
libstdc++-abi Update copyright years. 2019-01-01 13:31:55 +01:00
libstdc++-dg Update copyright years. 2019-01-01 13:31:55 +01:00
libstdc++-prettyprinters Update copyright years. 2019-01-01 13:31:55 +01:00
libstdc++-xmethods Update copyright years. 2019-01-01 13:31:55 +01:00
performance Update copyright years. 2019-01-01 13:31:55 +01:00
special_functions Update copyright years. 2019-01-01 13:31:55 +01:00
tr1 Update copyright years. 2019-01-01 13:31:55 +01:00
tr2 Update copyright years. 2019-01-01 13:31:55 +01:00
util Update copyright years. 2019-01-01 13:31:55 +01:00
Makefile.am Update copyright years. 2019-01-01 13:31:55 +01:00
Makefile.in Update GCC to autoconf 2.69, automake 1.15.1 (PR bootstrap/82856). 2018-10-31 17:03:16 +00:00