[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