165d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow//===----------------------------------------------------------------------===//
265d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow//
365d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow//                     The LLVM Compiler Infrastructure
465d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow//
565d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow// This file is dual licensed under the MIT and the University of Illinois Open
665d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow// Source Licenses. See LICENSE.TXT for details.
765d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow//
865d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow//===----------------------------------------------------------------------===//
965d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
1065d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow// <list>
1165d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
1265d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow// Operations on "NULL" iterators
1365d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
145e57142c5902c3f73a6fdcb8cab55e88ffb43a56Howard Hinnant#if _LIBCPP_DEBUG >= 1
1565d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
1665d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow#define _LIBCPP_ASSERT(x, m) do { if (!x) throw 1; } while(0)
1765d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
1865d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow#include <list>
1965d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow#include <cassert>
2065d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow#include <iterator>
2165d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow#include <exception>
2265d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow#include <cstdlib>
2365d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
2465d2e6a39202efb1db3826224d7050393f79acf0Marshall Clowstruct S { int val; };
2565d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
2665d2e6a39202efb1db3826224d7050393f79acf0Marshall Clowint main()
2765d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow{
2865d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow#if _LIBCPP_STD_VER > 11
2965d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    {
30ab61b2c9f1058302d13e59cadf360a5afce5eaa9Howard Hinnant    unsigned lib_asserts;
3165d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
3265d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    typedef S T;
3365d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    typedef std::list<T> C;
3465d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    C::iterator i{};
3565d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    C::const_iterator ci{};
3665d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
3765d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    lib_asserts = 0;
3865d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    try { ++i; }  catch (int) { ++lib_asserts; }
3965d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    try { i++; }  catch (int) { ++lib_asserts; }
4065d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    try { ++ci; } catch (int) { ++lib_asserts; }
4165d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    try { ci++; } catch (int) { ++lib_asserts; }
4265d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    assert(lib_asserts == 4);
4365d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
4465d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    lib_asserts = 0;
4565d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    try { --i; }  catch (int) { ++lib_asserts; }
4665d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    try { i--; }  catch (int) { ++lib_asserts; }
4765d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    try { --ci; } catch (int) { ++lib_asserts; }
4865d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    try { ci--; } catch (int) { ++lib_asserts; }
4965d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    assert(lib_asserts == 4);
5065d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
5165d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    lib_asserts = 0;
5265d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    try { *i; }             catch (int) { ++lib_asserts; }
5365d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    try { *ci; }            catch (int) { ++lib_asserts; }
5465d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    try { (void)  i->val; } catch (int) { ++lib_asserts; }
5565d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    try { (void) ci->val; } catch (int) { ++lib_asserts; }
5665d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    assert(lib_asserts == 4);
5765d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow    }
5865d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow#endif
5965d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow}
6065d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
6165d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow#else
6265d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
6365d2e6a39202efb1db3826224d7050393f79acf0Marshall Clowint main()
6465d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow{
6565d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow}
6665d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow
6765d2e6a39202efb1db3826224d7050393f79acf0Marshall Clow#endif
68