From 258ee761eb789d1eb6302c79906d9c0f5b0b3cb0 Mon Sep 17 00:00:00 2001 From: Barrett Adair Date: Fri, 6 Jan 2017 15:27:01 +0000 Subject: [PATCH] Use fold expressions to reduce std::variant instantiation depth 2017-01-06 Barrett Adair Jonathan Wakely * include/std/variant (variant, swap): Replace __and_ usage with fold expressions. Co-Authored-By: Jonathan Wakely From-SVN: r244163 --- libstdc++-v3/ChangeLog | 6 ++++++ libstdc++-v3/include/std/variant | 33 ++++++++++++++++---------------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b172a54ee61..eee7808ab1d 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2017-01-06 Barrett Adair + Jonathan Wakely + + * include/std/variant (variant, swap): Replace __and_ usage with fold + expressions. + 2017-01-06 Rainer Orth PR go/78978 diff --git a/libstdc++-v3/include/std/variant b/libstdc++-v3/include/std/variant index 1803315dab6..3d025a767d7 100644 --- a/libstdc++-v3/include/std/variant +++ b/libstdc++-v3/include/std/variant @@ -396,7 +396,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } _Variant_base(_Variant_base&& __rhs) - noexcept(__and_...>::value) + noexcept((is_nothrow_move_constructible_v<_Types> && ...)) { if (__rhs._M_valid()) { @@ -459,8 +459,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Variant_base& operator=(_Variant_base&& __rhs) - noexcept(__and_..., - is_nothrow_move_assignable<_Types>...>::value) + noexcept((is_nothrow_move_constructible_v<_Types> && ...) + && (is_nothrow_move_assignable_v<_Types> && ...)) { if (this->_M_index == __rhs._M_index) { @@ -865,8 +865,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { __lhs.swap(__rhs); } template - enable_if_t..., - is_swappable<_Types>...>::value> + enable_if_t && ...) + && (is_swappable_v<_Types> && ...))> swap(variant<_Types...>&, variant<_Types...>&) = delete; class bad_variant_access : public exception @@ -895,13 +895,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION is_default_constructible_v< variant_alternative_t<0, variant<_Types...>>>, variant<_Types...>>, private _Enable_copy_move< - __and_...>::value, - __and_..., - is_move_constructible<_Types>..., - is_copy_assignable<_Types>...>::value, - __and_...>::value, - __and_..., - is_move_assignable<_Types>...>::value, + (is_copy_constructible_v<_Types> && ...), + (is_copy_constructible_v<_Types> && ...) + && (is_move_constructible_v<_Types> && ...) + && (is_copy_assignable_v<_Types> && ...), + (is_move_constructible_v<_Types> && ...), + (is_move_constructible_v<_Types> && ...) + && (is_move_assignable_v<_Types> && ...), variant<_Types...>> { private: @@ -948,8 +948,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION noexcept(is_nothrow_default_constructible_v<__to_type<0>>) = default; variant(const variant&) = default; variant(variant&&) - noexcept(__and_< - is_nothrow_move_constructible<_Types>...>::value) = default; + noexcept((is_nothrow_move_constructible_v<_Types> && ...)) = default; template> @@ -1003,8 +1002,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION variant& operator=(const variant&) = default; variant& operator=(variant&&) - noexcept(__and_..., - is_nothrow_move_assignable<_Types>...>::value) = default; + noexcept((is_nothrow_move_constructible_v<_Types> && ...) + && (is_nothrow_move_assignable_v<_Types> && ...)) = default; template enable_if_t<__exactly_once<__accepted_type<_Tp&&>> @@ -1091,7 +1090,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION void swap(variant& __rhs) - noexcept(__and_<__is_nothrow_swappable<_Types>...>::value + noexcept((__is_nothrow_swappable<_Types>::value && ...) && is_nothrow_move_constructible_v) { if (this->index() == __rhs.index()) -- 2.30.2