[libcxx-commits] [PATCH] D97394: [libc++] [C++2b] [P2162] Allow inheritance from std::variant.

Arthur O'Dwyer via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Wed Mar 24 16:53:15 PDT 2021


Quuxplusone accepted this revision as: Quuxplusone.
Quuxplusone added a comment.

LGTM!
My understanding is that it's still blocked on @ldionne to re-review and see if his (very long-ago) comments have been sufficiently addressed.



================
Comment at: libcxx/include/variant:340
+  return _VSTD::move(__vs);
+}
+
----------------
Minor bikeshed: `&` `const&` `const&&` `&&` is a weird order to put these four overloads in :)


================
Comment at: libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp:4107
 
-# if !_LIBCPP_HAS_NO_CONCEPTS
+# if defined(__cpp_concepts) && __cpp_concepts >= 201907L
 #   ifndef __cpp_lib_math_constants
----------------
Make sure to re-run the generator scripts before landing. This diff //should// go away, I think.


================
Comment at: libcxx/test/std/utilities/variant/variant.visit/visit.pass.cpp:421
+  static_assert(!has_visit<BadVariant2>(0));
+  static_assert(has_visit<std::variant<int> >(0));
+  static_assert(has_visit<GoodVariant>(0));
----------------
nit: `>>` is OK here


================
Comment at: libcxx/test/std/utilities/variant/variant.visit/visit.pass.cpp:357
+
+  // Check that visit does not take index nor valueless_by_exception members from the base class.
+  struct EvilVariantBase {
----------------
curdeius wrote:
> Quuxplusone wrote:
> > From the outside, it seems vastly more important to verify that `visit` does not take `std::get<Idx>(v)` specializations from the base class. Could you add a test for that?
> > Of course it probably isn't necessary to test //all// the possible entry-points, right? they should all work pretty much the same?
> Not sure if I correctly understood what test you suggested. Could you have a look please?
Yes, that's what I meant. :) Except let's make one of those MyVariant arguments a const reference too, for extra overload-resolution matchy-matchiness.
```
const MyVariant v1 = 42;
std::visit([](auto x) { assert(x == 42); }, v1);
std::visit([](auto x) { assert(x == -1.25f); }, MyVariant(-1.25f));
```
Drive-by changed the float to a value that can be represented exactly in base-2, because I'm paranoid about floats. :)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D97394



More information about the libcxx-commits mailing list