]> 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>
Mon, 14 Jun 2021 22:13:16 +0000 (23:13 +0100)
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

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

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

index 728d3ad2b257d46a6aefea4b27968e14a2143cee..3bc657ca17ed45f846691d205c04883e801a2131 100644 (file)
@@ -476,7 +476,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 9044dd155da6d1c4fdecdfe0a2ef8ebdf0cc97a3..b2d8b10532565c46777f7ce8d65999864eba2b90 100644 (file)
@@ -89,10 +89,41 @@ test03()
   static_assert( std::ranges::empty(R2{}) );
 }
 
+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();
   test03();
+  test04();
 }