]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Add allocator-extended constructors to std::match_results (LWG 2195)
authorJonathan Wakely <jwakely@redhat.com>
Wed, 22 Mar 2023 11:36:06 +0000 (11:36 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 22 Mar 2023 17:48:19 +0000 (17:48 +0000)
This was approved in Issaquah last month.

libstdc++-v3/ChangeLog:

* include/bits/regex.h (match_results): Add allocator-extended
copy and move constructors, as per LWG 2195.
* testsuite/28_regex/match_results/ctors/char/alloc.cc: New test.

libstdc++-v3/include/bits/regex.h
libstdc++-v3/testsuite/28_regex/match_results/ctors/char/alloc.cc [new file with mode: 0644]

index 386f4be9f4a78dc768cfa722ea1571fab172b6e6..79903fad1e530f4db516358446bb21bc55ec832b 100644 (file)
@@ -1826,6 +1826,16 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
        */
       ~match_results() = default;
 
+      // _GLIBCXX_RESOLVE_LIB_DEFECTS
+      // 2195. Missing constructors for match_results
+
+      match_results(const match_results& __m, const _Alloc& __a)
+      : _Base_type(__m, __a) { }
+
+      match_results(match_results&& __m, const _Alloc& __a)
+      noexcept(noexcept(_Base_type(std::move(__m), __a)))
+      : _Base_type(std::move(__m), __a) { }
+
       ///@}
 
       // 28.10.2, state:
diff --git a/libstdc++-v3/testsuite/28_regex/match_results/ctors/char/alloc.cc b/libstdc++-v3/testsuite/28_regex/match_results/ctors/char/alloc.cc
new file mode 100644 (file)
index 0000000..bb5e7a9
--- /dev/null
@@ -0,0 +1,56 @@
+// { dg-do run { target c++11 } }
+
+#include <regex>
+#include <testsuite_hooks.h>
+#include <testsuite_allocator.h>
+
+// LWG 2195. Missing constructors for match_results
+
+void
+test01()
+{
+  using Alloc = std::cmatch::allocator_type;
+  std::cmatch m1;
+  std::cmatch m2(m1, m1.get_allocator());
+  VERIFY( m2 == m1 );
+
+  static_assert( ! std::is_nothrow_constructible<std::cmatch,
+                                                const std::cmatch&,
+                                                const Alloc&>(),
+                "Allocator-extended copy ctor is potentially-throwing" );
+
+  std::cmatch m3(std::move(m1), m2.get_allocator());
+  VERIFY( m3 == m2 );
+
+  // Libstdc++ extension:
+  static_assert( std::is_nothrow_constructible<std::cmatch,
+                                              std::cmatch,
+                                              const Alloc&>(),
+                "Allocator-extended move ctor is non-throwing" );
+}
+
+void
+test02()
+{
+  using Alloc = __gnu_test::uneq_allocator<std::csub_match>;
+  using MR = std::match_results<const char*, Alloc>;
+
+  MR m1(Alloc(1));
+  MR m2(m1, Alloc(2));
+  VERIFY( m2 == m1 );
+
+  static_assert( ! std::is_nothrow_constructible<MR, const MR&, const Alloc&>(),
+                "Allocator-extended copy ctor is potentially-throwing" );
+
+  MR m3(std::move(m1), Alloc(3));
+  VERIFY( m3 == m2 );
+
+  static_assert( ! std::is_nothrow_constructible<MR, MR, const Alloc&>(),
+                "Allocator-extended move ctor is potentially-throwing" );
+}
+
+int main()
+{
+  test01();
+  test02();
+}