1211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant//===----------------------------------------------------------------------===//
2211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant//
3211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant//                     The LLVM Compiler Infrastructure
4211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant//
5211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant//
8211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant//===----------------------------------------------------------------------===//
9211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant
10211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant// <list>
11211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant
12211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant// iterator       begin();
13211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant// iterator       end();
14211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant// const_iterator begin()  const;
15211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant// const_iterator end()    const;
16211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant// const_iterator cbegin() const;
17211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant// const_iterator cend()   const;
18211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant
19211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant#include <list>
20211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant#include <cassert>
21211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant#include <iterator>
22211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant
23e619862dbf0c4a46db6e3d816bcafcfef6e85977Stephan T. Lavavej#include "test_macros.h"
24061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow#include "min_allocator.h"
2529f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant
2629f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnantstruct A
2729f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant{
2829f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant    int first;
2929f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant    int second;
3029f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant};
3129f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant
32211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnantint main()
33211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant{
34211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant    {
35211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        typedef int T;
36211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        typedef std::list<T> C;
37211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        C c;
38211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        C::iterator i = c.begin();
39211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        C::iterator j = c.end();
40211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        assert(std::distance(i, j) == 0);
41211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        assert(i == j);
42211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant    }
43211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant    {
44211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        typedef int T;
45211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        typedef std::list<T> C;
46211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        const C c;
47211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        C::const_iterator i = c.begin();
48211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        C::const_iterator j = c.end();
49211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        assert(std::distance(i, j) == 0);
50211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        assert(i == j);
51211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant    }
52211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant    {
53211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        typedef int T;
54211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        typedef std::list<T> C;
55211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        C c;
56211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        C::const_iterator i = c.cbegin();
57211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        C::const_iterator j = c.cend();
58211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        assert(std::distance(i, j) == 0);
59211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        assert(i == j);
60211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        assert(i == c.end());
61211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant    }
62211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant    {
63211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        typedef int T;
64211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        typedef std::list<T> C;
65211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        const T t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
66211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        C c(std::begin(t), std::end(t));
67211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        C::iterator i = c.begin();
68211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        assert(*i == 0);
69211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        ++i;
70211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        assert(*i == 1);
71211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        *i = 10;
72211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        assert(*i == 10);
73211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        assert(std::distance(c.begin(), c.end()) == 10);
74211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant    }
75211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant    {
76211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        typedef int T;
77211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        typedef std::list<T> C;
78211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        C::iterator i;
79211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant        C::const_iterator j;
80211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant    }
81d24c465beaec2fe9a0e365e6379cd5d3acaeb2caEric Fiselier#if TEST_STD_VER >= 11
8229f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant    {
8329f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        typedef int T;
8429f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        typedef std::list<T, min_allocator<T>> C;
8529f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        C c;
8629f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        C::iterator i = c.begin();
8729f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        C::iterator j = c.end();
8829f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        assert(std::distance(i, j) == 0);
8929f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        assert(i == j);
9029f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant    }
9129f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant    {
9229f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        typedef int T;
9329f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        typedef std::list<T, min_allocator<T>> C;
9429f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        const C c;
9529f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        C::const_iterator i = c.begin();
9629f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        C::const_iterator j = c.end();
9729f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        assert(std::distance(i, j) == 0);
9829f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        assert(i == j);
9929f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant    }
10029f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant    {
10129f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        typedef int T;
10229f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        typedef std::list<T, min_allocator<T>> C;
10329f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        C c;
10429f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        C::const_iterator i = c.cbegin();
10529f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        C::const_iterator j = c.cend();
10629f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        assert(std::distance(i, j) == 0);
10729f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        assert(i == j);
10829f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        assert(i == c.end());
10929f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant    }
11029f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant    {
11129f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        typedef int T;
11229f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        typedef std::list<T, min_allocator<T>> C;
11329f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        const T t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
11429f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        C c(std::begin(t), std::end(t));
11529f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        C::iterator i = c.begin();
11629f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        assert(*i == 0);
11729f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        ++i;
11829f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        assert(*i == 1);
11929f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        *i = 10;
12029f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        assert(*i == 10);
12129f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        assert(std::distance(c.begin(), c.end()) == 10);
12229f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant    }
12329f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant    {
12429f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        typedef int T;
12529f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        typedef std::list<T, min_allocator<T>> C;
12629f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        C::iterator i;
12729f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        C::const_iterator j;
12829f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant    }
12929f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant    {
13029f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        typedef A T;
13129f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        typedef std::list<T, min_allocator<T>> C;
13229f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        C c = {A{1, 2}};
13329f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        C::iterator i = c.begin();
13429f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        i->first = 3;
13529f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        C::const_iterator j = i;
13629f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant        assert(j->first == 3);
13729f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant    }
13829f7432ff3a5c503a98a66ae46dd571b651c88b5Howard Hinnant#endif
139e619862dbf0c4a46db6e3d816bcafcfef6e85977Stephan T. Lavavej#if TEST_STD_VER > 11
14065d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    {
14165d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow        std::list<int>::iterator ii1{}, ii2{};
14265d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow        std::list<int>::iterator ii4 = ii1;
14365d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow        std::list<int>::const_iterator cii{};
14465d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow        assert ( ii1 == ii2 );
14565d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow        assert ( ii1 == ii4 );
14665d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
1479863083ee04fe80e227976bc90dbc01806bdf3d9Marshall Clow        assert (!(ii1 != ii2 ));
1489863083ee04fe80e227976bc90dbc01806bdf3d9Marshall Clow
1499863083ee04fe80e227976bc90dbc01806bdf3d9Marshall Clow        assert ( (ii1 == cii ));
1509863083ee04fe80e227976bc90dbc01806bdf3d9Marshall Clow        assert ( (cii == ii1 ));
1519863083ee04fe80e227976bc90dbc01806bdf3d9Marshall Clow        assert (!(ii1 != cii ));
1529863083ee04fe80e227976bc90dbc01806bdf3d9Marshall Clow        assert (!(cii != ii1 ));
15365d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    }
15465d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow#endif
15565d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
156211f0ee1be4a4eaa0fab353904a8986af3f39e50Howard Hinnant}
157