//===----------------------------------------------------------------------===// // // 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 // struct allocator_traits // { // static size_type max_size(const allocator_type& a) noexcept; // ... // }; #include #include #include #include template struct A { typedef T value_type; }; template struct B { typedef T value_type; size_t max_size() const { return 100; } }; int main() { #ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE { A a; assert(std::allocator_traits >::max_size(a) == std::numeric_limits::max()); } { const A a = {}; assert(std::allocator_traits >::max_size(a) == std::numeric_limits::max()); } #endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE { B b; assert(std::allocator_traits >::max_size(b) == 100); } { const B b = {}; assert(std::allocator_traits >::max_size(b) == 100); } #if __cplusplus >= 201103 { std::allocator a; static_assert(noexcept(std::allocator_traits>::max_size(a)) == true, ""); } #endif }