Remove the unnecessary `is_nothrow_swappable` condition in `swap`.
authorMichael Park <mcypark@gmail.com>
Wed, 8 Jul 2020 17:46:02 +0000 (10:46 -0700)
committerMichael Park <mcypark@gmail.com>
Wed, 8 Jul 2020 17:46:38 +0000 (10:46 -0700)
Thanks to @lewissbaker who pointed out the unnecessary condition in
https://reviews.llvm.org/D81954#inline-756872. Since this codepath does not
make use of `swap` anyway (that codepath is a different branch), we can safely
remove this condition and produce better codegen when all types are nothrow
movable but are potentially-throwing swappable.

See codegen in https://gcc.godbolt.org/z/uDFZjz

Reviewed By: ldionne, #libc

Differential Revision: https://reviews.llvm.org/D83274

libcxx/include/variant

index 502d8d8..0355723 100644 (file)
@@ -1063,8 +1063,7 @@ public:
       }
       __impl __tmp(_VSTD::move(*__rhs));
 #ifndef _LIBCPP_NO_EXCEPTIONS
-      if constexpr (__all<(is_nothrow_move_constructible_v<_Types> &&
-                           is_nothrow_swappable_v<_Types>)...>::value) {
+      if constexpr (__all<is_nothrow_move_constructible_v<_Types>...>::value) {
         this->__generic_construct(*__rhs, _VSTD::move(*__lhs));
       } else {
         // EXTENSION: When the move construction of `__lhs` into `__rhs` throws