From d562d3acb4c81387d437a28f92409b1c5b03d275 Mon Sep 17 00:00:00 2001 From: Mark de Wever Date: Sat, 27 Jul 2024 18:11:23 +0200 Subject: [PATCH] [NFC][libc++][exceptions] Adds tests for LWG3112. The tests kept being based on std::string instead of std::string_view to allow testing with older C++ dialects. Adds tests for: - LWG3112 system_error and filesystem_error constructors taking a string may not be able to meet their postconditions --- libcxx/docs/Status/Cxx20Issues.csv | 2 +- .../ctor_error_code_string.pass.cpp | 15 ++- .../ctor_int_error_category_string.pass.cpp | 18 ++- .../filesystem_error.members.pass.cpp | 114 ++++++++++++------ 4 files changed, 107 insertions(+), 42 deletions(-) diff --git a/libcxx/docs/Status/Cxx20Issues.csv b/libcxx/docs/Status/Cxx20Issues.csv index d6eb8bc9cf027..0053ca6e34d34 100644 --- a/libcxx/docs/Status/Cxx20Issues.csv +++ b/libcxx/docs/Status/Cxx20Issues.csv @@ -134,7 +134,7 @@ "`LWG3077 `__","``(push|emplace)_back``\ should invalidate the ``end``\ iterator","Kona","|Nothing To Do|","","" "`LWG3087 `__","One final ``&x``\ in |sect|\ [list.ops]","Kona","|Nothing To Do|","","" "`LWG3101 `__","``span``\ 's ``Container``\ constructors need another constraint","Kona","|Complete|","","" -"`LWG3112 `__","``system_error``\ and ``filesystem_error``\ constructors taking a ``string``\ may not be able to meet their postconditions","Kona","","","" +"`LWG3112 `__","``system_error``\ and ``filesystem_error``\ constructors taking a ``string``\ may not be able to meet their postconditions","Kona","|Nothing To Do|","","" "`LWG3119 `__","Program-definedness of closure types","Kona","|Nothing To Do|","","" "`LWG3133 `__","Modernizing numeric type requirements","Kona","","","" "`LWG3144 `__","``span``\ does not have a ``const_pointer``\ typedef","Kona","|Complete|","","" diff --git a/libcxx/test/std/diagnostics/syserr/syserr.syserr/syserr.syserr.members/ctor_error_code_string.pass.cpp b/libcxx/test/std/diagnostics/syserr/syserr.syserr/syserr.syserr.members/ctor_error_code_string.pass.cpp index a464084e55c50..be9dc2834f24d 100644 --- a/libcxx/test/std/diagnostics/syserr/syserr.syserr/syserr.syserr.members/ctor_error_code_string.pass.cpp +++ b/libcxx/test/std/diagnostics/syserr/syserr.syserr/syserr.syserr.members/ctor_error_code_string.pass.cpp @@ -21,12 +21,25 @@ #include "test_macros.h" int main(int, char**) { + { std::string what_arg("test message"); std::system_error se(make_error_code(std::errc::not_a_directory), what_arg); assert(se.code() == std::make_error_code(std::errc::not_a_directory)); std::string what_message(se.what()); assert(what_message.find(what_arg) != std::string::npos); + assert(what_message.find(what_arg.c_str()) != std::string::npos); assert(what_message.find("Not a directory") != std::string::npos); + } - return 0; + { + std::string what_arg("test LWG3112 with and With embedded \0 character"); + std::system_error se(make_error_code(std::errc::not_a_directory), what_arg); + assert(se.code() == std::make_error_code(std::errc::not_a_directory)); + std::string what_message(se.what()); + assert(what_message.find(what_arg) != std::string::npos); + assert(what_message.find(what_arg.c_str()) != std::string::npos); + assert(what_message.find("Not a directory") != std::string::npos); + } + + return 0; } diff --git a/libcxx/test/std/diagnostics/syserr/syserr.syserr/syserr.syserr.members/ctor_int_error_category_string.pass.cpp b/libcxx/test/std/diagnostics/syserr/syserr.syserr/syserr.syserr.members/ctor_int_error_category_string.pass.cpp index 2626fb8cc1f22..f0f7f0fbc7473 100644 --- a/libcxx/test/std/diagnostics/syserr/syserr.syserr/syserr.syserr.members/ctor_int_error_category_string.pass.cpp +++ b/libcxx/test/std/diagnostics/syserr/syserr.syserr/syserr.syserr.members/ctor_int_error_category_string.pass.cpp @@ -21,13 +21,23 @@ #include "test_macros.h" int main(int, char**) { + { std::string what_arg("test message"); - std::system_error se(static_cast(std::errc::not_a_directory), - std::generic_category(), what_arg); + std::system_error se(static_cast(std::errc::not_a_directory), std::generic_category(), what_arg); assert(se.code() == std::make_error_code(std::errc::not_a_directory)); std::string what_message(se.what()); assert(what_message.find(what_arg) != std::string::npos); + assert(what_message.find(what_arg.c_str()) != std::string::npos); assert(what_message.find("Not a directory") != std::string::npos); - - return 0; + } + { + std::string what_arg("test LWG3112 with and With embedded \0 character"); + std::system_error se(static_cast(std::errc::not_a_directory), std::generic_category(), what_arg); + assert(se.code() == std::make_error_code(std::errc::not_a_directory)); + std::string what_message(se.what()); + assert(what_message.find(what_arg) != std::string::npos); + assert(what_message.find(what_arg.c_str()) != std::string::npos); + assert(what_message.find("Not a directory") != std::string::npos); + } + return 0; } diff --git a/libcxx/test/std/input.output/filesystems/class.filesystem_error/filesystem_error.members.pass.cpp b/libcxx/test/std/input.output/filesystems/class.filesystem_error/filesystem_error.members.pass.cpp index fd77810cfa50b..34ac7889ef4a4 100644 --- a/libcxx/test/std/input.output/filesystems/class.filesystem_error/filesystem_error.members.pass.cpp +++ b/libcxx/test/std/input.output/filesystems/class.filesystem_error/filesystem_error.members.pass.cpp @@ -33,49 +33,91 @@ namespace fs = std::filesystem; void test_constructors() { using namespace fs; - // The string returned by "filesystem_error::what() must contain runtime_error::what() - const std::string what_arg = "Hello World"; - const std::string what_contains = std::runtime_error(what_arg).what(); - assert(what_contains.find(what_arg) != std::string::npos); - auto CheckWhat = [what_contains](filesystem_error const& e) { - std::string s = e.what(); - assert(s.find(what_contains) != std::string::npos); - }; + { + // The string returned by "filesystem_error::what() must contain runtime_error::what().c_str() + const std::string what_arg = "Hello World"; + const std::string what_contains = std::runtime_error(what_arg).what(); + assert(what_contains.find(what_arg) != std::string::npos); + auto CheckWhat = [what_contains](filesystem_error const& e) { + std::string s = e.what(); + assert(s.find(what_contains.c_str()) != std::string::npos); + }; - std::error_code ec = std::make_error_code(std::errc::file_exists); - const path p1("foo"); - const path p2("bar"); + std::error_code ec = std::make_error_code(std::errc::file_exists); + const path p1("foo"); + const path p2("bar"); - // filesystem_error(const string& what_arg, error_code ec); - { - ASSERT_NOT_NOEXCEPT(filesystem_error(what_arg, ec)); - filesystem_error e(what_arg, ec); - CheckWhat(e); - assert(e.code() == ec); - assert(e.path1().empty() && e.path2().empty()); - } - // filesystem_error(const string& what_arg, const path&, error_code ec); - { - ASSERT_NOT_NOEXCEPT(filesystem_error(what_arg, p1, ec)); - filesystem_error e(what_arg, p1, ec); - CheckWhat(e); - assert(e.code() == ec); - assert(e.path1() == p1); - assert(e.path2().empty()); + // filesystem_error(const string& what_arg, error_code ec); + { + ASSERT_NOT_NOEXCEPT(filesystem_error(what_arg, ec)); + filesystem_error e(what_arg, ec); + CheckWhat(e); + assert(e.code() == ec); + assert(e.path1().empty() && e.path2().empty()); + } + // filesystem_error(const string& what_arg, const path&, error_code ec); + { + ASSERT_NOT_NOEXCEPT(filesystem_error(what_arg, p1, ec)); + filesystem_error e(what_arg, p1, ec); + CheckWhat(e); + assert(e.code() == ec); + assert(e.path1() == p1); + assert(e.path2().empty()); + } + // filesystem_error(const string& what_arg, const path&, const path&, error_code ec); + { + ASSERT_NOT_NOEXCEPT(filesystem_error(what_arg, p1, p2, ec)); + filesystem_error e(what_arg, p1, p2, ec); + CheckWhat(e); + assert(e.code() == ec); + assert(e.path1() == p1); + assert(e.path2() == p2); + } } - // filesystem_error(const string& what_arg, const path&, const path&, error_code ec); { - ASSERT_NOT_NOEXCEPT(filesystem_error(what_arg, p1, p2, ec)); - filesystem_error e(what_arg, p1, p2, ec); - CheckWhat(e); - assert(e.code() == ec); - assert(e.path1() == p1); - assert(e.path2() == p2); + // The string returned by "filesystem_error::what() must contain runtime_error::what().c_str() + const std::string what_arg("test LWG3112 with and With embedded \0 character"); + const std::string what_contains = std::runtime_error(what_arg).what(); + assert(what_contains.find(what_arg) != std::string::npos); + auto CheckWhat = [what_contains](filesystem_error const& e) { + std::string s = e.what(); + assert(s.find(what_contains.c_str()) != std::string::npos); + }; + + std::error_code ec = std::make_error_code(std::errc::file_exists); + const path p1("foo"); + const path p2("bar"); + + // filesystem_error(const string& what_arg, error_code ec); + { + ASSERT_NOT_NOEXCEPT(filesystem_error(what_arg, ec)); + filesystem_error e(what_arg, ec); + CheckWhat(e); + assert(e.code() == ec); + assert(e.path1().empty() && e.path2().empty()); + } + // filesystem_error(const string& what_arg, const path&, error_code ec); + { + ASSERT_NOT_NOEXCEPT(filesystem_error(what_arg, p1, ec)); + filesystem_error e(what_arg, p1, ec); + CheckWhat(e); + assert(e.code() == ec); + assert(e.path1() == p1); + assert(e.path2().empty()); + } + // filesystem_error(const string& what_arg, const path&, const path&, error_code ec); + { + ASSERT_NOT_NOEXCEPT(filesystem_error(what_arg, p1, p2, ec)); + filesystem_error e(what_arg, p1, p2, ec); + CheckWhat(e); + assert(e.code() == ec); + assert(e.path1() == p1); + assert(e.path2() == p2); + } } } -void test_signatures() -{ +void test_signatures() { using namespace fs; const path p; std::error_code ec;