Quuxplusone accepted this revision.
Quuxplusone added a comment.

Suggested some ways to improve test coverage, and continued bikeshedding on the 
SFINAE ;) but there's no reason to hold this up AFAIC.



================
Comment at: libcxx/include/tuple:58
     tuple& operator=(const tuple&);
-    tuple&
-        operator=(tuple&&) noexcept(AND(is_nothrow_move_assignable<T>::value 
...));
+    tuple& operator=(tuple&&) 
noexcept(AND(is_nothrow_move_assignable<T>::value ...));
     template <class... U>
----------------
Since this already isn't mimicking the syntax of 
http://eel.is/c++draft/tuple.tuple#tuple.assign-1 , I think you should say

    tuple& operator=(tuple&&) noexcept(is_nothrow_move_assignable_v<T> && ...);

but it definitely doesn't matter.


================
Comment at: libcxx/include/tuple:975
+
+    // EXTENSION
+    template<class _Up, size_t _Np, class = _EnableIf<
----------------
Perhaps in a followup patch: could we delineate exactly what code is part of 
this extension and put it all under an `#if _LIBCPP_TUPLE_ARRAY_ASSIGNMENT` or 
something, such that we could say "this is the exact extent of the extension 
code" and maybe even get customers to try compiling with 
`-D_LIBCPP_TUPLE_ARRAY_ASSIGNMENT=0` to see what breaks?

I'm assuming that our goal here is to deprecate and remove this extension over 
time. But even if we support it forever, I think `#if` would be nicer than the 
`//EXTENSION` comments.


================
Comment at: libcxx/include/tuple:992
+    // EXTENSION
+    template<class _Up, size_t _Np, class = void, class = _EnableIf<
+        _And<
----------------
Nitpick: Sent you a Slack suggesting how to eliminate this `class = void`.


================
Comment at: 
libcxx/test/libcxx/utilities/tuple/tuple.tuple/tuple.assign/const_array.pass.cpp:53
+        typedef std::array<int, 1> Array;
+        static_assert(!std::is_nothrow_assignable<Tuple&, Array 
const&>::value, "");
+    }
----------------
I would like to see this file combined with rvalue_array.pass.cpp, and also 
test the currently missing two value categories:

    static_assert(std::is_nothrow_assignable<Tuple&, Array&>::value, "");
    static_assert(std::is_nothrow_assignable<Tuple&, const Array&&>::value, "");

and also the negative cases:

    static_assert(!std::is_assignable<Tuple&, std::array<long,2>&>::value, "");
    static_assert(!std::is_assignable<Tuple&, std::array<long,2>&&>::value, "");
    static_assert(!std::is_assignable<Tuple&, const 
std::array<long,2>&>::value, "");
    static_assert(!std::is_assignable<Tuple&, const 
std::array<long,2>&&>::value, "");

    static_assert(!std::is_assignable<Tuple&, std::array<long,4>&>::value, "");
    static_assert(!std::is_assignable<Tuple&, std::array<long,4>&&>::value, "");
    static_assert(!std::is_assignable<Tuple&, const 
std::array<long,4>&>::value, "");
    static_assert(!std::is_assignable<Tuple&, const 
std::array<long,4>&&>::value, "");



================
Comment at: 
libcxx/test/std/utilities/tuple/tuple.tuple/tuple.assign/const_pair.pass.cpp:52
+        typedef std::pair<PotentiallyThrowingCopyAssignable, int> Pair;
+        static_assert(!std::is_nothrow_assignable<Tuple&, Pair const&>::value, 
"");
+    }
----------------
Don't just test for lack-of-nothrow-assignability; test for 
assignability-but-maythrow:

    static_assert(std::is_assignable<Tuple&, Pair const&>::value, "");
    static_assert(!std::is_nothrow_assignable<Tuple&, Pair const&>::value, "");

And as above, I'd prefer to see tests for `Pair&` and `Pair&&` and `const 
Pair&&` as well.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D50106/new/

https://reviews.llvm.org/D50106

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to