[libcxx-commits] [PATCH] D136318: [libc++] type_traits: fix short-circuiting in std::conjunction.
Nikolas Klauser via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Oct 21 04:09:51 PDT 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGa0549ee2a390: [libc++] type_traits: fix short-circuiting in std::conjunction. (authored by jacobsa, committed by philnik).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D136318/new/
https://reviews.llvm.org/D136318
Files:
libcxx/include/__type_traits/conjunction.h
libcxx/test/std/utilities/meta/meta.logical/conjunction.compile.pass.cpp
libcxx/test/std/utilities/meta/meta.logical/disjunction.compile.pass.cpp
Index: libcxx/test/std/utilities/meta/meta.logical/disjunction.compile.pass.cpp
===================================================================
--- libcxx/test/std/utilities/meta/meta.logical/disjunction.compile.pass.cpp
+++ libcxx/test/std/utilities/meta/meta.logical/disjunction.compile.pass.cpp
@@ -80,6 +80,13 @@
static_assert(std::disjunction<std::true_type, HasNoValue>::value);
static_assert(std::disjunction_v<std::true_type, HasNoValue>);
+// Also check the case where HasNoValue is not the last in the list (https://llvm.org/PR584900).
+static_assert(std::disjunction<std::true_type, HasNoValue, std::true_type>::value);
+static_assert(std::disjunction_v<std::true_type, HasNoValue, std::true_type>);
+
+static_assert(std::disjunction<std::true_type, HasNoValue, std::false_type>::value);
+static_assert(std::disjunction_v<std::true_type, HasNoValue, std::false_type>);
+
static_assert(std::disjunction<MySpecialTrueType>::value == -1);
static_assert(std::disjunction_v<MySpecialTrueType>);
Index: libcxx/test/std/utilities/meta/meta.logical/conjunction.compile.pass.cpp
===================================================================
--- libcxx/test/std/utilities/meta/meta.logical/conjunction.compile.pass.cpp
+++ libcxx/test/std/utilities/meta/meta.logical/conjunction.compile.pass.cpp
@@ -80,6 +80,13 @@
static_assert(!std::conjunction<std::false_type, HasNoValue>::value);
static_assert(!std::conjunction_v<std::false_type, HasNoValue>);
+// Also check the case where HasNoValue is not the last in the list (https://llvm.org/PR584900).
+static_assert(!std::conjunction<std::false_type, HasNoValue, std::true_type>::value);
+static_assert(!std::conjunction_v<std::false_type, HasNoValue, std::true_type>);
+
+static_assert(!std::conjunction<std::false_type, HasNoValue, std::false_type>::value);
+static_assert(!std::conjunction_v<std::false_type, HasNoValue, std::false_type>);
+
static_assert(std::conjunction<MyOtherSpecialTrueType>::value == -1);
static_assert(std::conjunction_v<MyOtherSpecialTrueType>);
Index: libcxx/include/__type_traits/conjunction.h
===================================================================
--- libcxx/include/__type_traits/conjunction.h
+++ libcxx/include/__type_traits/conjunction.h
@@ -20,26 +20,6 @@
_LIBCPP_BEGIN_NAMESPACE_STD
-#if _LIBCPP_STD_VER > 14
-
-template <class _Arg, class... _Args>
-struct __conjunction_impl {
- using type = conditional_t<!bool(_Arg::value), _Arg, typename __conjunction_impl<_Args...>::type>;
-};
-
-template <class _Arg>
-struct __conjunction_impl<_Arg> {
- using type = _Arg;
-};
-
-template <class... _Args>
-struct conjunction : __conjunction_impl<true_type, _Args...>::type {};
-
-template<class... _Args>
-inline constexpr bool conjunction_v = conjunction<_Args...>::value;
-
-#endif // _LIBCPP_STD_VER > 14
-
template <class...>
using __expand_to_true = true_type;
@@ -52,6 +32,22 @@
template <class... _Pred>
using _And _LIBCPP_NODEBUG = decltype(__and_helper<_Pred...>(0));
+#if _LIBCPP_STD_VER > 14
+
+template <class...>
+struct conjunction : true_type {};
+
+template <class _Arg>
+struct conjunction<_Arg> : _Arg {};
+
+template <class _Arg, class... _Args>
+struct conjunction<_Arg, _Args...> : conditional_t<!bool(_Arg::value), _Arg, conjunction<_Args...>> {};
+
+template <class... _Args>
+inline constexpr bool conjunction_v = conjunction<_Args...>::value;
+
+#endif // _LIBCPP_STD_VER > 14
+
_LIBCPP_END_NAMESPACE_STD
#endif // _LIBCPP___TYPE_TRAITS_CONJUNCTION_H
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D136318.469544.patch
Type: text/x-patch
Size: 3512 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20221021/dc48cb06/attachment.bin>
More information about the libcxx-commits
mailing list