[libcxx-commits] [libcxx] [NFC][libc++][exceptions] Adds tests for LWG3112. (PR #100881)
Mark de Wever via libcxx-commits
libcxx-commits at lists.llvm.org
Sun Aug 4 03:40:45 PDT 2024
https://github.com/mordante updated https://github.com/llvm/llvm-project/pull/100881
>From d562d3acb4c81387d437a28f92409b1c5b03d275 Mon Sep 17 00:00:00 2001
From: Mark de Wever <koraq at xs4all.nl>
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 <https://wg21.link/LWG3077>`__","``(push|emplace)_back``\ should invalidate the ``end``\ iterator","Kona","|Nothing To Do|","",""
"`LWG3087 <https://wg21.link/LWG3087>`__","One final ``&x``\ in |sect|\ [list.ops]","Kona","|Nothing To Do|","",""
"`LWG3101 <https://wg21.link/LWG3101>`__","``span``\ 's ``Container``\ constructors need another constraint","Kona","|Complete|","",""
-"`LWG3112 <https://wg21.link/LWG3112>`__","``system_error``\ and ``filesystem_error``\ constructors taking a ``string``\ may not be able to meet their postconditions","Kona","","",""
+"`LWG3112 <https://wg21.link/LWG3112>`__","``system_error``\ and ``filesystem_error``\ constructors taking a ``string``\ may not be able to meet their postconditions","Kona","|Nothing To Do|","",""
"`LWG3119 <https://wg21.link/LWG3119>`__","Program-definedness of closure types","Kona","|Nothing To Do|","",""
"`LWG3133 <https://wg21.link/LWG3133>`__","Modernizing numeric type requirements","Kona","","",""
"`LWG3144 <https://wg21.link/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<int>(std::errc::not_a_directory),
- std::generic_category(), what_arg);
+ std::system_error se(static_cast<int>(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<int>(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;
More information about the libcxx-commits
mailing list