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 
24 struct S { int val; };
25 
main()26 int 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 
main()63 int main()
64 {
65 }
66 
67 #endif
68