diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2019-01-12 00:12:20 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2019-01-12 00:12:20 +0000 |
commit | 7f00fdb285da062d5fa7028d2c7206496d25a264 (patch) | |
tree | edbaaee58fd86d3bc7a8b07ccf284b65438ac867 | |
parent | 66dc59e24fc7bcf28d1ec20919f7014a701bfc9d (diff) | |
download | gcc-7f00fdb285da062d5fa7028d2c7206496d25a264.zip gcc-7f00fdb285da062d5fa7028d2c7206496d25a264.tar.gz gcc-7f00fdb285da062d5fa7028d2c7206496d25a264.tar.bz2 |
PR libstdc++/88811 fix typo introduced in r266569
PR libstdc++/88811
PR libstdc++/83306
* src/filesystem/path.cc: Fix typo. If first path is empty, show []
before second path.
* testsuite/experimental/filesystem/filesystem_error/cons.cc: New
test.
From-SVN: r267868
-rw-r--r-- | libstdc++-v3/ChangeLog | 9 | ||||
-rw-r--r-- | libstdc++-v3/src/filesystem/path.cc | 6 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/experimental/filesystem/filesystem_error/cons.cc | 90 |
3 files changed, 103 insertions, 2 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index c89ab4a..4dbf75b 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2019-01-12 Jonathan Wakely <jwakely@redhat.com> + + PR libstdc++/88811 + PR libstdc++/83306 + * src/filesystem/path.cc: Fix typo. If first path is empty, show [] + before second path. + * testsuite/experimental/filesystem/filesystem_error/cons.cc: New + test. + 2019-01-11 Jonathan Wakely <jwakely@redhat.com> * doc/xml/manual/intro.xml: Include new section. diff --git a/libstdc++-v3/src/filesystem/path.cc b/libstdc++-v3/src/filesystem/path.cc index 048c561..92def10 100644 --- a/libstdc++-v3/src/filesystem/path.cc +++ b/libstdc++-v3/src/filesystem/path.cc @@ -494,7 +494,7 @@ fs::filesystem_error::_M_gen_what() const std::string pstr2 = _M_path2.u8string(); experimental::string_view s = this->system_error::what(); const size_t len = 18 + s.length() - + (pstr1.length() ? pstr1.length() + 3 : 0) + + (pstr1.length() || pstr2.length() ? pstr1.length() + 3 : 0) + (pstr2.length() ? pstr2.length() + 3 : 0); std::string w; w.reserve(len); @@ -506,8 +506,10 @@ fs::filesystem_error::_M_gen_what() w += pstr1; w += ']'; } - if (!pstr1.empty()) + if (!pstr2.empty()) { + if (pstr1.empty()) + w += " []"; w += " ["; w += pstr2; w += ']'; diff --git a/libstdc++-v3/testsuite/experimental/filesystem/filesystem_error/cons.cc b/libstdc++-v3/testsuite/experimental/filesystem/filesystem_error/cons.cc new file mode 100644 index 0000000..a08852d --- /dev/null +++ b/libstdc++-v3/testsuite/experimental/filesystem/filesystem_error/cons.cc @@ -0,0 +1,90 @@ +// Copyright (C) 2018-2019 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +// { dg-options "-std=gnu++17 -lstdc++fs" } +// { dg-do run { target c++11 } } +// { dg-require-filesystem-ts "" } + +#include <experimental/filesystem> +#include <testsuite_hooks.h> + +using std::experimental::filesystem::filesystem_error; +using std::experimental::filesystem::path; + +bool contains(std::string what_str, std::string expected) +{ + return what_str.find(expected) != std::string::npos; +} + +void +test01() +{ + const char* const str = "error test"; + const std::error_code ec = make_error_code(std::errc::is_a_directory); + const path p1 = "test/path/one"; + const path p2 = "/test/path/two"; + + const filesystem_error e1(str, ec); + VERIFY( contains(e1.what(), str) ); + VERIFY( !contains(e1.what(), "[]") ); // no "empty path" in the string + VERIFY( e1.path1().empty() ); + VERIFY( e1.path2().empty() ); + VERIFY( e1.code() == ec ); + + const filesystem_error e2(str, p1, ec); + VERIFY( e2.path1() == p1 ); + VERIFY( e2.path2().empty() ); + VERIFY( contains(e2.what(), str) ); + VERIFY( contains(e2.what(), p1.string()) ); + VERIFY( e2.code() == ec ); + + const filesystem_error e3(str, path{}, ec); + VERIFY( e3.path1().empty() ); + VERIFY( e3.path2().empty() ); + VERIFY( contains(e3.what(), str) ); + VERIFY( e3.code() == ec ); + + const filesystem_error e4(str, p1, p2, ec); + VERIFY( e4.path1() == p1 ); + VERIFY( e4.path2() == p2 ); + VERIFY( contains(e4.what(), str) ); + VERIFY( contains(e4.what(), p1.string()) ); + VERIFY( contains(e4.what(), p2.string()) ); + VERIFY( !contains(e4.what(), "[]") ); + VERIFY( e4.code() == ec ); + + const filesystem_error e5(str, p1, path{}, ec); + VERIFY( e5.path1() == p1 ); + VERIFY( e5.path2().empty() ); + VERIFY( contains(e5.what(), str) ); + VERIFY( contains(e5.what(), p1.string()) ); + VERIFY( e5.code() == ec ); + + const filesystem_error e6(str, path{}, p2, ec); + VERIFY( e6.path1().empty() ); + VERIFY( e6.path2() == p2 ); + VERIFY( contains(e6.what(), str) ); + VERIFY( contains(e6.what(), "[]") ); + VERIFY( contains(e6.what(), p2.string()) ); + VERIFY( e6.code() == ec ); +} + +int +main() +{ + test01(); +} |