max_size.pass.cpp revision 08b4f3f99b3414503a127e34db4ab1a3abb966f3
1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <memory>
11
12// template <class Alloc>
13// struct allocator_traits
14// {
15//     static size_type max_size(const allocator_type& a) noexcept;
16//     ...
17// };
18
19#include <memory>
20#include <new>
21#include <type_traits>
22#include <cassert>
23
24template <class T>
25struct A
26{
27    typedef T value_type;
28
29};
30
31template <class T>
32struct B
33{
34    typedef T value_type;
35
36    size_t max_size() const
37    {
38        return 100;
39    }
40};
41
42int main()
43{
44#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE
45    {
46        A<int> a;
47        assert(std::allocator_traits<A<int> >::max_size(a) ==
48               std::numeric_limits<std::size_t>::max());
49    }
50    {
51        const A<int> a = {};
52        assert(std::allocator_traits<A<int> >::max_size(a) ==
53               std::numeric_limits<std::size_t>::max());
54    }
55#endif  // _LIBCPP_HAS_NO_ADVANCED_SFINAE
56    {
57        B<int> b;
58        assert(std::allocator_traits<B<int> >::max_size(b) == 100);
59    }
60    {
61        const B<int> b = {};
62        assert(std::allocator_traits<B<int> >::max_size(b) == 100);
63    }
64#if __cplusplus >= 201103
65    {
66        std::allocator<int> a;
67        static_assert(noexcept(std::allocator_traits<std::allocator<int>>::max_size(a)) == true, "");
68    }
69#endif
70}
71