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// <list>
11
12// Operations on "NULL" iterators
13
14#if _LIBCPP_DEBUG >= 1
15
16#define _LIBCPP_ASSERT(x, m) do { if (!x) throw 1; } while(0)
17
18#include <list>
19#include <cassert>
20#include <iterator>
21#include <exception>
22#include <cstdlib>
23
24struct S { int val; };
25
26int main()
27{
28#if _LIBCPP_STD_VER > 11
29    {
30    unsigned lib_asserts;
31
32    typedef S T;
33    typedef std::list<T> C;
34    C::iterator i{};
35    C::const_iterator ci{};
36
37    lib_asserts = 0;
38    try { ++i; }  catch (int) { ++lib_asserts; }
39    try { i++; }  catch (int) { ++lib_asserts; }
40    try { ++ci; } catch (int) { ++lib_asserts; }
41    try { ci++; } catch (int) { ++lib_asserts; }
42    assert(lib_asserts == 4);
43
44    lib_asserts = 0;
45    try { --i; }  catch (int) { ++lib_asserts; }
46    try { i--; }  catch (int) { ++lib_asserts; }
47    try { --ci; } catch (int) { ++lib_asserts; }
48    try { ci--; } catch (int) { ++lib_asserts; }
49    assert(lib_asserts == 4);
50
51    lib_asserts = 0;
52    try { *i; }             catch (int) { ++lib_asserts; }
53    try { *ci; }            catch (int) { ++lib_asserts; }
54    try { (void)  i->val; } catch (int) { ++lib_asserts; }
55    try { (void) ci->val; } catch (int) { ++lib_asserts; }
56    assert(lib_asserts == 4);
57    }
58#endif
59}
60
61#else
62
63int main()
64{
65}
66
67#endif
68