101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant//===----------------------------------------------------------------------===//
201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant//
301afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant//                     The LLVM Compiler Infrastructure
401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant//
501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant//
801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant//===----------------------------------------------------------------------===//
901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant
1001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant
1101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant// <optional>
1201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant
1306086258d3d8c48a916ec51c33e1ad8f46821b81Dan Albert// template <class T> constexpr bool operator!=(const optional<T>& x, nullopt_t) noexcept;
1406086258d3d8c48a916ec51c33e1ad8f46821b81Dan Albert// template <class T> constexpr bool operator!=(nullopt_t, const optional<T>& x) noexcept;
1501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant
160cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow#include <experimental/optional>
1701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant
1801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnantint main()
1901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant{
2001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant#if _LIBCPP_STD_VER > 11
217112dae6acac544a0271a85d95342c583441e2d1Dan Albert    using std::experimental::optional;
227112dae6acac544a0271a85d95342c583441e2d1Dan Albert    using std::experimental::nullopt_t;
237112dae6acac544a0271a85d95342c583441e2d1Dan Albert    using std::experimental::nullopt;
240cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow
2501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant    {
2601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant    typedef int T;
270cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow    typedef optional<T> O;
2801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant
2901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant    constexpr O o1;     // disengaged
3001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant    constexpr O o2{1};  // engaged
3101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant
3206086258d3d8c48a916ec51c33e1ad8f46821b81Dan Albert    static_assert ( !(nullopt != o1), "" );
3306086258d3d8c48a916ec51c33e1ad8f46821b81Dan Albert    static_assert (  (nullopt != o2), "" );
3406086258d3d8c48a916ec51c33e1ad8f46821b81Dan Albert    static_assert ( !(o1 != nullopt), "" );
3506086258d3d8c48a916ec51c33e1ad8f46821b81Dan Albert    static_assert (  (o2 != nullopt), "" );
3601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant
3706086258d3d8c48a916ec51c33e1ad8f46821b81Dan Albert    static_assert (noexcept(nullopt != o1), "");
3806086258d3d8c48a916ec51c33e1ad8f46821b81Dan Albert    static_assert (noexcept(o1 != nullopt), "");
3901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant    }
4001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant#endif
4101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant}
42