[libcxx] r189772 - Implement N3672, optional<T>.

Howard Hinnant hhinnant at apple.com
Wed Sep 4 08:24:09 PDT 2013


Thanks, committed revision 189949.

Howard

On Sep 4, 2013, at 3:09 AM, Evgeniy Stepanov <eugeni.stepanov at gmail.com> wrote:

> Hi,
> 
> I'm seeing a warning from this code:
> /code/llvm/projects/libcxx/src/optional.cpp:21:22: warning: function
> previously declared with an explicit exception specification
> redeclared with an implicit exception specification
> [-Wimplicit-exception-spec-mismatch]
> bad_optional_access::~bad_optional_access() = default;
>                     ^
> /code/llvm/projects/libcxx/include/optional:142:13: note: previous
> declaration is here
>    virtual ~bad_optional_access() _NOEXCEPT;
> 
> Please consider the attached patch.
> 
> 
> On Tue, Sep 3, 2013 at 12:30 AM, Howard Hinnant <hhinnant at apple.com> wrote:
>> Author: hhinnant
>> Date: Mon Sep  2 15:30:37 2013
>> New Revision: 189772
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=189772&view=rev
>> Log:
>> Implement N3672, optional<T>.
>> 
>> Added:
>>    libcxx/trunk/include/optional
>>    libcxx/trunk/src/optional.cpp
>>    libcxx/trunk/test/utilities/meta/meta.unary/meta.unary.prop/__has_operator_addressof.pass.cpp
>>    libcxx/trunk/test/utilities/optional/
>>    libcxx/trunk/test/utilities/optional/optional.bad_optional_access/
>>    libcxx/trunk/test/utilities/optional/optional.bad_optional_access/char_pointer.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.bad_optional_access/copy_assign.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.bad_optional_access/copy_ctor.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.bad_optional_access/default.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.bad_optional_access/derive.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.bad_optional_access/string.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.comp_with_t/
>>    libcxx/trunk/test/utilities/optional/optional.comp_with_t/equal.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.comp_with_t/less_than.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.defs/
>>    libcxx/trunk/test/utilities/optional/optional.defs/tested_elsewhere.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.general/
>>    libcxx/trunk/test/utilities/optional/optional.general/nothing_to_do.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.hash/
>>    libcxx/trunk/test/utilities/optional/optional.hash/hash.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.inplace/
>>    libcxx/trunk/test/utilities/optional/optional.inplace/in_place_t.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.nullops/
>>    libcxx/trunk/test/utilities/optional/optional.nullops/eqaul.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.nullops/less_than.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.nullopt/
>>    libcxx/trunk/test/utilities/optional/optional.nullopt/nullopt_t.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/copy.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/move.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/nullopt_t.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/const_T.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/default.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/nullopt_t.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.dtor/
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/bool.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/dereference.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/op_arrow.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/op_arrow_const.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_const.fail.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_const.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_or.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_or_const.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.swap/
>>    libcxx/trunk/test/utilities/optional/optional.object/optional.object.swap/swap.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional_const_void.fail.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional_not_destructible.fail.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional_not_noexcept_destructible.fail.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/optional_void.fail.cpp
>>    libcxx/trunk/test/utilities/optional/optional.object/types.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.relops/
>>    libcxx/trunk/test/utilities/optional/optional.relops/equal.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.relops/less_than.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.specalg/
>>    libcxx/trunk/test/utilities/optional/optional.specalg/make_optional.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.specalg/swap.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.syn/
>>    libcxx/trunk/test/utilities/optional/optional.syn/optional_const_in_place_t.fail.cpp
>>    libcxx/trunk/test/utilities/optional/optional.syn/optional_const_lvalue_ref.fail.cpp
>>    libcxx/trunk/test/utilities/optional/optional.syn/optional_const_nullopt_t.fail.cpp
>>    libcxx/trunk/test/utilities/optional/optional.syn/optional_in_place_t.fail.cpp
>>    libcxx/trunk/test/utilities/optional/optional.syn/optional_includes_initializer_list.pass.cpp
>>    libcxx/trunk/test/utilities/optional/optional.syn/optional_lvalue_ref.fail.cpp
>>    libcxx/trunk/test/utilities/optional/optional.syn/optional_nullopt_t.fail.cpp
>>    libcxx/trunk/test/utilities/optional/optional.syn/optional_rvalue_ref.fail.cpp
>>    libcxx/trunk/test/utilities/optional/version.pass.cpp
>> Modified:
>>    libcxx/trunk/include/type_traits
>>    libcxx/trunk/test/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp
>>    libcxx/trunk/www/cxx1y_status.html
>> 
>> Added: libcxx/trunk/include/optional
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/optional?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/include/optional (added)
>> +++ libcxx/trunk/include/optional Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,697 @@
>> +// -*- C++ -*-
>> +//===-------------------------- optional ----------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#ifndef _LIBCPP_OPTIONAL
>> +#define _LIBCPP_OPTIONAL
>> +
>> +/*
>> +    optional synopsis
>> +
>> +// C++1y
>> +
>> +#include <initializer_list>
>> +
>> +namespace std
>> +{
>> +
>> +// optional for object types
>> +template <class T>
>> +class optional
>> +{
>> +public:
>> +    typedef T value_type;
>> +
>> +    // constructors
>> +    constexpr optional() noexcept;
>> +    constexpr optional(nullopt_t) noexcept;
>> +    optional(const optional&);
>> +    optional(optional&&) noexcept(is_nothrow_move_constructible<T>::value);
>> +    constexpr optional(const T&);
>> +    constexpr optional(T&&);
>> +    template <class... Args> constexpr explicit optional(in_place_t, Args&&...);
>> +    template <class U, class... Args>
>> +        constexpr explicit optional(in_place_t, initializer_list<U>, Args&&...);
>> +
>> +    // destructor
>> +    ~optional();
>> +
>> +    // assignment
>> +    optional& operator=(nullopt_t) noexcept;
>> +    optional& operator=(const optional&);
>> +    optional& operator=(optional&&)
>> +        noexcept(is_nothrow_move_assignable<T>::value &&
>> +                 is_nothrow_move_constructible<T>::value);
>> +    template <class U> optional& operator=(U&&);
>> +    template <class... Args> void emplace(Args&&...);
>> +    template <class U, class... Args> void emplace(initializer_list<U>, Args&&...);
>> +
>> +    // swap
>> +    void swap(optional&)
>> +        noexcept(is_nothrow_move_constructible<T>::value &&
>> +                 noexcept(swap(declval<T&>(), declval<T&>())));
>> +
>> +    // observers
>> +    constexpr T const* operator->() const;
>> +    T* operator->();
>> +    constexpr T const& operator*() const;
>> +    T& operator*();
>> +    constexpr explicit operator bool() const noexcept;
>> +    constexpr T const& value() const;
>> +    T& value();
>> +    template <class U> constexpr T value_or(U&&) const&;
>> +    template <class U> T value_or(U&&) &&;
>> +};
>> +
>> +// In-place construction
>> +struct in_place_t{};
>> +constexpr in_place_t in_place{};
>> +
>> +// Disengaged state indicator
>> +struct nullopt_t{see below};
>> +constexpr nullopt_t nullopt(unspecified);
>> +
>> +// class bad_optional_access
>> +class bad_optional_access
>> +    : public logic_error
>> +{
>> +public:
>> +    explicit bad_optional_access(const string& what_arg);
>> +    explicit bad_optional_access(const char* what_arg);
>> +};
>> +
>> +// Relational operators
>> +template <class T> constexpr bool operator==(const optional<T>&, const optional<T>&);
>> +template <class T> constexpr bool operator< (const optional<T>&, const optional<T>&);
>> +
>> +// Comparison with nullopt
>> +template <class T> constexpr bool operator==(const optional<T>&, nullopt_t) noexcept;
>> +template <class T> constexpr bool operator==(nullopt_t, const optional<T>&) noexcept;
>> +template <class T> constexpr bool operator<(const optional<T>&, nullopt_t) noexcept;
>> +template <class T> constexpr bool operator<(nullopt_t, const optional<T>&) noexcept;
>> +
>> +// Comparison with T
>> +template <class T> constexpr bool operator==(const optional<T>&, const T&);
>> +template <class T> constexpr bool operator==(const T&, const optional<T>&);
>> +template <class T> constexpr bool operator<(const optional<T>&, const T&);
>> +template <class T> constexpr bool operator<(const T&, const optional<T>&);
>> +
>> +// Specialized algorithms
>> +template <class T> void swap(optional<T>&, optional<T>&) noexcept(see below);
>> +template <class T> constexpr optional<typename decay<T>::type> make_optional(T&&);
>> +
>> +// hash support
>> +template <class T> struct hash;
>> +template <class T> struct hash<optional<T>>;
>> +
>> +}  // std
>> +
>> +*/
>> +
>> +#include <__config>
>> +#include <functional>
>> +#include <stdexcept>
>> +
>> +namespace std  // purposefully not using versioning namespace
>> +{
>> +
>> +class _LIBCPP_EXCEPTION_ABI bad_optional_access
>> +    : public logic_error
>> +{
>> +public:
>> +#if _LIBCPP_STD_VER > 11
>> +    _LIBCPP_INLINE_VISIBILITY explicit bad_optional_access(const string& __arg)
>> +        : logic_error(__arg) {}
>> +    _LIBCPP_INLINE_VISIBILITY explicit bad_optional_access(const char* __arg)
>> +        : logic_error(__arg) {}
>> +    _LIBCPP_INLINE_VISIBILITY bad_optional_access(const bad_optional_access&) noexcept = default;
>> +    _LIBCPP_INLINE_VISIBILITY bad_optional_access& operator=(const bad_optional_access&) noexcept = default;
>> +#else
>> +private:
>> +    bad_optional_access(const bad_optional_access&);
>> +    bad_optional_access& operator=(const bad_optional_access&);
>> +public:
>> +#endif  // _LIBCPP_STD_VER > 11
>> +    // Get the key function ~bad_optional_access() into the dylib even if not compiling for C++1y
>> +    virtual ~bad_optional_access() _NOEXCEPT;
>> +};
>> +
>> +}  // std
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +#include <initializer_list>
>> +#include <type_traits>
>> +#include <new>
>> +#include <__functional_base>
>> +
>> +#include <__undef_min_max>
>> +
>> +#ifdef _LIBCPP_DEBUG
>> +#   include <__debug>
>> +#else
>> +#   define _LIBCPP_ASSERT(x, m) ((void)0)
>> +#endif
>> +
>> +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
>> +#pragma GCC system_header
>> +#endif
>> +
>> +_LIBCPP_BEGIN_NAMESPACE_STD
>> +
>> +struct in_place_t {};
>> +constexpr in_place_t in_place{};
>> +
>> +struct nullopt_t
>> +{
>> +    explicit constexpr nullopt_t(int) noexcept {}
>> +};
>> +
>> +constexpr nullopt_t nullopt{0};
>> +
>> +template <class _Tp, bool = is_trivially_destructible<_Tp>::value>
>> +class __optional_storage
>> +{
>> +protected:
>> +    typedef _Tp value_type;
>> +    union
>> +    {
>> +        char __null_state_;
>> +        value_type __val_;
>> +    };
>> +    bool __engaged_ = false;
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    ~__optional_storage()
>> +    {
>> +        if (__engaged_)
>> +            __val_.~value_type();
>> +    }
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr __optional_storage() noexcept
>> +        :  __null_state_('\0') {}
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    __optional_storage(const __optional_storage& __x)
>> +        :  __engaged_(__x.__engaged_)
>> +        {
>> +            if (__engaged_)
>> +                ::new(_VSTD::addressof(__val_)) value_type(__x.__val_);
>> +        }
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    __optional_storage(__optional_storage&& __x)
>> +                      noexcept(is_nothrow_move_constructible<value_type>::value)
>> +        :  __engaged_(__x.__engaged_)
>> +        {
>> +            if (__engaged_)
>> +                ::new(_VSTD::addressof(__val_)) value_type(_VSTD::move(__x.__val_));
>> +        }
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr __optional_storage(const value_type& __v)
>> +        :  __val_(__v),
>> +           __engaged_(true) {}
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr __optional_storage(value_type&& __v)
>> +        :  __val_(_VSTD::move(__v)),
>> +           __engaged_(true) {}
>> +
>> +    template <class... _Args>
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr
>> +    explicit __optional_storage(in_place_t, _Args&&... __args)
>> +       :  __val_(_VSTD::forward<_Args>(__args)...),
>> +           __engaged_(true) {}
>> +};
>> +
>> +template <class _Tp>
>> +class __optional_storage<_Tp, true>
>> +{
>> +protected:
>> +    typedef _Tp value_type;
>> +    union
>> +    {
>> +        char __null_state_;
>> +        value_type __val_;
>> +    };
>> +    bool __engaged_ = false;
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr __optional_storage() noexcept
>> +        :  __null_state_('\0') {}
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    __optional_storage(const __optional_storage& __x)
>> +        :  __engaged_(__x.__engaged_)
>> +        {
>> +            if (__engaged_)
>> +                ::new(_VSTD::addressof(__val_)) value_type(__x.__val_);
>> +        }
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    __optional_storage(__optional_storage&& __x)
>> +                      noexcept(is_nothrow_move_constructible<value_type>::value)
>> +        :  __engaged_(__x.__engaged_)
>> +        {
>> +            if (__engaged_)
>> +                ::new(_VSTD::addressof(__val_)) value_type(_VSTD::move(__x.__val_));
>> +        }
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr __optional_storage(const value_type& __v)
>> +        :  __val_(__v),
>> +           __engaged_(true) {}
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr __optional_storage(value_type&& __v)
>> +        :  __val_(_VSTD::move(__v)),
>> +           __engaged_(true) {}
>> +
>> +    template <class... _Args>
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr
>> +    explicit __optional_storage(in_place_t, _Args&&... __args)
>> +       :  __val_(_VSTD::forward<_Args>(__args)...),
>> +           __engaged_(true) {}
>> +};
>> +
>> +template <class _Tp>
>> +class optional
>> +    : private __optional_storage<_Tp>
>> +{
>> +    typedef __optional_storage<_Tp> __base;
>> +public:
>> +    typedef _Tp value_type;
>> +
>> +    static_assert(!is_reference<value_type>::value,
>> +              "Instantiation of optional with a reference type is ill-formed.");
>> +    static_assert(!is_same<typename remove_cv<value_type>::type, in_place_t>::value,
>> +              "Instantiation of optional with a in_place_t type is ill-formed.");
>> +    static_assert(!is_same<typename remove_cv<value_type>::type, nullopt_t>::value,
>> +              "Instantiation of optional with a nullopt_t type is ill-formed.");
>> +    static_assert(is_object<value_type>::value,
>> +        "Instantiation of optional with a non-object type is undefined behavior.");
>> +    static_assert(is_nothrow_destructible<value_type>::value,
>> +        "Instantiation of optional with an object type that is not noexcept destructible is undefined behavior.");
>> +
>> +    _LIBCPP_INLINE_VISIBILITY constexpr optional() noexcept {}
>> +    _LIBCPP_INLINE_VISIBILITY optional(const optional&) = default;
>> +    _LIBCPP_INLINE_VISIBILITY optional(optional&&) = default;
>> +    _LIBCPP_INLINE_VISIBILITY ~optional() = default;
>> +    _LIBCPP_INLINE_VISIBILITY constexpr optional(nullopt_t) noexcept {}
>> +    _LIBCPP_INLINE_VISIBILITY constexpr optional(const value_type& __v)
>> +        : __base(__v) {}
>> +    _LIBCPP_INLINE_VISIBILITY constexpr optional(value_type&& __v)
>> +        : __base(_VSTD::move(__v)) {}
>> +
>> +    template <class... _Args,
>> +              class = typename enable_if
>> +                      <
>> +                           is_constructible<value_type, _Args...>::value
>> +                      >::type
>> +             >
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr
>> +    explicit optional(in_place_t, _Args&&... __args)
>> +        : __base(in_place, _VSTD::forward<_Args>(__args)...) {}
>> +
>> +    template <class _Up, class... _Args,
>> +              class = typename enable_if
>> +                      <
>> +                           is_constructible<value_type, initializer_list<_Up>&, _Args...>::value
>> +                      >::type
>> +             >
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr
>> +    explicit optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)
>> +        : __base(in_place, __il, _VSTD::forward<_Args>(__args)...) {}
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    optional& operator=(nullopt_t) noexcept
>> +    {
>> +        if (this->__engaged_)
>> +        {
>> +            this->__val_.~value_type();
>> +            this->__engaged_ = false;
>> +        }
>> +        return *this;
>> +    }
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    optional&
>> +    operator=(const optional& __opt)
>> +    {
>> +        if (this->__engaged_ == __opt.__engaged_)
>> +        {
>> +            if (this->__engaged_)
>> +                this->__val_ = __opt.__val_;
>> +        }
>> +        else
>> +        {
>> +            if (this->__engaged_)
>> +                this->__val_.~value_type();
>> +            else
>> +                ::new(_VSTD::addressof(this->__val_)) value_type(__opt.__val_);
>> +            this->__engaged_ = __opt.__engaged_;
>> +        }
>> +        return *this;
>> +    }
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    optional&
>> +    operator=(optional&& __opt)
>> +        noexcept(is_nothrow_move_assignable<value_type>::value &&
>> +                 is_nothrow_move_constructible<value_type>::value)
>> +    {
>> +        if (this->__engaged_ == __opt.__engaged_)
>> +        {
>> +            if (this->__engaged_)
>> +                this->__val_ = _VSTD::move(__opt.__val_);
>> +        }
>> +        else
>> +        {
>> +            if (this->__engaged_)
>> +                this->__val_.~value_type();
>> +            else
>> +                ::new(_VSTD::addressof(this->__val_)) value_type(_VSTD::move(__opt.__val_));
>> +            this->__engaged_ = __opt.__engaged_;
>> +        }
>> +        return *this;
>> +    }
>> +
>> +    template <class _Up,
>> +              class = typename enable_if
>> +                      <
>> +                          is_same<typename remove_reference<_Up>::type, value_type>::value &&
>> +                          is_constructible<value_type, _Up>::value &&
>> +                          is_assignable<value_type&, _Up>::value
>> +                      >::type
>> +             >
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    optional&
>> +    operator=(_Up&& __v)
>> +    {
>> +        if (this->__engaged_)
>> +            this->__val_ = _VSTD::forward<_Up>(__v);
>> +        else
>> +        {
>> +            ::new(_VSTD::addressof(this->__val_)) value_type(_VSTD::forward<_Up>(__v));
>> +            this->__engaged_ = true;
>> +        }
>> +        return *this;
>> +    }
>> +
>> +    template <class... _Args,
>> +              class = typename enable_if
>> +                      <
>> +                          is_constructible<value_type, _Args...>::value
>> +                      >::type
>> +             >
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    void
>> +    emplace(_Args&&... __args)
>> +    {
>> +        *this = nullopt;
>> +        ::new(_VSTD::addressof(this->__val_)) value_type(_VSTD::forward<_Args>(__args)...);
>> +        this->__engaged_ = true;
>> +    }
>> +
>> +    template <class _Up, class... _Args,
>> +              class = typename enable_if
>> +                      <
>> +                          is_constructible<value_type, initializer_list<_Up>&, _Args...>::value
>> +                      >::type
>> +             >
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    void
>> +    emplace(initializer_list<_Up> __il, _Args&&... __args)
>> +    {
>> +        *this = nullopt;
>> +        ::new(_VSTD::addressof(this->__val_)) value_type(__il, _VSTD::forward<_Args>(__args)...);
>> +        this->__engaged_ = true;
>> +    }
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    void
>> +    swap(optional& __opt)
>> +        noexcept(is_nothrow_move_constructible<value_type>::value &&
>> +                 __is_nothrow_swappable<value_type>::value)
>> +    {
>> +        using _VSTD::swap;
>> +        if (this->__engaged_ == __opt.__engaged_)
>> +        {
>> +            if (this->__engaged_)
>> +                swap(this->__val_, __opt.__val_);
>> +        }
>> +        else
>> +        {
>> +            if (this->__engaged_)
>> +            {
>> +                ::new(_VSTD::addressof(__opt.__val_)) value_type(_VSTD::move(this->__val_));
>> +                this->__val_.~value_type();
>> +            }
>> +            else
>> +            {
>> +                ::new(_VSTD::addressof(this->__val_)) value_type(_VSTD::move(__opt.__val_));
>> +                __opt.__val_.~value_type();
>> +            }
>> +            swap(this->__engaged_, __opt.__engaged_);
>> +        }
>> +    }
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr
>> +    value_type const*
>> +    operator->() const
>> +    {
>> +        _LIBCPP_ASSERT(this->__engaged_, "optional operator-> called for disengaged value");
>> +        return __operator_arrow(__has_operator_addressof<value_type>{});
>> +    }
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    value_type*
>> +    operator->()
>> +    {
>> +        _LIBCPP_ASSERT(this->__engaged_, "optional operator-> called for disengaged value");
>> +        return _VSTD::addressof(this->__val_);
>> +    }
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr
>> +    const value_type&
>> +    operator*() const
>> +    {
>> +        _LIBCPP_ASSERT(this->__engaged_, "optional operator* called for disengaged value");
>> +        return this->__val_;
>> +    }
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    value_type&
>> +    operator*()
>> +    {
>> +        _LIBCPP_ASSERT(this->__engaged_, "optional operator* called for disengaged value");
>> +        return this->__val_;
>> +    }
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr explicit operator bool() const noexcept {return this->__engaged_;}
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr value_type const& value() const
>> +    {
>> +        if (!this->__engaged_)
>> +            throw bad_optional_access("optional<T>::value: not engaged");
>> +        return this->__val_;
>> +    }
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    value_type& value()
>> +    {
>> +        if (!this->__engaged_)
>> +            throw bad_optional_access("optional<T>::value: not engaged");
>> +        return this->__val_;
>> +    }
>> +
>> +    template <class _Up>
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr value_type value_or(_Up&& __v) const&
>> +    {
>> +        static_assert(is_copy_constructible<value_type>::value,
>> +                      "optional<T>::value_or: T must be copy constructible");
>> +        static_assert(is_convertible<_Up, value_type>::value,
>> +                      "optional<T>::value_or: U must be convertible to T");
>> +        return this->__engaged_ ? this->__val_ :
>> +                                  static_cast<value_type>(_VSTD::forward<_Up>(__v));
>> +    }
>> +
>> +    template <class _Up>
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    value_type value_or(_Up&& __v) &&
>> +    {
>> +        static_assert(is_move_constructible<value_type>::value,
>> +                      "optional<T>::value_or: T must be move constructible");
>> +        static_assert(is_convertible<_Up, value_type>::value,
>> +                      "optional<T>::value_or: U must be convertible to T");
>> +        return this->__engaged_ ? _VSTD::move(this->__val_) :
>> +                                  static_cast<value_type>(_VSTD::forward<_Up>(__v));
>> +    }
>> +
>> +private:
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    value_type const*
>> +    __operator_arrow(true_type) const
>> +    {
>> +        return _VSTD::addressof(this->__val_);
>> +    }
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    constexpr
>> +    value_type const*
>> +    __operator_arrow(false_type) const
>> +    {
>> +        return &this->__val_;
>> +    }
>> +};
>> +
>> +template <class _Tp>
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +constexpr
>> +bool
>> +operator==(const optional<_Tp>& __x, const optional<_Tp>& __y)
>> +{
>> +    if (static_cast<bool>(__x) != static_cast<bool>(__y))
>> +        return false;
>> +    if (!static_cast<bool>(__x))
>> +        return true;
>> +    return *__x == *__y;
>> +}
>> +
>> +template <class _Tp>
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +constexpr
>> +bool
>> +operator<(const optional<_Tp>& __x, const optional<_Tp>& __y)
>> +{
>> +    if (!static_cast<bool>(__y))
>> +        return false;
>> +    if (!static_cast<bool>(__x))
>> +        return true;
>> +    return less<_Tp>{}(*__x, *__y);
>> +}
>> +
>> +template <class _Tp>
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +constexpr
>> +bool
>> +operator==(const optional<_Tp>& __x, nullopt_t) noexcept
>> +{
>> +    return !static_cast<bool>(__x);
>> +}
>> +
>> +template <class _Tp>
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +constexpr
>> +bool
>> +operator==(nullopt_t, const optional<_Tp>& __x) noexcept
>> +{
>> +    return !static_cast<bool>(__x);
>> +}
>> +
>> +template <class _Tp>
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +constexpr
>> +bool
>> +operator<(const optional<_Tp>&, nullopt_t) noexcept
>> +{
>> +    return false;
>> +}
>> +
>> +template <class _Tp>
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +constexpr
>> +bool
>> +operator<(nullopt_t, const optional<_Tp>& __x) noexcept
>> +{
>> +    return static_cast<bool>(__x);
>> +}
>> +
>> +template <class _Tp>
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +constexpr
>> +bool
>> +operator==(const optional<_Tp>& __x, const _Tp& __v)
>> +{
>> +    return static_cast<bool>(__x) ? *__x == __v : false;
>> +}
>> +
>> +template <class _Tp>
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +constexpr
>> +bool
>> +operator==(const _Tp& __v, const optional<_Tp>& __x)
>> +{
>> +    return static_cast<bool>(__x) ? *__x == __v : false;
>> +}
>> +
>> +template <class _Tp>
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +constexpr
>> +bool
>> +operator<(const optional<_Tp>& __x, const _Tp& __v)
>> +{
>> +    return static_cast<bool>(__x) ? less<_Tp>{}(*__x, __v) : true;
>> +}
>> +
>> +template <class _Tp>
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +constexpr
>> +bool
>> +operator<(const _Tp& __v, const optional<_Tp>& __x)
>> +{
>> +    return static_cast<bool>(__x) ? less<_Tp>{}(__v, *__x) : false;
>> +}
>> +
>> +template <class _Tp>
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +void
>> +swap(optional<_Tp>& __x, optional<_Tp>& __y) noexcept(noexcept(__x.swap(__y)))
>> +{
>> +    __x.swap(__y);
>> +}
>> +
>> +template <class _Tp>
>> +inline _LIBCPP_INLINE_VISIBILITY
>> +constexpr
>> +optional<typename decay<_Tp>::type>
>> +make_optional(_Tp&& __v)
>> +{
>> +    return optional<typename decay<_Tp>::type>(_VSTD::forward<_Tp>(__v));
>> +}
>> +
>> +template <class _Tp>
>> +struct _LIBCPP_TYPE_VIS_ONLY hash<optional<_Tp> >
>> +{
>> +    typedef optional<_Tp> argument_type;
>> +    typedef size_t        result_type;
>> +
>> +    _LIBCPP_INLINE_VISIBILITY
>> +    result_type operator()(const argument_type& __opt) const _NOEXCEPT
>> +    {
>> +        return static_cast<bool>(__opt) ? hash<_Tp>()(*__opt) : 0;
>> +    }
>> +};
>> +
>> +_LIBCPP_END_NAMESPACE_STD
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +#endif  // _LIBCPP_ARRAY
>> 
>> Modified: libcxx/trunk/include/type_traits
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/type_traits?rev=189772&r1=189771&r2=189772&view=diff
>> ==============================================================================
>> --- libcxx/trunk/include/type_traits (original)
>> +++ libcxx/trunk/include/type_traits Mon Sep  2 15:30:37 2013
>> @@ -1378,8 +1378,10 @@ template <class ..._Tp> using common_typ
>> 
>> // is_assignable
>> 
>> +template<typename, typename T> struct __select_2nd { typedef T type; };
>> +
>> template <class _Tp, class _Arg>
>> -decltype((_VSTD::declval<_Tp>() = _VSTD::declval<_Arg>(), true_type()))
>> +typename __select_2nd<decltype((_VSTD::declval<_Tp>() = _VSTD::declval<_Arg>())), true_type>::type
>> #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
>> __is_assignable_test(_Tp&&, _Arg&&);
>> #else
>> @@ -1969,8 +1971,6 @@ class _LIBCPP_TYPE_VIS_ONLY result_of<_F
>> 
>> //      main is_constructible test
>> 
>> -template<typename, typename T> struct __select_2nd { typedef T type; };
>> -
>> template <class _Tp, class ..._Args>
>> typename __select_2nd<decltype(_VSTD::move(_Tp(_VSTD::declval<_Args>()...))), true_type>::type
>> __is_constructible_test(_Tp&&, _Args&& ...);
>> @@ -3258,6 +3258,27 @@ struct underlying_type
>> 
>> #endif // _LIBCXX_UNDERLYING_TYPE
>> 
>> +#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE
>> +
>> +template <class _Tp>
>> +struct __has_operator_addressof_imp
>> +{
>> +    template <class>
>> +        static auto __test(__any) -> false_type;
>> +    template <class _Up>
>> +        static auto __test(_Up* __u)
>> +            -> typename __select_2nd<decltype(__u->operator&()), true_type>::type;
>> +
>> +    static const bool value = decltype(__test<_Tp>(nullptr))::value;
>> +};
>> +
>> +template <class _Tp>
>> +struct __has_operator_addressof
>> +    : public integral_constant<bool, __has_operator_addressof_imp<_Tp>::value>
>> +{};
>> +
>> +#endif  // _LIBCPP_HAS_NO_ADVANCED_SFINAE
>> +
>> _LIBCPP_END_NAMESPACE_STD
>> 
>> #endif  // _LIBCPP_TYPE_TRAITS
>> 
>> Added: libcxx/trunk/src/optional.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/optional.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/src/optional.cpp (added)
>> +++ libcxx/trunk/src/optional.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,25 @@
>> +//===------------------------ optional.cpp --------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "optional"
>> +
>> +namespace std  // purposefully not using versioning namespace
>> +{
>> +
>> +#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
>> +
>> +bad_optional_access::~bad_optional_access() {}
>> +
>> +#else
>> +
>> +bad_optional_access::~bad_optional_access() = default;
>> +
>> +#endif
>> +
>> +}  // std
>> 
>> Added: libcxx/trunk/test/utilities/meta/meta.unary/meta.unary.prop/__has_operator_addressof.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/meta/meta.unary/meta.unary.prop/__has_operator_addressof.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/meta/meta.unary/meta.unary.prop/__has_operator_addressof.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/meta/meta.unary/meta.unary.prop/__has_operator_addressof.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,53 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// type_traits
>> +
>> +// extension
>> +
>> +// template <typename _Tp> struct __has_operator_addressof
>> +
>> +
>> +#include <type_traits>
>> +
>> +#ifndef _LIBCPP_HAS_NO_CONSTEXPR
>> +
>> +struct A
>> +{
>> +};
>> +
>> +struct B
>> +{
>> +    constexpr B* operator&() const;
>> +};
>> +
>> +struct D;
>> +
>> +struct C
>> +{
>> +    template <class U>
>> +    D operator,(U&&);
>> +};
>> +
>> +struct E
>> +{
>> +    constexpr C operator&() const;
>> +};
>> +
>> +#endif  // _LIBCPP_HAS_NO_CONSTEXPR
>> +
>> +int main()
>> +{
>> +#ifndef _LIBCPP_HAS_NO_CONSTEXPR
>> +    static_assert(std::__has_operator_addressof<int>::value == false, "");
>> +    static_assert(std::__has_operator_addressof<A>::value == false, "");
>> +    static_assert(std::__has_operator_addressof<B>::value == true, "");
>> +    static_assert(std::__has_operator_addressof<E>::value == true, "");
>> +#endif  // _LIBCPP_HAS_NO_CONSTEXPR
>> +}
>> 
>> Modified: libcxx/trunk/test/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp?rev=189772&r1=189771&r2=189772&view=diff
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp (original)
>> +++ libcxx/trunk/test/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -34,6 +34,19 @@ void test_is_not_assignable()
>>     static_assert((!std::is_assignable<T, U>::value), "");
>> }
>> 
>> +struct D;
>> +
>> +struct C
>> +{
>> +    template <class U>
>> +    D operator,(U&&);
>> +};
>> +
>> +struct E
>> +{
>> +    C operator=(int);
>> +};
>> +
>> int main()
>> {
>>     test_is_assignable<int&, int&> ();
>> @@ -41,6 +54,7 @@ int main()
>>     test_is_assignable<int&, double> ();
>>     test_is_assignable<B, A> ();
>>     test_is_assignable<void*&, void*> ();
>> +    test_is_assignable<E, int> ();
>> 
>> #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
>>     test_is_not_assignable<int, int&> ();
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.bad_optional_access/char_pointer.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.bad_optional_access/char_pointer.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.bad_optional_access/char_pointer.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.bad_optional_access/char_pointer.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,31 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// class bad_optional_access;
>> +// explicit bad_optional_access(const char* what_arg);
>> +
>> +#include <optional>
>> +#include <string>
>> +#include <cstring>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    const char* s = "message";
>> +    std::bad_optional_access e(s);
>> +    assert(std::strcmp(e.what(), s) == 0);
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.bad_optional_access/copy_assign.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.bad_optional_access/copy_assign.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.bad_optional_access/copy_assign.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.bad_optional_access/copy_assign.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,37 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// class bad_optional_access;
>> +// bad_optional_access& operator=(const bad_optional_access&);
>> +
>> +#include <optional>
>> +#include <string>
>> +#include <cstring>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    static_assert(std::is_nothrow_copy_assignable<std::bad_optional_access>::value, "");
>> +    const std::string s1("one message");
>> +    const std::string s2("another message");
>> +    std::bad_optional_access e1(s1);
>> +    std::bad_optional_access e2(s2);
>> +    assert(std::strcmp(e1.what(), e2.what()) != 0);
>> +    e1 = e2;
>> +    assert(std::strcmp(e1.what(), e2.what()) == 0);
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.bad_optional_access/copy_ctor.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.bad_optional_access/copy_ctor.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.bad_optional_access/copy_ctor.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.bad_optional_access/copy_ctor.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,34 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// class bad_optional_access;
>> +// bad_optional_access(const bad_optional_access&);
>> +
>> +#include <optional>
>> +#include <string>
>> +#include <cstring>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    static_assert(std::is_nothrow_copy_constructible<std::bad_optional_access>::value, "");
>> +    const std::string s("another message");
>> +    std::bad_optional_access e1(s);
>> +    std::bad_optional_access e2 = e1;
>> +    assert(std::strcmp(e1.what(), e2.what()) == 0);
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.bad_optional_access/default.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.bad_optional_access/default.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.bad_optional_access/default.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.bad_optional_access/default.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,26 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// class bad_optional_access is not default constructible
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    static_assert(!std::is_default_constructible<std::bad_optional_access>::value, "");
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.bad_optional_access/derive.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.bad_optional_access/derive.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.bad_optional_access/derive.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.bad_optional_access/derive.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,27 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// class bad_optional_access : public logic_error
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    static_assert(std::is_base_of<std::logic_error, std::bad_optional_access>::value, "");
>> +    static_assert(std::is_convertible<std::bad_optional_access*, std::logic_error*>::value, "");
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.bad_optional_access/string.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.bad_optional_access/string.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.bad_optional_access/string.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.bad_optional_access/string.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,31 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// class bad_optional_access;
>> +// explicit bad_optional_access(const string& what_arg);
>> +
>> +#include <optional>
>> +#include <string>
>> +#include <cstring>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    const std::string s("message");
>> +    std::bad_optional_access e(s);
>> +    assert(std::strcmp(e.what(), s.c_str()) == 0);
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.comp_with_t/equal.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.comp_with_t/equal.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.comp_with_t/equal.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.comp_with_t/equal.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,42 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// template <class T> constexpr bool operator==(const optional<T>& x, const T& v);
>> +// template <class T> constexpr bool operator==(const T& v, const optional<T>& x);
>> +
>> +#include <optional>
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +    typedef int T;
>> +    typedef std::optional<T> O;
>> +
>> +    constexpr T val(2);
>> +    constexpr O o1;     // disengaged
>> +    constexpr O o2{1};  // engaged
>> +    constexpr O o3{val};  // engaged
>> +
>> +    static_assert ( !(o1 == 1), "" );
>> +    static_assert (   o2 == 1,  "" );
>> +    static_assert ( !(o3 == 1), "" );
>> +    static_assert (   o3 == 2 , "" );
>> +    static_assert (   o3 == val, "" );
>> +
>> +    static_assert ( !(1 == o1), "" );
>> +    static_assert (   1 == o2,  "" );
>> +    static_assert ( !(1 == o3), "" );
>> +    static_assert (   2 == o3 , "" );
>> +    static_assert ( val == o3 , "" );
>> +    }
>> +#endif
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.comp_with_t/less_than.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.comp_with_t/less_than.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.comp_with_t/less_than.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.comp_with_t/less_than.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,72 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// template <class T> constexpr bool operator<(const optional<T>& x, const T& v);
>> +// template <class T> constexpr bool operator<(const T& v, const optional<T>& x);
>> +
>> +#include <optional>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct X
>> +{
>> +    int i_;
>> +
>> +    constexpr X(int i) : i_(i) {}
>> +};
>> +
>> +namespace std
>> +{
>> +
>> +template <>
>> +struct less<X>
>> +{
>> +    constexpr
>> +    bool
>> +    operator()(const X& x, const X& y) const
>> +    {
>> +        return x.i_ < y.i_;
>> +    }
>> +};
>> +
>> +}
>> +
>> +#endif
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +    {
>> +    typedef X T;
>> +    typedef std::optional<T> O;
>> +
>> +    constexpr T val(2);
>> +    constexpr O o1;     // disengaged
>> +    constexpr O o2{1};  // engaged
>> +    constexpr O o3{val};  // engaged
>> +
>> +    static_assert (   o1 < T(1) , "" );
>> +    static_assert ( !(o2 < T(1)), "" );
>> +    static_assert ( !(o3 < T(1)), "" );
>> +    static_assert (   o2 < T(2) , "" );
>> +    static_assert (   o2 < T(val), "" );
>> +    static_assert (   o3 < T(3) , "" );
>> +
>> +    static_assert (  !(T(1) < o1), "" );
>> +    static_assert (  !(T(1) < o2), "" );
>> +    static_assert (    T(1) < o3 , "" );
>> +    static_assert (  !(T(2) < o2), "" );
>> +    static_assert (!(T(val) < o2), "" );
>> +    static_assert (  !(T(3) < o3), "" );
>> +    }
>> +#endif
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.defs/tested_elsewhere.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.defs/tested_elsewhere.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.defs/tested_elsewhere.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.defs/tested_elsewhere.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,12 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +int main()
>> +{
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.general/nothing_to_do.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.general/nothing_to_do.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.general/nothing_to_do.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.general/nothing_to_do.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,12 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +int main()
>> +{
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.hash/hash.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.hash/hash.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.hash/hash.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.hash/hash.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,48 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// template <class T> struct hash<optional<T>>;
>> +
>> +#include <optional>
>> +#include <string>
>> +#include <memory>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        typedef int T;
>> +        std::optional<T> opt;
>> +        assert(std::hash<std::optional<T>>{}(opt) == 0);
>> +        opt = 2;
>> +        assert(std::hash<std::optional<T>>{}(opt) == std::hash<T>{}(*opt));
>> +    }
>> +    {
>> +        typedef std::string T;
>> +        std::optional<T> opt;
>> +        assert(std::hash<std::optional<T>>{}(opt) == 0);
>> +        opt = std::string("123");
>> +        assert(std::hash<std::optional<T>>{}(opt) == std::hash<T>{}(*opt));
>> +    }
>> +    {
>> +        typedef std::unique_ptr<int> T;
>> +        std::optional<T> opt;
>> +        assert(std::hash<std::optional<T>>{}(opt) == 0);
>> +        opt = std::unique_ptr<int>(new int(3));
>> +        assert(std::hash<std::optional<T>>{}(opt) == std::hash<T>{}(*opt));
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.inplace/in_place_t.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.inplace/in_place_t.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.inplace/in_place_t.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.inplace/in_place_t.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,38 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// struct in_place_t{};
>> +// constexpr in_place_t in_place{};
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +constexpr
>> +int
>> +test(const std::in_place_t&)
>> +{
>> +    return 3;
>> +}
>> +
>> +#endif
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +       static_assert((std::is_class<std::in_place_t>::value), "");
>> +       static_assert((std::is_empty<std::in_place_t>::value), "");
>> +
>> +    static_assert(test(std::in_place) == 3, "");
>> +#endif
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.nullops/eqaul.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.nullops/eqaul.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.nullops/eqaul.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.nullops/eqaul.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,37 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +
>> +// <optional>
>> +
>> +// template <class T> constexpr bool operator==(const optional<T>& x, nullopt_t) noexcept;
>> +// template <class T> constexpr bool operator==(nullopt_t, const optional<T>& x) noexcept;
>> +
>> +#include <optional>
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +    typedef int T;
>> +    typedef std::optional<T> O;
>> +
>> +    constexpr O o1;     // disengaged
>> +    constexpr O o2{1};  // engaged
>> +
>> +    static_assert (   std::nullopt == o1 , "" );
>> +    static_assert ( !(std::nullopt == o2), "" );
>> +    static_assert (   o1 == std::nullopt , "" );
>> +    static_assert ( !(o2 == std::nullopt), "" );
>> +
>> +    static_assert (noexcept(std::nullopt == o1), "");
>> +    static_assert (noexcept(o1 == std::nullopt), "");
>> +    }
>> +#endif
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.nullops/less_than.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.nullops/less_than.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.nullops/less_than.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.nullops/less_than.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,37 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +
>> +// <optional>
>> +
>> +// template <class T> constexpr bool operator<(const optional<T>& x, nullopt_t) noexcept;
>> +// template <class T> constexpr bool operator<(nullopt_t, const optional<T>& x) noexcept;
>> +
>> +#include <optional>
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +    typedef int T;
>> +    typedef std::optional<T> O;
>> +
>> +    constexpr O o1;     // disengaged
>> +    constexpr O o2{1};  // engaged
>> +
>> +    static_assert ( !(std::nullopt < o1), "" );
>> +    static_assert (   std::nullopt < o2 , "" );
>> +    static_assert ( !(o1 < std::nullopt), "" );
>> +    static_assert ( !(o2 < std::nullopt), "" );
>> +
>> +    static_assert (noexcept(std::nullopt < o1), "");
>> +    static_assert (noexcept(o1 < std::nullopt), "");
>> +    }
>> +#endif
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.nullopt/nullopt_t.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.nullopt/nullopt_t.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.nullopt/nullopt_t.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.nullopt/nullopt_t.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,39 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// struct nullopt_t{see below};
>> +// constexpr nullopt_t nullopt(unspecified);
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +constexpr
>> +int
>> +test(const std::nullopt_t&)
>> +{
>> +    return 3;
>> +}
>> +
>> +#endif
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +       static_assert((std::is_class<std::nullopt_t>::value), "");
>> +       static_assert((std::is_empty<std::nullopt_t>::value), "");
>> +       static_assert((std::is_literal_type<std::nullopt_t>::value), "");
>> +       static_assert((!std::is_default_constructible<std::nullopt_t>::value), "");
>> +
>> +    static_assert(test(std::nullopt) == 3, "");
>> +#endif
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,70 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// template <class U> optional<T>& operator=(U&& v);
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +#include <memory>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct X
>> +{
>> +};
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    static_assert(std::is_assignable<std::optional<int>, int>::value, "");
>> +    static_assert(std::is_assignable<std::optional<int>, int&>::value, "");
>> +    static_assert(std::is_assignable<std::optional<int>&, int>::value, "");
>> +    static_assert(std::is_assignable<std::optional<int>&, int&>::value, "");
>> +    static_assert(std::is_assignable<std::optional<int>&, const int&>::value, "");
>> +    static_assert(!std::is_assignable<const std::optional<int>&, const int&>::value, "");
>> +    static_assert(!std::is_assignable<std::optional<int>, X>::value, "");
>> +    {
>> +        std::optional<int> opt;
>> +        opt = 1;
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == 1);
>> +    }
>> +    {
>> +        std::optional<int> opt;
>> +        const int i = 2;
>> +        opt = i;
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == i);
>> +    }
>> +    {
>> +        std::optional<int> opt(3);
>> +        const int i = 2;
>> +        opt = i;
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == i);
>> +    }
>> +    {
>> +        std::optional<std::unique_ptr<int>> opt;
>> +        opt = std::unique_ptr<int>(new int(3));
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(**opt == 3);
>> +    }
>> +    {
>> +        std::optional<std::unique_ptr<int>> opt(std::unique_ptr<int>(new int(2)));
>> +        opt = std::unique_ptr<int>(new int(3));
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(**opt == 3);
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/copy.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/copy.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/copy.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/copy.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,88 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// optional<T>& operator=(const optional<T>& rhs);
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct X
>> +{
>> +    static bool throw_now;
>> +
>> +    X() = default;
>> +    X(const X&)
>> +    {
>> +        if (throw_now)
>> +            throw 6;
>> +    }
>> +};
>> +
>> +bool X::throw_now = false;
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        std::optional<int> opt;
>> +        constexpr std::optional<int> opt2;
>> +        opt = opt2;
>> +        static_assert(static_cast<bool>(opt2) == false, "");
>> +        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));
>> +    }
>> +    {
>> +        std::optional<int> opt;
>> +        constexpr std::optional<int> opt2(2);
>> +        opt = opt2;
>> +        static_assert(static_cast<bool>(opt2) == true, "");
>> +        static_assert(*opt2 == 2, "");
>> +        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));
>> +        assert(*opt == *opt2);
>> +    }
>> +    {
>> +        std::optional<int> opt(3);
>> +        constexpr std::optional<int> opt2;
>> +        opt = opt2;
>> +        static_assert(static_cast<bool>(opt2) == false, "");
>> +        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));
>> +    }
>> +    {
>> +        std::optional<int> opt(3);
>> +        constexpr std::optional<int> opt2(2);
>> +        opt = opt2;
>> +        static_assert(static_cast<bool>(opt2) == true, "");
>> +        static_assert(*opt2 == 2, "");
>> +        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));
>> +        assert(*opt == *opt2);
>> +    }
>> +    {
>> +        std::optional<X> opt;
>> +        std::optional<X> opt2(X{});
>> +        assert(static_cast<bool>(opt2) == true);
>> +        try
>> +        {
>> +            X::throw_now = true;
>> +            opt = opt2;
>> +            assert(false);
>> +        }
>> +        catch (int i)
>> +        {
>> +            assert(i == 6);
>> +            assert(static_cast<bool>(opt) == false);
>> +        }
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,146 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// template <class... Args> void optional<T>::emplace(Args&&... args);
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +#include <memory>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +class X
>> +{
>> +    int i_;
>> +    int j_ = 0;
>> +public:
>> +    X() : i_(0) {}
>> +    X(int i) : i_(i) {}
>> +    X(int i, int j) : i_(i), j_(j) {}
>> +
>> +    friend bool operator==(const X& x, const X& y)
>> +        {return x.i_ == y.i_ && x.j_ == y.j_;}
>> +};
>> +
>> +class Y
>> +{
>> +public:
>> +    static bool dtor_called;
>> +    Y() = default;
>> +    ~Y() {dtor_called = true;}
>> +};
>> +
>> +bool Y::dtor_called = false;
>> +
>> +class Z
>> +{
>> +public:
>> +    static bool dtor_called;
>> +    Z() = default;
>> +    Z(int) {throw 6;}
>> +    ~Z() {dtor_called = true;}
>> +};
>> +
>> +bool Z::dtor_called = false;
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        std::optional<int> opt;
>> +        opt.emplace();
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == 0);
>> +    }
>> +    {
>> +        std::optional<int> opt;
>> +        opt.emplace(1);
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == 1);
>> +    }
>> +    {
>> +        std::optional<int> opt(2);
>> +        opt.emplace();
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == 0);
>> +    }
>> +    {
>> +        std::optional<int> opt(2);
>> +        opt.emplace(1);
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == 1);
>> +    }
>> +    {
>> +        std::optional<X> opt;
>> +        opt.emplace();
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == X());
>> +    }
>> +    {
>> +        std::optional<X> opt;
>> +        opt.emplace(1);
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == X(1));
>> +    }
>> +    {
>> +        std::optional<X> opt;
>> +        opt.emplace(1, 2);
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == X(1, 2));
>> +    }
>> +    {
>> +        std::optional<X> opt(X{3});
>> +        opt.emplace();
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == X());
>> +    }
>> +    {
>> +        std::optional<X> opt(X{3});
>> +        opt.emplace(1);
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == X(1));
>> +    }
>> +    {
>> +        std::optional<X> opt(X{3});
>> +        opt.emplace(1, 2);
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == X(1, 2));
>> +    }
>> +    {
>> +        Y y;
>> +        {
>> +            std::optional<Y> opt(y);
>> +            assert(Y::dtor_called == false);
>> +            opt.emplace();
>> +            assert(Y::dtor_called == true);
>> +        }
>> +    }
>> +    {
>> +        Z z;
>> +        std::optional<Z> opt(z);
>> +        try
>> +        {
>> +            assert(static_cast<bool>(opt) == true);
>> +            assert(Z::dtor_called == false);
>> +            opt.emplace(1);
>> +        }
>> +        catch (int i)
>> +        {
>> +            assert(i == 6);
>> +            assert(static_cast<bool>(opt) == false);
>> +            assert(Z::dtor_called == true);
>> +        }
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,114 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// template <class U, class... Args>
>> +//   void optional<T>::emplace(initializer_list<U> il, Args&&... args);
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +#include <vector>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +class X
>> +{
>> +    int i_;
>> +    int j_ = 0;
>> +public:
>> +    static bool dtor_called;
>> +    constexpr X() : i_(0) {}
>> +    constexpr X(int i) : i_(i) {}
>> +    constexpr X(std::initializer_list<int> il) : i_(il.begin()[0]), j_(il.begin()[1]) {}
>> +    ~X() {dtor_called = true;}
>> +
>> +    friend constexpr bool operator==(const X& x, const X& y)
>> +        {return x.i_ == y.i_ && x.j_ == y.j_;}
>> +};
>> +
>> +bool X::dtor_called = false;
>> +
>> +class Y
>> +{
>> +    int i_;
>> +    int j_ = 0;
>> +public:
>> +    constexpr Y() : i_(0) {}
>> +    constexpr Y(int i) : i_(i) {}
>> +    constexpr Y(std::initializer_list<int> il) : i_(il.begin()[0]), j_(il.begin()[1]) {}
>> +
>> +    friend constexpr bool operator==(const Y& x, const Y& y)
>> +        {return x.i_ == y.i_ && x.j_ == y.j_;}
>> +};
>> +
>> +class Z
>> +{
>> +    int i_;
>> +    int j_ = 0;
>> +public:
>> +    static bool dtor_called;
>> +    constexpr Z() : i_(0) {}
>> +    constexpr Z(int i) : i_(i) {}
>> +    constexpr Z(std::initializer_list<int> il) : i_(il.begin()[0]), j_(il.begin()[1])
>> +        {throw 6;}
>> +    ~Z() {dtor_called = true;}
>> +
>> +    friend constexpr bool operator==(const Z& x, const Z& y)
>> +        {return x.i_ == y.i_ && x.j_ == y.j_;}
>> +};
>> +
>> +bool Z::dtor_called = false;
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        X x;
>> +        {
>> +            std::optional<X> opt(x);
>> +            assert(X::dtor_called == false);
>> +            opt.emplace({1, 2});
>> +            assert(X::dtor_called == true);
>> +            assert(*opt == X({1, 2}));
>> +        }
>> +    }
>> +    {
>> +        std::optional<std::vector<int>> opt;
>> +        opt.emplace({1, 2, 3}, std::allocator<int>());
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == std::vector<int>({1, 2, 3}));
>> +    }
>> +    {
>> +        std::optional<Y> opt;
>> +        opt.emplace({1, 2});
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == Y({1, 2}));
>> +    }
>> +    {
>> +        Z z;
>> +        std::optional<Z> opt(z);
>> +        try
>> +        {
>> +            assert(static_cast<bool>(opt) == true);
>> +            assert(Z::dtor_called == false);
>> +            opt.emplace({1, 2});
>> +        }
>> +        catch (int i)
>> +        {
>> +            assert(i == 6);
>> +            assert(static_cast<bool>(opt) == false);
>> +            assert(Z::dtor_called == true);
>> +        }
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/move.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/move.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/move.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/move.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,101 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// optional<T>& operator=(optional<T>&& rhs)
>> +//     noexcept(is_nothrow_move_assignable<T>::value &&
>> +//              is_nothrow_move_constructible<T>::value);
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct X
>> +{
>> +    static bool throw_now;
>> +
>> +    X() = default;
>> +    X(X&&)
>> +    {
>> +        if (throw_now)
>> +            throw 6;
>> +    }
>> +    X& operator=(X&&) noexcept
>> +    {
>> +        return *this;
>> +    }
>> +};
>> +
>> +struct Y {};
>> +
>> +bool X::throw_now = false;
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        static_assert(std::is_nothrow_move_assignable<std::optional<int>>::value, "");
>> +        std::optional<int> opt;
>> +        constexpr std::optional<int> opt2;
>> +        opt = std::move(opt2);
>> +        static_assert(static_cast<bool>(opt2) == false, "");
>> +        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));
>> +    }
>> +    {
>> +        std::optional<int> opt;
>> +        constexpr std::optional<int> opt2(2);
>> +        opt = std::move(opt2);
>> +        static_assert(static_cast<bool>(opt2) == true, "");
>> +        static_assert(*opt2 == 2, "");
>> +        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));
>> +        assert(*opt == *opt2);
>> +    }
>> +    {
>> +        std::optional<int> opt(3);
>> +        constexpr std::optional<int> opt2;
>> +        opt = std::move(opt2);
>> +        static_assert(static_cast<bool>(opt2) == false, "");
>> +        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));
>> +    }
>> +    {
>> +        std::optional<int> opt(3);
>> +        constexpr std::optional<int> opt2(2);
>> +        opt = std::move(opt2);
>> +        static_assert(static_cast<bool>(opt2) == true, "");
>> +        static_assert(*opt2 == 2, "");
>> +        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));
>> +        assert(*opt == *opt2);
>> +    }
>> +    {
>> +        static_assert(!std::is_nothrow_move_assignable<std::optional<X>>::value, "");
>> +        std::optional<X> opt;
>> +        std::optional<X> opt2(X{});
>> +        assert(static_cast<bool>(opt2) == true);
>> +        try
>> +        {
>> +            X::throw_now = true;
>> +            opt = std::move(opt2);
>> +            assert(false);
>> +        }
>> +        catch (int i)
>> +        {
>> +            assert(i == 6);
>> +            assert(static_cast<bool>(opt) == false);
>> +        }
>> +    }
>> +    {
>> +        static_assert(std::is_nothrow_move_assignable<std::optional<Y>>::value, "");
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/nullopt_t.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/nullopt_t.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/nullopt_t.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.assign/nullopt_t.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,63 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// optional<T>& operator=(nullopt_t) noexcept;
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct X
>> +{
>> +    static bool dtor_called;
>> +    ~X() {dtor_called = true;}
>> +};
>> +
>> +bool X::dtor_called = false;
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        std::optional<int> opt;
>> +        static_assert(noexcept(opt = std::nullopt) == true, "");
>> +        opt = std::nullopt;
>> +        assert(static_cast<bool>(opt) == false);
>> +    }
>> +    {
>> +        std::optional<int> opt(3);
>> +        opt = std::nullopt;
>> +        assert(static_cast<bool>(opt) == false);
>> +    }
>> +    {
>> +        std::optional<X> opt;
>> +        static_assert(noexcept(opt = std::nullopt) == true, "");
>> +        assert(X::dtor_called == false);
>> +        opt = std::nullopt;
>> +        assert(X::dtor_called == false);
>> +        assert(static_cast<bool>(opt) == false);
>> +    }
>> +    {
>> +        X x;
>> +        {
>> +            std::optional<X> opt(x);
>> +            assert(X::dtor_called == false);
>> +            opt = std::nullopt;
>> +            assert(X::dtor_called == true);
>> +            assert(static_cast<bool>(opt) == false);
>> +        }
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/const_T.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/const_T.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/const_T.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/const_T.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,115 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// constexpr optional(const T& v);
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +class X
>> +{
>> +    int i_;
>> +public:
>> +    X(int i) : i_(i) {}
>> +
>> +    friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}
>> +};
>> +
>> +class Y
>> +{
>> +    int i_;
>> +public:
>> +    constexpr Y(int i) : i_(i) {}
>> +
>> +    friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_;}
>> +};
>> +
>> +class Z
>> +{
>> +    int i_;
>> +public:
>> +    Z(int i) : i_(i) {}
>> +    Z(const Z&) {throw 6;}
>> +};
>> +
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        typedef int T;
>> +        constexpr T t(5);
>> +        constexpr std::optional<T> opt(t);
>> +        static_assert(static_cast<bool>(opt) == true, "");
>> +        static_assert(*opt == 5, "");
>> +
>> +        struct test_constexpr_ctor
>> +            : public std::optional<T>
>> +        {
>> +            constexpr test_constexpr_ctor(const T&) {}
>> +        };
>> +
>> +    }
>> +    {
>> +        typedef double T;
>> +        constexpr T t(3);
>> +        constexpr std::optional<T> opt(t);
>> +        static_assert(static_cast<bool>(opt) == true, "");
>> +        static_assert(*opt == 3, "");
>> +
>> +        struct test_constexpr_ctor
>> +            : public std::optional<T>
>> +        {
>> +            constexpr test_constexpr_ctor(const T&) {}
>> +        };
>> +
>> +    }
>> +    {
>> +        typedef X T;
>> +        const T t(3);
>> +        std::optional<T> opt(t);
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == 3);
>> +    }
>> +    {
>> +        typedef Y T;
>> +        constexpr T t(3);
>> +        constexpr std::optional<T> opt(t);
>> +        static_assert(static_cast<bool>(opt) == true, "");
>> +        static_assert(*opt == 3, "");
>> +
>> +        struct test_constexpr_ctor
>> +            : public std::optional<T>
>> +        {
>> +            constexpr test_constexpr_ctor(const T&) {}
>> +        };
>> +
>> +    }
>> +    {
>> +        typedef Z T;
>> +        try
>> +        {
>> +            const T t(3);
>> +            std::optional<T> opt(t);
>> +            assert(false);
>> +        }
>> +        catch (int i)
>> +        {
>> +            assert(i == 6);
>> +        }
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,122 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// optional(const optional<T>& rhs);
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +template <class T>
>> +void
>> +test(const std::optional<T>& rhs, bool is_going_to_throw = false)
>> +{
>> +    bool rhs_engaged = static_cast<bool>(rhs);
>> +    try
>> +    {
>> +        std::optional<T> lhs = rhs;
>> +        assert(is_going_to_throw == false);
>> +        assert(static_cast<bool>(lhs) == rhs_engaged);
>> +        if (rhs_engaged)
>> +            assert(*lhs == *rhs);
>> +    }
>> +    catch (int i)
>> +    {
>> +        assert(i == 6);
>> +    }
>> +}
>> +
>> +class X
>> +{
>> +    int i_;
>> +public:
>> +    X(int i) : i_(i) {}
>> +    X(const X& x) : i_(x.i_) {}
>> +    ~X() {i_ = 0;}
>> +    friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}
>> +};
>> +
>> +class Y
>> +{
>> +    int i_;
>> +public:
>> +    Y(int i) : i_(i) {}
>> +    Y(const Y& x) : i_(x.i_) {}
>> +
>> +    friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_;}
>> +};
>> +
>> +int count = 0;
>> +
>> +class Z
>> +{
>> +    int i_;
>> +public:
>> +    Z(int i) : i_(i) {}
>> +    Z(const Z&)
>> +    {
>> +        if (++count == 2)
>> +            throw 6;
>> +    }
>> +
>> +    friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_;}
>> +};
>> +
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        typedef int T;
>> +        std::optional<T> rhs;
>> +        test(rhs);
>> +    }
>> +    {
>> +        typedef int T;
>> +        std::optional<T> rhs(3);
>> +        test(rhs);
>> +    }
>> +    {
>> +        typedef X T;
>> +        std::optional<T> rhs;
>> +        test(rhs);
>> +    }
>> +    {
>> +        typedef X T;
>> +        std::optional<T> rhs(X(3));
>> +        test(rhs);
>> +    }
>> +    {
>> +        typedef Y T;
>> +        std::optional<T> rhs;
>> +        test(rhs);
>> +    }
>> +    {
>> +        typedef Y T;
>> +        std::optional<T> rhs(Y(3));
>> +        test(rhs);
>> +    }
>> +    {
>> +        typedef Z T;
>> +        std::optional<T> rhs;
>> +        test(rhs);
>> +    }
>> +    {
>> +        typedef Z T;
>> +        std::optional<T> rhs(Z(3));
>> +        test(rhs, true);
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/default.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/default.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/default.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/default.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,65 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// constexpr optional() noexcept;
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +template <class Opt>
>> +void
>> +test_constexpr()
>> +{
>> +    static_assert(std::is_nothrow_default_constructible<Opt>::value, "");
>> +    constexpr Opt opt;
>> +    static_assert(static_cast<bool>(opt) == false, "");
>> +
>> +    struct test_constexpr_ctor
>> +        : public Opt
>> +    {
>> +        constexpr test_constexpr_ctor() {}
>> +    };
>> +
>> +}
>> +
>> +template <class Opt>
>> +void
>> +test()
>> +{
>> +    static_assert(std::is_nothrow_default_constructible<Opt>::value, "");
>> +    Opt opt;
>> +    assert(static_cast<bool>(opt) == false);
>> +
>> +    struct test_constexpr_ctor
>> +        : public Opt
>> +    {
>> +        constexpr test_constexpr_ctor() {}
>> +    };
>> +}
>> +
>> +struct X
>> +{
>> +    X();
>> +};
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    test_constexpr<std::optional<int>>();
>> +    test_constexpr<std::optional<int*>>();
>> +    test<std::optional<X>>();
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,141 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// template <class... Args>
>> +//   constexpr explicit optional(in_place_t, Args&&... args);
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +class X
>> +{
>> +    int i_;
>> +    int j_ = 0;
>> +public:
>> +    X() : i_(0) {}
>> +    X(int i) : i_(i) {}
>> +    X(int i, int j) : i_(i), j_(j) {}
>> +
>> +    ~X() {}
>> +
>> +    friend bool operator==(const X& x, const X& y)
>> +        {return x.i_ == y.i_ && x.j_ == y.j_;}
>> +};
>> +
>> +class Y
>> +{
>> +    int i_;
>> +    int j_ = 0;
>> +public:
>> +    constexpr Y() : i_(0) {}
>> +    constexpr Y(int i) : i_(i) {}
>> +    constexpr Y(int i, int j) : i_(i), j_(j) {}
>> +
>> +    friend constexpr bool operator==(const Y& x, const Y& y)
>> +        {return x.i_ == y.i_ && x.j_ == y.j_;}
>> +};
>> +
>> +class Z
>> +{
>> +    int i_;
>> +public:
>> +    Z(int i) : i_(i) {throw 6;}
>> +};
>> +
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        constexpr std::optional<int> opt(std::in_place, 5);
>> +        static_assert(static_cast<bool>(opt) == true, "");
>> +        static_assert(*opt == 5, "");
>> +
>> +        struct test_constexpr_ctor
>> +            : public std::optional<int>
>> +        {
>> +            constexpr test_constexpr_ctor(std::in_place_t, int i)
>> +                : std::optional<int>(std::in_place, i) {}
>> +        };
>> +
>> +    }
>> +    {
>> +        const std::optional<X> opt(std::in_place);
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == X());
>> +    }
>> +    {
>> +        const std::optional<X> opt(std::in_place, 5);
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == X(5));
>> +    }
>> +    {
>> +        const std::optional<X> opt(std::in_place, 5, 4);
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == X(5, 4));
>> +    }
>> +    {
>> +        constexpr std::optional<Y> opt(std::in_place);
>> +        static_assert(static_cast<bool>(opt) == true, "");
>> +        static_assert(*opt == Y(), "");
>> +
>> +        struct test_constexpr_ctor
>> +            : public std::optional<Y>
>> +        {
>> +            constexpr test_constexpr_ctor(std::in_place_t)
>> +                : std::optional<Y>(std::in_place) {}
>> +        };
>> +
>> +    }
>> +    {
>> +        constexpr std::optional<Y> opt(std::in_place, 5);
>> +        static_assert(static_cast<bool>(opt) == true, "");
>> +        static_assert(*opt == Y(5), "");
>> +
>> +        struct test_constexpr_ctor
>> +            : public std::optional<Y>
>> +        {
>> +            constexpr test_constexpr_ctor(std::in_place_t, int i)
>> +                : std::optional<Y>(std::in_place, i) {}
>> +        };
>> +
>> +    }
>> +    {
>> +        constexpr std::optional<Y> opt(std::in_place, 5, 4);
>> +        static_assert(static_cast<bool>(opt) == true, "");
>> +        static_assert(*opt == Y(5, 4), "");
>> +
>> +        struct test_constexpr_ctor
>> +            : public std::optional<Y>
>> +        {
>> +            constexpr test_constexpr_ctor(std::in_place_t, int i, int j)
>> +                : std::optional<Y>(std::in_place, i, j) {}
>> +        };
>> +
>> +    }
>> +    {
>> +        try
>> +        {
>> +            const std::optional<Z> opt(std::in_place, 1);
>> +            assert(false);
>> +        }
>> +        catch (int i)
>> +        {
>> +            assert(i == 6);
>> +        }
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,122 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// template <class U, class... Args>
>> +//     constexpr
>> +//     explicit optional(in_place_t, initializer_list<U> il, Args&&... args);
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <vector>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +class X
>> +{
>> +    int i_;
>> +    int j_ = 0;
>> +public:
>> +    X() : i_(0) {}
>> +    X(int i) : i_(i) {}
>> +    X(int i, int j) : i_(i), j_(j) {}
>> +
>> +    ~X() {}
>> +
>> +    friend bool operator==(const X& x, const X& y)
>> +        {return x.i_ == y.i_ && x.j_ == y.j_;}
>> +};
>> +
>> +class Y
>> +{
>> +    int i_;
>> +    int j_ = 0;
>> +public:
>> +    constexpr Y() : i_(0) {}
>> +    constexpr Y(int i) : i_(i) {}
>> +    constexpr Y(std::initializer_list<int> il) : i_(il.begin()[0]), j_(il.begin()[1]) {}
>> +
>> +    friend constexpr bool operator==(const Y& x, const Y& y)
>> +        {return x.i_ == y.i_ && x.j_ == y.j_;}
>> +};
>> +
>> +class Z
>> +{
>> +    int i_;
>> +    int j_ = 0;
>> +public:
>> +    constexpr Z() : i_(0) {}
>> +    constexpr Z(int i) : i_(i) {}
>> +    constexpr Z(std::initializer_list<int> il) : i_(il.begin()[0]), j_(il.begin()[1])
>> +        {throw 6;}
>> +
>> +    friend constexpr bool operator==(const Z& x, const Z& y)
>> +        {return x.i_ == y.i_ && x.j_ == y.j_;}
>> +};
>> +
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        static_assert(!std::is_constructible<X, std::initializer_list<int>&>::value, "");
>> +        static_assert(!std::is_constructible<std::optional<X>, std::initializer_list<int>&>::value, "");
>> +    }
>> +    {
>> +        std::optional<std::vector<int>> opt(std::in_place, {3, 1});
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert((*opt == std::vector<int>{3, 1}));
>> +        assert(opt->size() == 2);
>> +    }
>> +    {
>> +        std::optional<std::vector<int>> opt(std::in_place, {3, 1}, std::allocator<int>());
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert((*opt == std::vector<int>{3, 1}));
>> +        assert(opt->size() == 2);
>> +    }
>> +    {
>> +        static_assert(std::is_constructible<std::optional<Y>, std::initializer_list<int>&>::value, "");
>> +        constexpr std::optional<Y> opt(std::in_place, {3, 1});
>> +        static_assert(static_cast<bool>(opt) == true, "");
>> +        static_assert(*opt == Y{3, 1}, "");
>> +
>> +        struct test_constexpr_ctor
>> +            : public std::optional<Y>
>> +        {
>> +            constexpr test_constexpr_ctor(std::in_place_t, std::initializer_list<int> i)
>> +                : std::optional<Y>(std::in_place, i) {}
>> +        };
>> +
>> +    }
>> +    {
>> +        static_assert(std::is_constructible<std::optional<Z>, std::initializer_list<int>&>::value, "");
>> +        try
>> +        {
>> +            std::optional<Z> opt(std::in_place, {3, 1});
>> +            assert(false);
>> +        }
>> +        catch (int i)
>> +        {
>> +            assert(i == 6);
>> +        }
>> +
>> +        struct test_constexpr_ctor
>> +            : public std::optional<Z>
>> +        {
>> +            constexpr test_constexpr_ctor(std::in_place_t, std::initializer_list<int> i)
>> +                : std::optional<Z>(std::in_place, i) {}
>> +        };
>> +
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,122 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// optional(optional<T>&& rhs) noexcept(is_nothrow_move_constructible<T>::value);
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +template <class T>
>> +void
>> +test(std::optional<T>& rhs, bool is_going_to_throw = false)
>> +{
>> +    static_assert(std::is_nothrow_move_constructible<std::optional<T>>::value ==
>> +                  std::is_nothrow_move_constructible<T>::value, "");
>> +    bool rhs_engaged = static_cast<bool>(rhs);
>> +    try
>> +    {
>> +        std::optional<T> lhs = std::move(rhs);
>> +        assert(is_going_to_throw == false);
>> +        assert(static_cast<bool>(lhs) == rhs_engaged);
>> +    }
>> +    catch (int i)
>> +    {
>> +        assert(i == 6);
>> +    }
>> +}
>> +
>> +class X
>> +{
>> +    int i_;
>> +public:
>> +    X(int i) : i_(i) {}
>> +    X(X&& x) : i_(x.i_) {x.i_ = 0;}
>> +    ~X() {i_ = 0;}
>> +    friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}
>> +};
>> +
>> +class Y
>> +{
>> +    int i_;
>> +public:
>> +    Y(int i) : i_(i) {}
>> +    Y(Y&& x) noexcept : i_(x.i_) {x.i_ = 0;}
>> +
>> +    friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_;}
>> +};
>> +
>> +int count = 0;
>> +
>> +class Z
>> +{
>> +    int i_;
>> +public:
>> +    Z(int i) : i_(i) {}
>> +    Z(Z&&)
>> +    {
>> +        if (++count == 2)
>> +            throw 6;
>> +    }
>> +
>> +    friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_;}
>> +};
>> +
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        typedef int T;
>> +        std::optional<T> rhs;
>> +        test(rhs);
>> +    }
>> +    {
>> +        typedef int T;
>> +        std::optional<T> rhs(3);
>> +        test(rhs);
>> +    }
>> +    {
>> +        typedef X T;
>> +        std::optional<T> rhs;
>> +        test(rhs);
>> +    }
>> +    {
>> +        typedef X T;
>> +        std::optional<T> rhs(X(3));
>> +        test(rhs);
>> +    }
>> +    {
>> +        typedef Y T;
>> +        std::optional<T> rhs;
>> +        test(rhs);
>> +    }
>> +    {
>> +        typedef Y T;
>> +        std::optional<T> rhs(Y(3));
>> +        test(rhs);
>> +    }
>> +    {
>> +        typedef Z T;
>> +        std::optional<T> rhs;
>> +        test(rhs);
>> +    }
>> +    {
>> +        typedef Z T;
>> +        std::optional<T> rhs(Z(3));
>> +        test(rhs, true);
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/nullopt_t.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/nullopt_t.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/nullopt_t.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/nullopt_t.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,64 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// constexpr optional(nullopt_t) noexcept;
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +template <class Opt>
>> +void
>> +test_constexpr()
>> +{
>> +    static_assert(noexcept(Opt(std::nullopt)), "");
>> +    constexpr Opt opt(std::nullopt);
>> +    static_assert(static_cast<bool>(opt) == false, "");
>> +
>> +    struct test_constexpr_ctor
>> +        : public Opt
>> +    {
>> +        constexpr test_constexpr_ctor() {}
>> +    };
>> +}
>> +
>> +template <class Opt>
>> +void
>> +test()
>> +{
>> +    static_assert(noexcept(Opt(std::nullopt)), "");
>> +    Opt opt(std::nullopt);
>> +    assert(static_cast<bool>(opt) == false);
>> +
>> +    struct test_constexpr_ctor
>> +        : public Opt
>> +    {
>> +        constexpr test_constexpr_ctor() {}
>> +    };
>> +}
>> +
>> +struct X
>> +{
>> +    X();
>> +};
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    test_constexpr<std::optional<int>>();
>> +    test_constexpr<std::optional<int*>>();
>> +    test<std::optional<X>>();
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,108 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// constexpr optional(T&& v);
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +class X
>> +{
>> +    int i_;
>> +public:
>> +    X(int i) : i_(i) {}
>> +    X(X&& x) : i_(x.i_) {}
>> +
>> +    friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}
>> +};
>> +
>> +class Y
>> +{
>> +    int i_;
>> +public:
>> +    constexpr Y(int i) : i_(i) {}
>> +    constexpr Y(Y&& x) : i_(x.i_) {}
>> +
>> +    friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_;}
>> +};
>> +
>> +class Z
>> +{
>> +    int i_;
>> +public:
>> +    Z(int i) : i_(i) {}
>> +    Z(Z&&) {throw 6;}
>> +};
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        typedef int T;
>> +        constexpr std::optional<T> opt(T(5));
>> +        static_assert(static_cast<bool>(opt) == true, "");
>> +        static_assert(*opt == 5, "");
>> +
>> +        struct test_constexpr_ctor
>> +            : public std::optional<T>
>> +        {
>> +            constexpr test_constexpr_ctor(T&&) {}
>> +        };
>> +    }
>> +    {
>> +        typedef double T;
>> +        constexpr std::optional<T> opt(T(3));
>> +        static_assert(static_cast<bool>(opt) == true, "");
>> +        static_assert(*opt == 3, "");
>> +
>> +        struct test_constexpr_ctor
>> +            : public std::optional<T>
>> +        {
>> +            constexpr test_constexpr_ctor(T&&) {}
>> +        };
>> +    }
>> +    {
>> +        typedef X T;
>> +        std::optional<T> opt(T(3));
>> +        assert(static_cast<bool>(opt) == true);
>> +        assert(*opt == 3);
>> +    }
>> +    {
>> +        typedef Y T;
>> +        constexpr std::optional<T> opt(T(3));
>> +        static_assert(static_cast<bool>(opt) == true, "");
>> +        static_assert(*opt == 3, "");
>> +
>> +        struct test_constexpr_ctor
>> +            : public std::optional<T>
>> +        {
>> +            constexpr test_constexpr_ctor(T&&) {}
>> +        };
>> +    }
>> +    {
>> +        typedef Z T;
>> +        try
>> +        {
>> +            std::optional<T> opt(T(3));
>> +            assert(false);
>> +        }
>> +        catch (int i)
>> +        {
>> +            assert(i == 6);
>> +        }
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,57 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// ~optional();
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +class X
>> +{
>> +public:
>> +    static bool dtor_called;
>> +    X() = default;
>> +    ~X() {dtor_called = true;}
>> +};
>> +
>> +bool X::dtor_called = false;
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        typedef int T;
>> +        static_assert(std::is_trivially_destructible<T>::value, "");
>> +        static_assert(std::is_trivially_destructible<std::optional<T>>::value, "");
>> +    }
>> +    {
>> +        typedef double T;
>> +        static_assert(std::is_trivially_destructible<T>::value, "");
>> +        static_assert(std::is_trivially_destructible<std::optional<T>>::value, "");
>> +    }
>> +    {
>> +        typedef X T;
>> +        static_assert(!std::is_trivially_destructible<T>::value, "");
>> +        static_assert(!std::is_trivially_destructible<std::optional<T>>::value, "");
>> +        {
>> +            X x;
>> +            std::optional<X> opt{x};
>> +            assert(X::dtor_called == false);
>> +        }
>> +        assert(X::dtor_called == true);
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/bool.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/bool.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/bool.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/bool.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,30 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// constexpr explicit optional<T>::operator bool() const noexcept;
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        constexpr std::optional<int> opt;
>> +        static_assert(!opt, "");
>> +    }
>> +    {
>> +        constexpr std::optional<int> opt(0);
>> +        static_assert(opt, "");
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/dereference.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/dereference.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/dereference.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/dereference.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,47 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// T& optional<T>::operator*();
>> +
>> +#ifdef _LIBCPP_DEBUG
>> +#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
>> +#endif
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct X
>> +{
>> +    constexpr int test() const {return 3;}
>> +    int test() {return 4;}
>> +};
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        std::optional<X> opt(X{});
>> +        assert((*opt).test() == 4);
>> +    }
>> +#ifdef _LIBCPP_DEBUG
>> +    {
>> +        std::optional<X> opt;
>> +        assert((*opt).test() == 3);
>> +        assert(false);
>> +    }
>> +#endif  // _LIBCPP_DEBUG
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,55 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// constexpr const T& optional<T>::operator*() const;
>> +
>> +#ifdef _LIBCPP_DEBUG
>> +#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
>> +#endif
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct X
>> +{
>> +    constexpr int test() const {return 3;}
>> +};
>> +
>> +struct Y
>> +{
>> +    int test() const {return 2;}
>> +};
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        constexpr std::optional<X> opt(X{});
>> +        static_assert((*opt).test() == 3, "");
>> +    }
>> +    {
>> +        constexpr std::optional<Y> opt(Y{});
>> +        assert((*opt).test() == 2);
>> +    }
>> +#ifdef _LIBCPP_DEBUG
>> +    {
>> +        const std::optional<X> opt;
>> +        assert((*opt).test() == 3);
>> +        assert(false);
>> +    }
>> +#endif  // _LIBCPP_DEBUG
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/op_arrow.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/op_arrow.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/op_arrow.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/op_arrow.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,47 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// T* optional<T>::operator->();
>> +
>> +#ifdef _LIBCPP_DEBUG
>> +#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
>> +#endif
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct X
>> +{
>> +    int test() const {return 2;}
>> +    int test() {return 3;}
>> +};
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        std::optional<X> opt(X{});
>> +        assert(opt->test() == 3);
>> +    }
>> +#ifdef _LIBCPP_DEBUG
>> +    {
>> +        std::optional<X> opt;
>> +        assert(opt->test() == 3);
>> +        assert(false);
>> +    }
>> +#endif  // _LIBCPP_DEBUG
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/op_arrow_const.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/op_arrow_const.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/op_arrow_const.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/op_arrow_const.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,65 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// constexpr const T* optional<T>::operator->() const;
>> +
>> +#ifdef _LIBCPP_DEBUG
>> +#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
>> +#endif
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct X
>> +{
>> +    constexpr int test() const {return 3;}
>> +};
>> +
>> +struct Y
>> +{
>> +    int test() const {return 2;}
>> +};
>> +
>> +struct Z
>> +{
>> +    const Z* operator&() const {return this;}
>> +    constexpr int test() const {return 1;}
>> +};
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        constexpr std::optional<X> opt(X{});
>> +        static_assert(opt->test() == 3, "");
>> +    }
>> +    {
>> +        constexpr std::optional<Y> opt(Y{});
>> +        assert(opt->test() == 2);
>> +    }
>> +    {
>> +        constexpr std::optional<Z> opt(Z{});
>> +        assert(opt->test() == 1);
>> +    }
>> +#ifdef _LIBCPP_DEBUG
>> +    {
>> +        const std::optional<X> opt;
>> +        assert(opt->test() == 3);
>> +        assert(false);
>> +    }
>> +#endif  // _LIBCPP_DEBUG
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,50 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// T& optional<T>::value();
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct X
>> +{
>> +    X() = default;
>> +    X(const X&) = delete;
>> +    constexpr int test() const {return 3;}
>> +    int test() {return 4;}
>> +};
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        std::optional<X> opt;
>> +        opt.emplace();
>> +        assert(opt.value().test() == 4);
>> +    }
>> +    {
>> +        std::optional<X> opt;
>> +        try
>> +        {
>> +            opt.value();
>> +            assert(false);
>> +        }
>> +        catch (const std::bad_optional_access&)
>> +        {
>> +        }
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_const.fail.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_const.fail.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_const.fail.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_const.fail.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,38 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// constexpr const T& optional<T>::value() const;
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct X
>> +{
>> +    constexpr int test() const {return 3;}
>> +    int test() {return 4;}
>> +};
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        constexpr std::optional<X> opt;
>> +        static_assert(opt.value().test() == 3, "");
>> +    }
>> +#else
>> +#error
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_const.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_const.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_const.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_const.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,53 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// constexpr const T& optional<T>::value() const;
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct X
>> +{
>> +    X() = default;
>> +    X(const X&) = delete;
>> +   constexpr int test() const {return 3;}
>> +    int test() {return 4;}
>> +};
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        constexpr std::optional<X> opt(std::in_place);
>> +        static_assert(opt.value().test() == 3, "");
>> +    }
>> +    {
>> +        const std::optional<X> opt(std::in_place);
>> +        assert(opt.value().test() == 3);
>> +    }
>> +    {
>> +        const std::optional<X> opt;
>> +        try
>> +        {
>> +            opt.value();
>> +            assert(false);
>> +        }
>> +        catch (const std::bad_optional_access&)
>> +        {
>> +        }
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_or.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_or.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_or.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_or.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,67 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// template <class U> T optional<T>::value_or(U&& v) &&;
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct Y
>> +{
>> +    int i_;
>> +
>> +    Y(int i) : i_(i) {}
>> +};
>> +
>> +struct X
>> +{
>> +    int i_;
>> +
>> +    X(int i) : i_(i) {}
>> +    X(X&& x) : i_(x.i_) {x.i_ = 0;}
>> +    X(const Y& y) : i_(y.i_) {}
>> +    X(Y&& y) : i_(y.i_+1) {}
>> +    friend constexpr bool operator==(const X& x, const X& y)
>> +        {return x.i_ == y.i_;}
>> +};
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        std::optional<X> opt(std::in_place, 2);
>> +        Y y(3);
>> +        assert(std::move(opt).value_or(y) == 2);
>> +        assert(*opt == 0);
>> +    }
>> +    {
>> +        std::optional<X> opt(std::in_place, 2);
>> +        assert(std::move(opt).value_or(Y(3)) == 2);
>> +        assert(*opt == 0);
>> +    }
>> +    {
>> +        std::optional<X> opt;
>> +        Y y(3);
>> +        assert(std::move(opt).value_or(y) == 3);
>> +        assert(!opt);
>> +    }
>> +    {
>> +        std::optional<X> opt;
>> +        assert(std::move(opt).value_or(Y(3)) == 4);
>> +        assert(!opt);
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_or_const.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_or_const.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_or_const.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.observe/value_or_const.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,80 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// template <class U> constexpr T optional<T>::value_or(U&& v) const&;
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct Y
>> +{
>> +    int i_;
>> +
>> +    constexpr Y(int i) : i_(i) {}
>> +};
>> +
>> +struct X
>> +{
>> +    int i_;
>> +
>> +    constexpr X(int i) : i_(i) {}
>> +    constexpr X(const Y& y) : i_(y.i_) {}
>> +    constexpr X(Y&& y) : i_(y.i_+1) {}
>> +    friend constexpr bool operator==(const X& x, const X& y)
>> +        {return x.i_ == y.i_;}
>> +};
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        constexpr std::optional<X> opt(2);
>> +        constexpr Y y(3);
>> +        static_assert(opt.value_or(y) == 2, "");
>> +    }
>> +    {
>> +        constexpr std::optional<X> opt(2);
>> +        static_assert(opt.value_or(Y(3)) == 2, "");
>> +    }
>> +    {
>> +        constexpr std::optional<X> opt;
>> +        constexpr Y y(3);
>> +        static_assert(opt.value_or(y) == 3, "");
>> +    }
>> +    {
>> +        constexpr std::optional<X> opt;
>> +        static_assert(opt.value_or(Y(3)) == 4, "");
>> +    }
>> +    {
>> +        const std::optional<X> opt(2);
>> +        const Y y(3);
>> +        assert(opt.value_or(y) == 2);
>> +    }
>> +    {
>> +        const std::optional<X> opt(2);
>> +        assert(opt.value_or(Y(3)) == 2);
>> +    }
>> +    {
>> +        const std::optional<X> opt;
>> +        const Y y(3);
>> +        assert(opt.value_or(y) == 3);
>> +    }
>> +    {
>> +        const std::optional<X> opt;
>> +        assert(opt.value_or(Y(3)) == 4);
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional.object.swap/swap.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional.object.swap/swap.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional.object.swap/swap.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional.object.swap/swap.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,304 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// void swap(optional&)
>> +//     noexcept(is_nothrow_move_constructible<T>::value &&
>> +//              noexcept(swap(declval<T&>(), declval<T&>())));
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +class X
>> +{
>> +    int i_;
>> +public:
>> +    static unsigned dtor_called;
>> +    X(int i) : i_(i) {}
>> +    X(X&& x) = default;
>> +    X& operator=(X&&) = default;
>> +    ~X() {++dtor_called;}
>> +
>> +    friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}
>> +};
>> +
>> +unsigned X::dtor_called = 0;
>> +
>> +class Y
>> +{
>> +    int i_;
>> +public:
>> +    static unsigned dtor_called;
>> +    Y(int i) : i_(i) {}
>> +    Y(Y&&) = default;
>> +    ~Y() {++dtor_called;}
>> +
>> +    friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_;}
>> +    friend void swap(Y& x, Y& y) {std::swap(x.i_, y.i_);}
>> +};
>> +
>> +unsigned Y::dtor_called = 0;
>> +
>> +class Z
>> +{
>> +    int i_;
>> +public:
>> +    Z(int i) : i_(i) {}
>> +    Z(Z&&) {throw 7;}
>> +
>> +    friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_;}
>> +    friend void swap(Z& x, Z& y) {throw 6;}
>> +};
>> +
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        std::optional<int> opt1;
>> +        std::optional<int> opt2;
>> +        static_assert(noexcept(opt1.swap(opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        opt1.swap(opt2);
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +    }
>> +    {
>> +        std::optional<int> opt1(1);
>> +        std::optional<int> opt2;
>> +        static_assert(noexcept(opt1.swap(opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        opt1.swap(opt2);
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 1);
>> +    }
>> +    {
>> +        std::optional<int> opt1;
>> +        std::optional<int> opt2(2);
>> +        static_assert(noexcept(opt1.swap(opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        opt1.swap(opt2);
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 2);
>> +        assert(static_cast<bool>(opt2) == false);
>> +    }
>> +    {
>> +        std::optional<int> opt1(1);
>> +        std::optional<int> opt2(2);
>> +        static_assert(noexcept(opt1.swap(opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        opt1.swap(opt2);
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 2);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 1);
>> +    }
>> +    {
>> +        std::optional<X> opt1;
>> +        std::optional<X> opt2;
>> +        static_assert(noexcept(opt1.swap(opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        opt1.swap(opt2);
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        assert(X::dtor_called == 0);
>> +    }
>> +    {
>> +        std::optional<X> opt1(1);
>> +        std::optional<X> opt2;
>> +        static_assert(noexcept(opt1.swap(opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        X::dtor_called = 0;
>> +        opt1.swap(opt2);
>> +        assert(X::dtor_called == 1);
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 1);
>> +    }
>> +    {
>> +        std::optional<X> opt1;
>> +        std::optional<X> opt2(2);
>> +        static_assert(noexcept(opt1.swap(opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        X::dtor_called = 0;
>> +        opt1.swap(opt2);
>> +        assert(X::dtor_called == 1);
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 2);
>> +        assert(static_cast<bool>(opt2) == false);
>> +    }
>> +    {
>> +        std::optional<X> opt1(1);
>> +        std::optional<X> opt2(2);
>> +        static_assert(noexcept(opt1.swap(opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        X::dtor_called = 0;
>> +        opt1.swap(opt2);
>> +        assert(X::dtor_called == 1);  // from inside std::swap
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 2);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 1);
>> +    }
>> +    {
>> +        std::optional<Y> opt1;
>> +        std::optional<Y> opt2;
>> +        static_assert(noexcept(opt1.swap(opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        opt1.swap(opt2);
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        assert(Y::dtor_called == 0);
>> +    }
>> +    {
>> +        std::optional<Y> opt1(1);
>> +        std::optional<Y> opt2;
>> +        static_assert(noexcept(opt1.swap(opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        Y::dtor_called = 0;
>> +        opt1.swap(opt2);
>> +        assert(Y::dtor_called == 1);
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 1);
>> +    }
>> +    {
>> +        std::optional<Y> opt1;
>> +        std::optional<Y> opt2(2);
>> +        static_assert(noexcept(opt1.swap(opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        Y::dtor_called = 0;
>> +        opt1.swap(opt2);
>> +        assert(Y::dtor_called == 1);
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 2);
>> +        assert(static_cast<bool>(opt2) == false);
>> +    }
>> +    {
>> +        std::optional<Y> opt1(1);
>> +        std::optional<Y> opt2(2);
>> +        static_assert(noexcept(opt1.swap(opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        Y::dtor_called = 0;
>> +        opt1.swap(opt2);
>> +        assert(Y::dtor_called == 0);
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 2);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 1);
>> +    }
>> +    {
>> +        std::optional<Z> opt1;
>> +        std::optional<Z> opt2;
>> +        static_assert(noexcept(opt1.swap(opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        opt1.swap(opt2);
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +    }
>> +    {
>> +        std::optional<Z> opt1;
>> +        opt1.emplace(1);
>> +        std::optional<Z> opt2;
>> +        static_assert(noexcept(opt1.swap(opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        try
>> +        {
>> +            opt1.swap(opt2);
>> +            assert(false);
>> +        }
>> +        catch (int i)
>> +        {
>> +            assert(i == 7);
>> +        }
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == false);
>> +    }
>> +    {
>> +        std::optional<Z> opt1;
>> +        std::optional<Z> opt2;
>> +        opt2.emplace(2);
>> +        static_assert(noexcept(opt1.swap(opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        try
>> +        {
>> +            opt1.swap(opt2);
>> +            assert(false);
>> +        }
>> +        catch (int i)
>> +        {
>> +            assert(i == 7);
>> +        }
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +    }
>> +    {
>> +        std::optional<Z> opt1;
>> +        opt1.emplace(1);
>> +        std::optional<Z> opt2;
>> +        opt2.emplace(2);
>> +        static_assert(noexcept(opt1.swap(opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        try
>> +        {
>> +            opt1.swap(opt2);
>> +            assert(false);
>> +        }
>> +        catch (int i)
>> +        {
>> +            assert(i == 6);
>> +        }
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional_const_void.fail.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional_const_void.fail.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional_const_void.fail.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional_const_void.fail.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,23 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// T shall be an object type and shall satisfy the requirements of Destructible
>> +
>> +#include <optional>
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    std::optional<const void> opt;
>> +#else
>> +#error
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional_not_destructible.fail.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional_not_destructible.fail.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional_not_destructible.fail.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional_not_destructible.fail.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,33 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// T shall be an object type and shall satisfy the requirements of Destructible
>> +
>> +#include <optional>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct X
>> +{
>> +private:
>> +    ~X() {}
>> +};
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    std::optional<X> opt;
>> +#else
>> +#error
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional_not_noexcept_destructible.fail.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional_not_noexcept_destructible.fail.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional_not_noexcept_destructible.fail.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional_not_noexcept_destructible.fail.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,32 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// T shall be an object type and shall satisfy the requirements of Destructible
>> +
>> +#include <optional>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct X
>> +{
>> +    ~X() noexcept(false) {}
>> +};
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    std::optional<X> opt;
>> +#else
>> +#error
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/optional_void.fail.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/optional_void.fail.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/optional_void.fail.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/optional_void.fail.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,23 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// T shall be an object type and shall satisfy the requirements of Destructible
>> +
>> +#include <optional>
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    std::optional<void> opt;
>> +#else
>> +#error
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.object/types.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.object/types.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.object/types.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.object/types.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,41 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// template <class T>
>> +// class optional
>> +// {
>> +// public:
>> +//     typedef T value_type;
>> +//     ...
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +template <class Opt, class T>
>> +void
>> +test()
>> +{
>> +    static_assert(std::is_same<typename Opt::value_type, T>::value, "");
>> +}
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    test<std::optional<int>, int>();
>> +    test<std::optional<const int>, const int>();
>> +    test<std::optional<double>, double>();
>> +    test<std::optional<const double>, const double>();
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.relops/equal.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.relops/equal.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.relops/equal.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.relops/equal.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,63 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// template <class T> constexpr bool operator==(const optional<T>& x, const optional<T>& y);
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +    typedef int T;
>> +    typedef std::optional<T> O;
>> +
>> +    constexpr O o1;     // disengaged
>> +    constexpr O o2;     // disengaged
>> +    constexpr O o3{1};  // engaged
>> +    constexpr O o4{2};  // engaged
>> +    constexpr O o5{1};  // engaged
>> +
>> +    static_assert (   o1 == o1 , "" );
>> +    static_assert (   o1 == o2 , "" );
>> +    static_assert ( !(o1 == o3), "" );
>> +    static_assert ( !(o1 == o4), "" );
>> +    static_assert ( !(o1 == o5), "" );
>> +
>> +    static_assert (   o2 == o1 , "" );
>> +    static_assert (   o2 == o2 , "" );
>> +    static_assert ( !(o2 == o3), "" );
>> +    static_assert ( !(o2 == o4), "" );
>> +    static_assert ( !(o2 == o5), "" );
>> +
>> +    static_assert ( !(o3 == o1), "" );
>> +    static_assert ( !(o3 == o2), "" );
>> +    static_assert (   o3 == o3 , "" );
>> +    static_assert ( !(o3 == o4), "" );
>> +    static_assert (   o3 == o5 , "" );
>> +
>> +    static_assert ( !(o4 == o1), "" );
>> +    static_assert ( !(o4 == o2), "" );
>> +    static_assert ( !(o4 == o3), "" );
>> +    static_assert (   o4 == o4 , "" );
>> +    static_assert ( !(o4 == o5), "" );
>> +
>> +    static_assert ( !(o5 == o1), "" );
>> +    static_assert ( !(o5 == o2), "" );
>> +    static_assert (   o5 == o3 , "" );
>> +    static_assert ( !(o5 == o4), "" );
>> +    static_assert (   o5 == o5 , "" );
>> +
>> +    }
>> +#endif
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.relops/less_than.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.relops/less_than.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.relops/less_than.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.relops/less_than.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,86 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// template <class T> constexpr bool operator< (const optional<T>& x, const optional<T>& y);
>> +
>> +#include <optional>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +struct X
>> +{
>> +    int i_;
>> +
>> +    constexpr X(int i) : i_(i) {}
>> +};
>> +
>> +namespace std
>> +{
>> +
>> +template <>
>> +struct less<X>
>> +{
>> +    constexpr
>> +    bool
>> +    operator()(const X& x, const X& y) const
>> +    {
>> +        return x.i_ < y.i_;
>> +    }
>> +};
>> +
>> +}
>> +
>> +#endif
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +    typedef std::optional<X> O;
>> +
>> +    constexpr O o1;     // disengaged
>> +    constexpr O o2;     // disengaged
>> +    constexpr O o3{1};  // engaged
>> +    constexpr O o4{2};  // engaged
>> +    constexpr O o5{1};  // engaged
>> +
>> +    static_assert ( !(o1 < o1), "" );
>> +    static_assert ( !(o1 < o2), "" );
>> +    static_assert (   o1 < o3 , "" );
>> +    static_assert (   o1 < o4 , "" );
>> +    static_assert (   o1 < o5 , "" );
>> +
>> +    static_assert ( !(o2 < o1), "" );
>> +    static_assert ( !(o2 < o2), "" );
>> +    static_assert (   o2 < o3 , "" );
>> +    static_assert (   o2 < o4 , "" );
>> +    static_assert (   o2 < o5 , "" );
>> +
>> +    static_assert ( !(o3 < o1), "" );
>> +    static_assert ( !(o3 < o2), "" );
>> +    static_assert ( !(o3 < o3), "" );
>> +    static_assert (   o3 < o4 , "" );
>> +    static_assert ( !(o3 < o5), "" );
>> +
>> +    static_assert ( !(o4 < o1), "" );
>> +    static_assert ( !(o4 < o2), "" );
>> +    static_assert ( !(o4 < o3), "" );
>> +    static_assert ( !(o4 < o4), "" );
>> +    static_assert ( !(o4 < o5), "" );
>> +
>> +    static_assert ( !(o5 < o1), "" );
>> +    static_assert ( !(o5 < o2), "" );
>> +    static_assert ( !(o5 < o3), "" );
>> +    static_assert (   o5 < o4 , "" );
>> +    static_assert ( !(o5 < o5), "" );
>> +    }
>> +#endif
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.specalg/make_optional.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.specalg/make_optional.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.specalg/make_optional.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.specalg/make_optional.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,51 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// template <class T>
>> +//   constexpr
>> +//   optional<typename decay<T>::type>
>> +//   make_optional(T&& v);
>> +
>> +#include <optional>
>> +#include <string>
>> +#include <memory>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        std::optional<int> opt = std::make_optional(2);
>> +        assert(*opt == 2);
>> +    }
>> +    {
>> +        std::string s("123");
>> +        std::optional<std::string> opt = std::make_optional(s);
>> +        assert(*opt == s);
>> +    }
>> +    {
>> +        std::string s("123");
>> +        std::optional<std::string> opt = std::make_optional(std::move(s));
>> +        assert(*opt == "123");
>> +        assert(s.empty());
>> +    }
>> +    {
>> +        std::unique_ptr<int> s(new int(3));
>> +        std::optional<std::unique_ptr<int>> opt = std::make_optional(std::move(s));
>> +        assert(**opt == 3);
>> +        assert(s == nullptr);
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.specalg/swap.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.specalg/swap.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.specalg/swap.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.specalg/swap.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,303 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// template <class T> void swap(optional<T>& x, optional<T>& y)
>> +//     noexcept(noexcept(x.swap(y)));
>> +
>> +#include <optional>
>> +#include <type_traits>
>> +#include <cassert>
>> +
>> +#if _LIBCPP_STD_VER > 11
>> +
>> +class X
>> +{
>> +    int i_;
>> +public:
>> +    static unsigned dtor_called;
>> +    X(int i) : i_(i) {}
>> +    X(X&& x) = default;
>> +    X& operator=(X&&) = default;
>> +    ~X() {++dtor_called;}
>> +
>> +    friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}
>> +};
>> +
>> +unsigned X::dtor_called = 0;
>> +
>> +class Y
>> +{
>> +    int i_;
>> +public:
>> +    static unsigned dtor_called;
>> +    Y(int i) : i_(i) {}
>> +    Y(Y&&) = default;
>> +    ~Y() {++dtor_called;}
>> +
>> +    friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_;}
>> +    friend void swap(Y& x, Y& y) {std::swap(x.i_, y.i_);}
>> +};
>> +
>> +unsigned Y::dtor_called = 0;
>> +
>> +class Z
>> +{
>> +    int i_;
>> +public:
>> +    Z(int i) : i_(i) {}
>> +    Z(Z&&) {throw 7;}
>> +
>> +    friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_;}
>> +    friend void swap(Z& x, Z& y) {throw 6;}
>> +};
>> +
>> +
>> +#endif  // _LIBCPP_STD_VER > 11
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    {
>> +        std::optional<int> opt1;
>> +        std::optional<int> opt2;
>> +        static_assert(noexcept(swap(opt1, opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        swap(opt1, opt2);
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +    }
>> +    {
>> +        std::optional<int> opt1(1);
>> +        std::optional<int> opt2;
>> +        static_assert(noexcept(swap(opt1, opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        swap(opt1, opt2);
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 1);
>> +    }
>> +    {
>> +        std::optional<int> opt1;
>> +        std::optional<int> opt2(2);
>> +        static_assert(noexcept(swap(opt1, opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        swap(opt1, opt2);
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 2);
>> +        assert(static_cast<bool>(opt2) == false);
>> +    }
>> +    {
>> +        std::optional<int> opt1(1);
>> +        std::optional<int> opt2(2);
>> +        static_assert(noexcept(swap(opt1, opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        swap(opt1, opt2);
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 2);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 1);
>> +    }
>> +    {
>> +        std::optional<X> opt1;
>> +        std::optional<X> opt2;
>> +        static_assert(noexcept(swap(opt1, opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        swap(opt1, opt2);
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        assert(X::dtor_called == 0);
>> +    }
>> +    {
>> +        std::optional<X> opt1(1);
>> +        std::optional<X> opt2;
>> +        static_assert(noexcept(swap(opt1, opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        X::dtor_called = 0;
>> +        swap(opt1, opt2);
>> +        assert(X::dtor_called == 1);
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 1);
>> +    }
>> +    {
>> +        std::optional<X> opt1;
>> +        std::optional<X> opt2(2);
>> +        static_assert(noexcept(swap(opt1, opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        X::dtor_called = 0;
>> +        swap(opt1, opt2);
>> +        assert(X::dtor_called == 1);
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 2);
>> +        assert(static_cast<bool>(opt2) == false);
>> +    }
>> +    {
>> +        std::optional<X> opt1(1);
>> +        std::optional<X> opt2(2);
>> +        static_assert(noexcept(swap(opt1, opt2)) == true, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        X::dtor_called = 0;
>> +        swap(opt1, opt2);
>> +        assert(X::dtor_called == 1);  // from inside std::swap
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 2);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 1);
>> +    }
>> +    {
>> +        std::optional<Y> opt1;
>> +        std::optional<Y> opt2;
>> +        static_assert(noexcept(swap(opt1, opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        swap(opt1, opt2);
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        assert(Y::dtor_called == 0);
>> +    }
>> +    {
>> +        std::optional<Y> opt1(1);
>> +        std::optional<Y> opt2;
>> +        static_assert(noexcept(swap(opt1, opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        Y::dtor_called = 0;
>> +        swap(opt1, opt2);
>> +        assert(Y::dtor_called == 1);
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 1);
>> +    }
>> +    {
>> +        std::optional<Y> opt1;
>> +        std::optional<Y> opt2(2);
>> +        static_assert(noexcept(swap(opt1, opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        Y::dtor_called = 0;
>> +        swap(opt1, opt2);
>> +        assert(Y::dtor_called == 1);
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 2);
>> +        assert(static_cast<bool>(opt2) == false);
>> +    }
>> +    {
>> +        std::optional<Y> opt1(1);
>> +        std::optional<Y> opt2(2);
>> +        static_assert(noexcept(swap(opt1, opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        Y::dtor_called = 0;
>> +        swap(opt1, opt2);
>> +        assert(Y::dtor_called == 0);
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 2);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 1);
>> +    }
>> +    {
>> +        std::optional<Z> opt1;
>> +        std::optional<Z> opt2;
>> +        static_assert(noexcept(swap(opt1, opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        swap(opt1, opt2);
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == false);
>> +    }
>> +    {
>> +        std::optional<Z> opt1;
>> +        opt1.emplace(1);
>> +        std::optional<Z> opt2;
>> +        static_assert(noexcept(swap(opt1, opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == false);
>> +        try
>> +        {
>> +            swap(opt1, opt2);
>> +            assert(false);
>> +        }
>> +        catch (int i)
>> +        {
>> +            assert(i == 7);
>> +        }
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == false);
>> +    }
>> +    {
>> +        std::optional<Z> opt1;
>> +        std::optional<Z> opt2;
>> +        opt2.emplace(2);
>> +        static_assert(noexcept(swap(opt1, opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        try
>> +        {
>> +            swap(opt1, opt2);
>> +            assert(false);
>> +        }
>> +        catch (int i)
>> +        {
>> +            assert(i == 7);
>> +        }
>> +        assert(static_cast<bool>(opt1) == false);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +    }
>> +    {
>> +        std::optional<Z> opt1;
>> +        opt1.emplace(1);
>> +        std::optional<Z> opt2;
>> +        opt2.emplace(2);
>> +        static_assert(noexcept(swap(opt1, opt2)) == false, "");
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +        try
>> +        {
>> +            swap(opt1, opt2);
>> +            assert(false);
>> +        }
>> +        catch (int i)
>> +        {
>> +            assert(i == 6);
>> +        }
>> +        assert(static_cast<bool>(opt1) == true);
>> +        assert(*opt1 == 1);
>> +        assert(static_cast<bool>(opt2) == true);
>> +        assert(*opt2 == 2);
>> +    }
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.syn/optional_const_in_place_t.fail.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.syn/optional_const_in_place_t.fail.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.syn/optional_const_in_place_t.fail.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.syn/optional_const_in_place_t.fail.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,24 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// A program that necessitates the instantiation of template optional for
>> +// (possibly cv-qualified) in_place_t is ill-formed.
>> +
>> +#include <optional>
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    std::optional<const std::inplace_t> opt;
>> +#else
>> +#error
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.syn/optional_const_lvalue_ref.fail.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.syn/optional_const_lvalue_ref.fail.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.syn/optional_const_lvalue_ref.fail.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.syn/optional_const_lvalue_ref.fail.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,24 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// A program that necessitates the instantiation of template optional for a
>> +// reference type is ill-formed.
>> +
>> +#include <optional>
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    std::optional<const int&> opt;
>> +#else
>> +#error
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.syn/optional_const_nullopt_t.fail.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.syn/optional_const_nullopt_t.fail.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.syn/optional_const_nullopt_t.fail.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.syn/optional_const_nullopt_t.fail.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,24 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// A program that necessitates the instantiation of template optional for
>> +// (possibly cv-qualified) null_opt_t is ill-formed.
>> +
>> +#include <optional>
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    std::optional<const std::nullopt_t> opt;
>> +#else
>> +#error
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.syn/optional_in_place_t.fail.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.syn/optional_in_place_t.fail.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.syn/optional_in_place_t.fail.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.syn/optional_in_place_t.fail.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,24 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// A program that necessitates the instantiation of template optional for
>> +// (possibly cv-qualified) in_place_t is ill-formed.
>> +
>> +#include <optional>
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    std::optional<std::inplace_t> opt;
>> +#else
>> +#error
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.syn/optional_includes_initializer_list.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.syn/optional_includes_initializer_list.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.syn/optional_includes_initializer_list.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.syn/optional_includes_initializer_list.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,21 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// #include <initializer_list>
>> +
>> +#include <optional>
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    std::initializer_list<int> list;
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.syn/optional_lvalue_ref.fail.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.syn/optional_lvalue_ref.fail.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.syn/optional_lvalue_ref.fail.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.syn/optional_lvalue_ref.fail.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,24 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// A program that necessitates the instantiation of template optional for a
>> +// reference type is ill-formed.
>> +
>> +#include <optional>
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    std::optional<int&> opt;
>> +#else
>> +#error
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.syn/optional_nullopt_t.fail.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.syn/optional_nullopt_t.fail.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.syn/optional_nullopt_t.fail.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.syn/optional_nullopt_t.fail.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,24 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// A program that necessitates the instantiation of template optional for
>> +// (possibly cv-qualified) null_opt_t is ill-formed.
>> +
>> +#include <optional>
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    std::optional<std::nullopt_t> opt;
>> +#else
>> +#error
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/optional.syn/optional_rvalue_ref.fail.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/optional.syn/optional_rvalue_ref.fail.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/optional.syn/optional_rvalue_ref.fail.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/optional.syn/optional_rvalue_ref.fail.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,24 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +// A program that necessitates the instantiation of template optional for a
>> +// reference type is ill-formed.
>> +
>> +#include <optional>
>> +
>> +int main()
>> +{
>> +#if _LIBCPP_STD_VER > 11
>> +    std::optional<int&&> opt;
>> +#else
>> +#error
>> +#endif  // _LIBCPP_STD_VER > 11
>> +}
>> 
>> Added: libcxx/trunk/test/utilities/optional/version.pass.cpp
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/optional/version.pass.cpp?rev=189772&view=auto
>> ==============================================================================
>> --- libcxx/trunk/test/utilities/optional/version.pass.cpp (added)
>> +++ libcxx/trunk/test/utilities/optional/version.pass.cpp Mon Sep  2 15:30:37 2013
>> @@ -0,0 +1,20 @@
>> +//===----------------------------------------------------------------------===//
>> +//
>> +//                     The LLVM Compiler Infrastructure
>> +//
>> +// This file is dual licensed under the MIT and the University of Illinois Open
>> +// Source Licenses. See LICENSE.TXT for details.
>> +//
>> +//===----------------------------------------------------------------------===//
>> +
>> +// <optional>
>> +
>> +#include <optional>
>> +
>> +#ifndef _LIBCPP_VERSION
>> +#error _LIBCPP_VERSION not defined
>> +#endif
>> +
>> +int main()
>> +{
>> +}
>> 
>> Modified: libcxx/trunk/www/cxx1y_status.html
>> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/www/cxx1y_status.html?rev=189772&r1=189771&r2=189772&view=diff
>> ==============================================================================
>> --- libcxx/trunk/www/cxx1y_status.html (original)
>> +++ libcxx/trunk/www/cxx1y_status.html Mon Sep  2 15:30:37 2013
>> @@ -87,7 +87,7 @@
>>        <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3642.pdf">3642</a></td><td>LWG</td><td>User-defined Literals</td><td>Bristol</td><td>Complete</td><td>3.4</td></tr>
>>        <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3655.pdf">3655</a></td><td>LWG</td><td>TransformationTraits Redux (excluding part 4)</td><td>Bristol</td><td>Complete</td><td>3.4</td></tr>
>>        <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3657.htm">3657</a></td><td>LWG</td><td>Adding heterogeneous comparison lookup to associative containers</td><td>Bristol</td><td>Complete</td><td>3.4</td></tr>
>> -       <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3672.html">3672</a></td><td>LWG</td><td>A proposal to add a utility class to represent optional objects</td><td>Bristol</td><td></td><td></td></tr>
>> +       <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3672.html">3672</a></td><td>LWG</td><td>A proposal to add a utility class to represent optional objects</td><td>Bristol</td><td></td><td>Complete</td></tr>
>>        <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3669.pdf">3669</a></td><td>LWG</td><td>Fixing constexpr member functions without const</td><td>Bristol</td><td>Complete</td><td>3.4</td></tr>
>>        <tr><td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3662.html">3662</a></td><td>LWG</td><td>C++ Dynamic Arrays (dynarray)</td><td>Bristol</td><td></td><td></td></tr>
>> 
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> <noexcept.patch>




More information about the cfe-commits mailing list