diff --git a/include/scoped_allocator b/include/scoped_allocator index 22e3a308..cd4987ad 100644 --- a/include/scoped_allocator +++ b/include/scoped_allocator @@ -183,7 +183,7 @@ template struct __get_is_always_equal<_A0, _Allocs...> { static const bool value = - allocator_traits<_A0>::is_always_equal::value || + allocator_traits<_A0>::is_always_equal::value && __get_is_always_equal<_Allocs...>::value; }; diff --git a/test/std/utilities/allocator.adaptor/allocator.adaptor.types/is_always_equal.pass.cpp b/test/std/utilities/allocator.adaptor/allocator.adaptor.types/is_always_equal.pass.cpp new file mode 100644 index 00000000..e19e731f --- /dev/null +++ b/test/std/utilities/allocator.adaptor/allocator.adaptor.types/is_always_equal.pass.cpp @@ -0,0 +1,75 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// template +// class scoped_allocator_adaptor + +// typedef see below is_always_equal; + +#include +#include + +#include "allocators.h" +#include "min_allocator.h" + +int main() +{ +#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + // sanity checks + static_assert( (std::is_same< + std::allocator_traits>::is_always_equal, std::false_type>::value + ), "" ); + + static_assert( (std::is_same< + std::allocator_traits>::is_always_equal, std::true_type>::value + ), "" ); + + // wrapping one allocator + static_assert( + (std::is_same< + std::scoped_allocator_adaptor>::is_always_equal, + std::allocator_traits>::is_always_equal + >::value), ""); + + // wrapping one allocator + static_assert( + (std::is_same< + std::scoped_allocator_adaptor>::is_always_equal, + std::allocator_traits>::is_always_equal + >::value), ""); + + // wrapping two allocators (check the values instead of the types) + static_assert(( + std::scoped_allocator_adaptor, A2>::is_always_equal::value == + ( std::allocator_traits>::is_always_equal::value && + std::allocator_traits>::is_always_equal::value) + ), ""); + + // wrapping two allocators (check the values instead of the types) + static_assert(( + std::scoped_allocator_adaptor, min_allocator>::is_always_equal::value == + ( std::allocator_traits>::is_always_equal::value && + std::allocator_traits>::is_always_equal::value) + ), ""); + + + // wrapping three allocators (check the values instead of the types) + static_assert(( + std::scoped_allocator_adaptor, A2, A3>::is_always_equal::value == + ( std::allocator_traits>::is_always_equal::value && + std::allocator_traits>::is_always_equal::value && + std::allocator_traits>::is_always_equal::value) + ), ""); + + +#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +}