[llvm] r279052 - Revert "ADT: Tidy up ilist_traits static asserts, NFC"
Duncan P. N. Exon Smith via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 19 13:30:05 PDT 2016
FYI, I've recommitted this as r279312 (without the parts from r278974).
> On 2016-Aug-18, at 04:17, Diana Picus via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>
> Author: rovka
> Date: Thu Aug 18 06:17:47 2016
> New Revision: 279052
>
> URL: http://llvm.org/viewvc/llvm-project?rev=279052&view=rev
> Log:
> Revert "ADT: Tidy up ilist_traits static asserts, NFC"
>
> This reverts commit r279012.
> r278974 broke some bots, I have to revert this to get to it.
>
> Modified:
> llvm/trunk/include/llvm/ADT/ilist.h
> llvm/trunk/unittests/ADT/ilistTest.cpp
>
> Modified: llvm/trunk/include/llvm/ADT/ilist.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ilist.h?rev=279052&r1=279051&r2=279052&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/ADT/ilist.h (original)
> +++ llvm/trunk/include/llvm/ADT/ilist.h Thu Aug 18 06:17:47 2016
> @@ -83,37 +83,34 @@ template <class T> T &make();
>
> /// Type trait to check for a traits class that has a getNext member (as a
> /// canary for any of the ilist_nextprev_traits API).
> -template <class TraitsT, class NodeT> class HasGetNext {
> +template <class TraitsT, class NodeT> struct HasGetNext {
> typedef char Yes[1];
> typedef char No[2];
> template <size_t N> struct SFINAE {};
>
> template <class U>
> - static Yes &test(U *I, decltype(I->getNext(&make<NodeT>())) * = 0);
> - template <class> static No &test(...);
> + static Yes &hasGetNext(
> + SFINAE<sizeof(static_cast<NodeT *>(make<U>().getNext(&make<NodeT>())))>
> + * = 0);
> + template <class U> static No &hasGetNext(...);
>
> -public:
> - static const bool value = sizeof(test<TraitsT>(nullptr)) == sizeof(Yes);
> + static const bool value = sizeof(hasGetNext<TraitsT>(nullptr)) == sizeof(Yes);
> };
>
> /// Type trait to check for a traits class that has a createSentinel member (as
> /// a canary for any of the ilist_sentinel_traits API).
> -template <class TraitsT> class HasCreateSentinel {
> +template <class TraitsT> struct HasCreateSentinel {
> typedef char Yes[1];
> typedef char No[2];
> template <size_t N> struct SFINAE {};
>
> template <class U>
> - static Yes &test(U *I, decltype(I->createSentinel()) * = 0);
> - template <class U> static No &test(...);
> -
> -public:
> - static const bool value = sizeof(test<TraitsT>(nullptr)) == sizeof(Yes);
> -};
> + static Yes &
> + hasCreateSentinel(SFINAE<sizeof(make<U>().createSentinel())> * = 0);
> + template <class U> static No &hasCreateSentinel(...);
>
> -template <class TraitsT, class NodeT> struct HasObsoleteCustomization {
> static const bool value =
> - HasGetNext<TraitsT, NodeT>::value || HasCreateSentinel<TraitsT>::value;
> + sizeof(hasCreateSentinel<TraitsT>(nullptr)) == sizeof(Yes);
> };
>
> } // end namespace ilist_detail
> @@ -290,8 +287,14 @@ template <typename NodeTy, typename Trai
> class iplist : public Traits, ilist_node_access {
> // TODO: Drop these assertions anytime after 4.0 is branched (keep them for
> // one release to help out-of-tree code update).
> - static_assert(!ilist_detail::HasObsoleteCustomization<Traits, NodeTy>::value,
> - "ilist customization points have changed!");
> +#if !defined(_MSC_VER)
> + // FIXME: This fails in MSVC, but it's worth keeping around to help
> + // non-Windows users root out bugs in their ilist_traits.
> + static_assert(!ilist_detail::HasGetNext<Traits, NodeTy>::value,
> + "ilist next and prev links are not customizable!");
> + static_assert(!ilist_detail::HasCreateSentinel<Traits>::value,
> + "ilist sentinel is not customizable!");
> +#endif
>
> ilist_sentinel<NodeTy> Sentinel;
>
>
> Modified: llvm/trunk/unittests/ADT/ilistTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/ilistTest.cpp?rev=279052&r1=279051&r2=279052&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/ADT/ilistTest.cpp (original)
> +++ llvm/trunk/unittests/ADT/ilistTest.cpp Thu Aug 18 06:17:47 2016
> @@ -190,21 +190,4 @@ TEST(ilistTest, privateNode) {
> L2.remove(&N);
> }
>
> -struct GetNext {
> - Node *getNext(Node *);
> -};
> -TEST(ilistTest, HasGetNextTrait) {
> - EXPECT_TRUE((ilist_detail::HasGetNext<GetNext, Node>::value));
> - EXPECT_TRUE((ilist_detail::HasObsoleteCustomization<GetNext, Node>::value));
> -}
> -
> -struct CreateSentinel {
> - Node *createSentinel();
> -};
> -TEST(ilistTest, HasCreateSentinel) {
> - EXPECT_TRUE((ilist_detail::HasCreateSentinel<CreateSentinel>::value));
> - EXPECT_TRUE(
> - (ilist_detail::HasObsoleteCustomization<CreateSentinel, Node>::value));
> -}
> -
> } // end namespace
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list