https://bugs.llvm.org/show_bug.cgi?id=45198
The following:
template< typename T, enable_if_t<is_move_assignable<T>::value> = true, enable_if_t<is_move_constructible<T>::value> = true> constexpr void swap(T &lhs, T &rhs) noexcept( is_nothrow_move_constructible<T>::value && is_nothrow_move_assignable<T>::value)
Results in this:
template< typename T, enable_if_t<is_move_assignable<T>::value> = true, enable_if_t<is_move_constructible<T>::value> = true> constexpr void swap(T &lhs, T &rhs) noexcept( is_nothrow_move_constructible<T>::value &&is_nothrow_move_assignable<T>::value)
This is because the && in is_nothrow_move_constructible<T>::value &&is_nothrow_move_assignable<T>::value gets incorrectly determined to be a TT_PointerOrReference
This revision attempts to detect determine a cases where this cannot be true especially in a noexcept context where the result is expected to be boolean