[libcxx] r299100 - Implement LWG 2842 - optional(U&&) needs to SFINAE on decay_t<in_place_t>

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 30 12:43:50 PDT 2017


Author: ericwf
Date: Thu Mar 30 14:43:50 2017
New Revision: 299100

URL: http://llvm.org/viewvc/llvm-project?rev=299100&view=rev
Log:
Implement LWG 2842 - optional(U&&) needs to SFINAE on decay_t<in_place_t>

Modified:
    libcxx/trunk/include/optional
    libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/U.pass.cpp
    libcxx/trunk/www/cxx1z_status.html

Modified: libcxx/trunk/include/optional
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/optional?rev=299100&r1=299099&r2=299100&view=diff
==============================================================================
--- libcxx/trunk/include/optional (original)
+++ libcxx/trunk/include/optional Thu Mar 30 14:43:50 2017
@@ -531,7 +531,7 @@ private:
     };
     template <class _Up>
     using _CheckOptionalArgsCtor = conditional_t<
-        !is_same_v<in_place_t, _Up> &&
+        !is_same_v<decay_t<_Up>, in_place_t> &&
         !is_same_v<decay_t<_Up>, optional>,
         _CheckOptionalArgsConstructor,
         __check_tuple_constructor_fail

Modified: libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/U.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/U.pass.cpp?rev=299100&r1=299099&r2=299100&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/U.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/U.pass.cpp Thu Mar 30 14:43:50 2017
@@ -35,6 +35,11 @@ struct ExplicitThrow
     constexpr explicit ExplicitThrow(int x) { if (x != -1) TEST_THROW(6);}
 };
 
+struct ImplicitAny {
+  template <class U>
+  constexpr ImplicitAny(U&&) {}
+};
+
 
 template <class To, class From>
 constexpr bool implicit_conversion(optional<To>&& opt, const From& v)
@@ -79,6 +84,15 @@ void test_implicit()
         using T = TestTypes::TestType;
         assert(implicit_conversion<T>(3, T(3)));
     }
+  {
+    using O = optional<ImplicitAny>;
+    static_assert(!test_convertible<O, std::in_place_t>(), "");
+    static_assert(!test_convertible<O, std::in_place_t&>(), "");
+    static_assert(!test_convertible<O, const std::in_place_t&>(), "");
+    static_assert(!test_convertible<O, std::in_place_t&&>(), "");
+    static_assert(!test_convertible<O, const std::in_place_t&&>(), "");
+
+  }
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         try {

Modified: libcxx/trunk/www/cxx1z_status.html
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/www/cxx1z_status.html?rev=299100&r1=299099&r2=299100&view=diff
==============================================================================
--- libcxx/trunk/www/cxx1z_status.html (original)
+++ libcxx/trunk/www/cxx1z_status.html Thu Mar 30 14:43:50 2017
@@ -460,7 +460,7 @@
 	<tr><td><a href="http://wg21.link/LWG2835">2835</a></td><td>LWG 2536 seems to misspecify <tgmath.h></td><td>Kona</td><td></td></tr>
 	<tr><td><a href="http://wg21.link/LWG2837">2837</a></td><td>gcd and lcm should support a wider range of input values</td><td>Kona</td><td>Complete</td></tr>
 	<tr><td><a href="http://wg21.link/LWG2838">2838</a></td><td>is_literal_type specification needs a little cleanup</td><td>Kona</td><td>Complete</td></tr>
-	<tr><td><a href="http://wg21.link/LWG2842">2842</a></td><td>in_place_t check for optional::optional(U&&) should decay U</td><td>Kona</td><td></td></tr>
+	<tr><td><a href="http://wg21.link/LWG2842">2842</a></td><td>in_place_t check for optional::optional(U&&) should decay U</td><td>Kona</td><td>Complete</td></tr>
 	<tr><td><a href="http://wg21.link/LWG2850">2850</a></td><td>std::function move constructor does unnecessary work</td><td>Kona</td><td></td></tr>
 	<tr><td><a href="http://wg21.link/LWG2853">2853</a></td><td>Possible inconsistency in specification of erase in [vector.modifiers]</td><td>Kona</td><td></td></tr>
 	<tr><td><a href="http://wg21.link/LWG2855">2855</a></td><td>std::throw_with_nested("string_literal")</td><td>Kona</td><td></td></tr>




More information about the cfe-commits mailing list