[PATCH] libstdc++/71037 Add base path to filesystem::canonical exceptions

Jonathan Wakely jwakely@redhat.com
Tue May 10 12:20:00 GMT 2016


A very simple one.

	PR libstdc++/71037
	* src/filesystem/ops.cc (canonical(const path&, const path&)): Add
	base path to exception.
	* testsuite/experimental/filesystem/operations/canonical.cc: Test
	paths contained in exception.

Tested x86_64-linux, committed to trunk. Backports to follow.

-------------- next part --------------
commit 73d984ba4a820916438e9dfff98c07ac73bd5ec1
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Tue May 10 13:13:33 2016 +0100

    libstdc++/71037 Add base path to filesystem::canonical exceptions
    
    	PR libstdc++/71037
    	* src/filesystem/ops.cc (canonical(const path&, const path&)): Add
    	base path to exception.
    	* testsuite/experimental/filesystem/operations/canonical.cc: Test
    	paths contained in exception.

diff --git a/libstdc++-v3/src/filesystem/ops.cc b/libstdc++-v3/src/filesystem/ops.cc
index aa26caf..e18c751 100644
--- a/libstdc++-v3/src/filesystem/ops.cc
+++ b/libstdc++-v3/src/filesystem/ops.cc
@@ -220,8 +220,9 @@ fs::canonical(const path& p, const path& base)
 {
   error_code ec;
   path can = canonical(p, base, ec);
-  if (ec.value())
-    _GLIBCXX_THROW_OR_ABORT(filesystem_error("cannot canonicalize", p, ec));
+  if (ec)
+    _GLIBCXX_THROW_OR_ABORT(filesystem_error("cannot canonicalize", p, base,
+					     ec));
   return can;
 }
 
diff --git a/libstdc++-v3/testsuite/experimental/filesystem/operations/canonical.cc b/libstdc++-v3/testsuite/experimental/filesystem/operations/canonical.cc
index e13c4bf..5b4c573 100644
--- a/libstdc++-v3/testsuite/experimental/filesystem/operations/canonical.cc
+++ b/libstdc++-v3/testsuite/experimental/filesystem/operations/canonical.cc
@@ -59,8 +59,28 @@ test01()
   VERIFY( !ec );
 }
 
+void
+test02()
+{
+#if __cpp_exceptions
+  bool test __attribute__((unused)) = false;
+
+  fs::path p = "rel", base = __gnu_test::nonexistent_path();
+  fs::path e1, e2;
+  try {
+    canonical(p, base);
+  } catch (const fs::filesystem_error& e) {
+    e1 = e.path1();
+    e2 = e.path2();
+  }
+  VERIFY( e1 == p );
+  VERIFY( e2 == base );
+#endif
+}
+
 int
 main()
 {
   test01();
+  test02();
 }


More information about the Gcc-patches mailing list