]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Fix noexcept-specifier for ranges::empty
authorJonathan Wakely <jwakely@redhat.com>
Mon, 14 Jun 2021 21:42:05 +0000 (22:42 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Tue, 26 Apr 2022 13:11:01 +0000 (14:11 +0100)
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

* include/bits/range_access.h (ranges::empty): Check whether
conversion to bool can throw.
* testsuite/std/ranges/access/empty.cc: Check for correct
noexcept-specifier.

(cherry picked from commit f9598d89a9f5a327ecdfa6f6978a0cfbe4447111)

libstdc++-v3/include/bits/range_access.h
libstdc++-v3/testsuite/std/ranges/access/empty.cc

index 36bc55e6559af34ab52543beb42f8047a294dd6e..aee72c3fae40bcba5ea8bf12b34339ea94f61394 100644 (file)
@@ -773,7 +773,7 @@ namespace ranges
        _S_noexcept()
        {
          if constexpr (__member_empty<_Tp>)
-           return noexcept(std::declval<_Tp>().empty());
+           return noexcept(bool(std::declval<_Tp>().empty()));
          else if constexpr (__size0_empty<_Tp>)
            return noexcept(_Size{}(std::declval<_Tp>()) == 0);
          else
index 4b54ed7b36780009453c2fe837454fc408f8dbc0..47dfca6513f9ef93338588b13a119d1cfdd3827f 100644 (file)
@@ -68,9 +68,40 @@ test02()
   VERIFY( !std::ranges::empty(so) );
 }
 
+void
+test04()
+{
+  struct E1
+  {
+    bool empty() const noexcept { return {}; }
+  };
+
+  static_assert( noexcept(std::ranges::empty(E1{})) );
+
+  struct E2
+  {
+    bool empty() const noexcept(false) { return {}; }
+  };
+
+  static_assert( ! noexcept(std::ranges::empty(E2{})) );
+
+  struct E3
+  {
+    struct B
+    {
+      explicit operator bool() const noexcept(false) { return true; }
+    };
+
+    B empty() const noexcept { return {}; }
+  };
+
+  static_assert( ! noexcept(std::ranges::empty(E3{})) );
+}
+
 int
 main()
 {
   test01();
   test02();
+  test04();
 }