Apply resolution for LWG DR 3096

Add fix for "path::lexically_relative is confused by trailing slashes".

	* doc/xml/manual/intro.xml: Document LWG 3096 change.
	* src/filesystem/std-path.cc (path::lexically_relative(const path&)):
	Treat a final empty element equivalently to a final dot element.
	* testsuite/27_io/filesystem/path/generation/relative.cc: Add checks
	for the examples in the DR.

From-SVN: r266566
This commit is contained in:
Jonathan Wakely 2018-11-28 15:36:56 +00:00 committed by Jonathan Wakely
parent 24d9b090fb
commit bd6ccc290a
4 changed files with 37 additions and 2 deletions

View File

@ -1,5 +1,11 @@
2018-11-28 Jonathan Wakely <jwakely@redhat.com> 2018-11-28 Jonathan Wakely <jwakely@redhat.com>
* doc/xml/manual/intro.xml: Document LWG 3096 change.
* src/filesystem/std-path.cc (path::lexically_relative(const path&)):
Treat a final empty element equivalently to a final dot element.
* testsuite/27_io/filesystem/path/generation/relative.cc: Add checks
for the examples in the DR.
PR libstdc++/83306 PR libstdc++/83306
* include/bits/fs_path.h (filesystem_error): Move data members into * include/bits/fs_path.h (filesystem_error): Move data members into
pimpl class owned by shared_ptr. Remove inline definitions of member pimpl class owned by shared_ptr. Remove inline definitions of member

View File

@ -1194,6 +1194,13 @@ requirements of the license of GCC.
<listitem><para>Change constructors to constrained templates. <listitem><para>Change constructors to constrained templates.
</para></listitem></varlistentry> </para></listitem></varlistentry>
<varlistentry xml:id="manual.bugs.dr3096"><term><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="&DR;#3096">3096</link>:
<emphasis><code>path::lexically_relative</code> is confused by trailing slashes
</emphasis>
</term>
<listitem><para>Implement the fix for trailing slashes.
</para></listitem></varlistentry>
</variablelist> </variablelist>
</section> </section>

View File

@ -529,10 +529,12 @@ path::lexically_relative(const path& base) const
const path& p = *b; const path& p = *b;
if (is_dotdot(p)) if (is_dotdot(p))
--n; --n;
else if (!is_dot(p)) else if (!p.empty() && !is_dot(p))
++n; ++n;
} }
if (n >= 0) if (n == 0 && (a == end() || a->empty()))
ret = ".";
else if (n >= 0)
{ {
const path dotdot(".."); const path dotdot("..");
while (n--) while (n--)

View File

@ -45,6 +45,25 @@ test02()
compare_paths( p.lexically_relative(p), "." ); compare_paths( p.lexically_relative(p), "." );
compare_paths( p.lexically_relative("a/../a/b/../b/c/../c/."), "../../b/c" ); compare_paths( p.lexically_relative("a/../a/b/../b/c/../c/."), "../../b/c" );
compare_paths( p.lexically_relative("../../../"), "" ); compare_paths( p.lexically_relative("../../../"), "" );
compare_paths( path("a/./.").lexically_relative("a"), "./." );
}
void
test03()
{
// LWG 3096
compare_paths( path("/dir").lexically_relative("/dir"), "." );
compare_paths( path("/dir").lexically_relative("/dir/"), "." );
compare_paths( path("/dir").lexically_relative("/dir/."), "." );
compare_paths( path("/dir/").lexically_relative("/dir"), "." );
compare_paths( path("/dir/").lexically_relative("/dir/"), "." );
compare_paths( path("/dir/").lexically_relative("/dir/."), "." );
compare_paths( path("/dir/.").lexically_relative("/dir"), "." );
compare_paths( path("/dir/.").lexically_relative("/dir/"), "." );
compare_paths( path("/dir/.").lexically_relative("/dir/."), "." );
} }
int int
@ -52,4 +71,5 @@ main()
{ {
test01(); test01();
test02(); test02();
test03();
} }