[libcxx-commits] [libcxx] c545141 - [libc++] Don't explicitly rethrow in flat container function try blocks (#230988)

via libcxx-commits libcxx-commits at lists.llvm.org
Tue Oct 13 01:56:15 PDT 2026


Author: Nikolas Klauser
Date: 2026-10-13T10:56:10+02:00
New Revision: c545141b33eed1b253fbb0246bd5bdfd0c26ab58

URL: https://github.com/llvm/llvm-project/commit/c545141b33eed1b253fbb0246bd5bdfd0c26ab58
DIFF: https://github.com/llvm/llvm-project/commit/c545141b33eed1b253fbb0246bd5bdfd0c26ab58.diff

LOG: [libc++] Don't explicitly rethrow in flat container function try blocks (#230988)

We currently have some relatively complex code in the flat containers'
function catch blocks to work around a GCC warning. Instead, we can let
the rethrow happen implicitly.

As a drive-by this also simplifies the brace positioning.

Added: 
    

Modified: 
    libcxx/include/__flat_map/flat_map.h
    libcxx/include/__flat_map/flat_multimap.h
    libcxx/include/__flat_set/flat_multiset.h
    libcxx/include/__flat_set/flat_set.h

Removed: 
    


################################################################################
diff  --git a/libcxx/include/__flat_map/flat_map.h b/libcxx/include/__flat_map/flat_map.h
index 27964aa421d21..fb724fa3a16ee 100644
--- a/libcxx/include/__flat_map/flat_map.h
+++ b/libcxx/include/__flat_map/flat_map.h
@@ -154,16 +154,12 @@ class flat_map {
 #  endif // _LIBCPP_HAS_EXCEPTIONS
       : __containers_(std::move(__other.__containers_)), __compare_(std::move(__other.__compare_)) {
     __other.clear();
+  }
 #  if _LIBCPP_HAS_EXCEPTIONS
-  } catch (...) {
+  catch (...) {
     __other.clear();
-    // gcc does not like the `throw` keyword in a conditionally noexcept function
-    if constexpr (!(is_nothrow_move_constructible_v<_KeyContainer> &&
-                    is_nothrow_move_constructible_v<_MappedContainer> && is_nothrow_move_constructible_v<_Compare>)) {
-      throw;
-    }
-#  endif // _LIBCPP_HAS_EXCEPTIONS
   }
+#  endif // _LIBCPP_HAS_EXCEPTIONS
 
   template <class _Allocator>
     requires __allocator_ctor_constraint<_Allocator>
@@ -186,12 +182,12 @@ class flat_map {
                  std::move(__other.__containers_.values),
                  std::move(__other.__compare_)) {
     __other.clear();
+  }
 #  if _LIBCPP_HAS_EXCEPTIONS
-  } catch (...) {
+  catch (...) {
     __other.clear();
-    throw;
-#  endif // _LIBCPP_HAS_EXCEPTIONS
   }
+#  endif // _LIBCPP_HAS_EXCEPTIONS
 
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 flat_map(
       key_container_type __key_cont, mapped_container_type __mapped_cont, const key_compare& __comp = key_compare())

diff  --git a/libcxx/include/__flat_map/flat_multimap.h b/libcxx/include/__flat_map/flat_multimap.h
index 9acaedf0772a0..677560660a6de 100644
--- a/libcxx/include/__flat_map/flat_multimap.h
+++ b/libcxx/include/__flat_map/flat_multimap.h
@@ -154,16 +154,12 @@ class flat_multimap {
 #  endif // _LIBCPP_HAS_EXCEPTIONS
       : __containers_(std::move(__other.__containers_)), __compare_(std::move(__other.__compare_)) {
     __other.clear();
+  }
 #  if _LIBCPP_HAS_EXCEPTIONS
-  } catch (...) {
+  catch (...) {
     __other.clear();
-    // gcc does not like the `throw` keyword in a conditionally noexcept function
-    if constexpr (!(is_nothrow_move_constructible_v<_KeyContainer> &&
-                    is_nothrow_move_constructible_v<_MappedContainer> && is_nothrow_move_constructible_v<_Compare>)) {
-      throw;
-    }
-#  endif // _LIBCPP_HAS_EXCEPTIONS
   }
+#  endif // _LIBCPP_HAS_EXCEPTIONS
 
   template <class _Allocator>
     requires __allocator_ctor_constraint<_Allocator>
@@ -187,12 +183,12 @@ class flat_multimap {
                       std::move(__other.__containers_.values),
                       std::move(__other.__compare_)) {
     __other.clear();
+  }
 #  if _LIBCPP_HAS_EXCEPTIONS
-  } catch (...) {
+  catch (...) {
     __other.clear();
-    throw;
-#  endif // _LIBCPP_HAS_EXCEPTIONS
   }
+#  endif // _LIBCPP_HAS_EXCEPTIONS
 
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 flat_multimap(
       key_container_type __key_cont, mapped_container_type __mapped_cont, const key_compare& __comp = key_compare())

diff  --git a/libcxx/include/__flat_set/flat_multiset.h b/libcxx/include/__flat_set/flat_multiset.h
index 74c0427eae928..d549f7ab78f1b 100644
--- a/libcxx/include/__flat_set/flat_multiset.h
+++ b/libcxx/include/__flat_set/flat_multiset.h
@@ -112,15 +112,12 @@ class flat_multiset {
 #  endif // _LIBCPP_HAS_EXCEPTIONS
       : __keys_(std::move(__other.__keys_)), __compare_(std::move(__other.__compare_)) {
     __other.clear();
+  }
 #  if _LIBCPP_HAS_EXCEPTIONS
-  } catch (...) {
+  catch (...) {
     __other.clear();
-    // gcc does not like the `throw` keyword in a conditionally noexcept function
-    if constexpr (!(is_nothrow_move_constructible_v<_KeyContainer> && is_nothrow_move_constructible_v<_Compare>)) {
-      throw;
-    }
-#  endif // _LIBCPP_HAS_EXCEPTIONS
   }
+#  endif // _LIBCPP_HAS_EXCEPTIONS
 
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 explicit flat_multiset(const key_compare& __comp)
       : __keys_(), __compare_(__comp) {}
@@ -231,12 +228,12 @@ class flat_multiset {
       : __keys_(std::make_obj_using_allocator<container_type>(__alloc, std::move(__other.__keys_))),
         __compare_(std::move(__other.__compare_)) {
     __other.clear();
+  }
 #  if _LIBCPP_HAS_EXCEPTIONS
-  } catch (...) {
+  catch (...) {
     __other.clear();
-    throw;
-#  endif // _LIBCPP_HAS_EXCEPTIONS
   }
+#  endif // _LIBCPP_HAS_EXCEPTIONS
 
   template <class _InputIterator, class _Allocator>
     requires(__has_input_iterator_category<_InputIterator>::value && uses_allocator<container_type, _Allocator>::value)

diff  --git a/libcxx/include/__flat_set/flat_set.h b/libcxx/include/__flat_set/flat_set.h
index 988ffbe1b4a70..63f3b6519cb6a 100644
--- a/libcxx/include/__flat_set/flat_set.h
+++ b/libcxx/include/__flat_set/flat_set.h
@@ -113,15 +113,12 @@ class flat_set {
 #  endif // _LIBCPP_HAS_EXCEPTIONS
       : __keys_(std::move(__other.__keys_)), __compare_(std::move(__other.__compare_)) {
     __other.clear();
+  }
 #  if _LIBCPP_HAS_EXCEPTIONS
-  } catch (...) {
+  catch (...) {
     __other.clear();
-    // gcc does not like the `throw` keyword in a conditionally noexcept function
-    if constexpr (!(is_nothrow_move_constructible_v<_KeyContainer> && is_nothrow_move_constructible_v<_Compare>)) {
-      throw;
-    }
-#  endif // _LIBCPP_HAS_EXCEPTIONS
   }
+#  endif // _LIBCPP_HAS_EXCEPTIONS
 
   _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 explicit flat_set(const key_compare& __comp)
       : __keys_(), __compare_(__comp) {}
@@ -232,12 +229,12 @@ class flat_set {
       : __keys_(std::make_obj_using_allocator<container_type>(__alloc, std::move(__other.__keys_))),
         __compare_(std::move(__other.__compare_)) {
     __other.clear();
+  }
 #  if _LIBCPP_HAS_EXCEPTIONS
-  } catch (...) {
+  catch (...) {
     __other.clear();
-    throw;
-#  endif // _LIBCPP_HAS_EXCEPTIONS
   }
+#  endif // _LIBCPP_HAS_EXCEPTIONS
 
   template <class _InputIterator, class _Allocator>
     requires(__has_input_iterator_category<_InputIterator>::value && uses_allocator<container_type, _Allocator>::value)


        


More information about the libcxx-commits mailing list