111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The LLVM Compiler Infrastructure 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details. 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <optional> 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// template <class U> optional<T>& operator=(U&& v); 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <experimental/optional> 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <type_traits> 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert> 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <memory> 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if _LIBCPP_STD_VER > 11 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertusing std::experimental::optional; 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct X 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // _LIBCPP_STD_VER > 11 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main() 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if _LIBCPP_STD_VER > 11 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert(std::is_assignable<optional<int>, int>::value, ""); 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert(std::is_assignable<optional<int>, int&>::value, ""); 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert(std::is_assignable<optional<int>&, int>::value, ""); 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert(std::is_assignable<optional<int>&, int&>::value, ""); 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert(std::is_assignable<optional<int>&, const int&>::value, ""); 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert(!std::is_assignable<const optional<int>&, const int&>::value, ""); 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert(!std::is_assignable<optional<int>, X>::value, ""); 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert optional<int> opt; 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert opt = 1; 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(static_cast<bool>(opt) == true); 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(*opt == 1); 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert optional<int> opt; 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const int i = 2; 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert opt = i; 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(static_cast<bool>(opt) == true); 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(*opt == i); 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert optional<int> opt(3); 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert const int i = 2; 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert opt = i; 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(static_cast<bool>(opt) == true); 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(*opt == i); 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert optional<std::unique_ptr<int>> opt; 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert opt = std::unique_ptr<int>(new int(3)); 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(static_cast<bool>(opt) == true); 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(**opt == 3); 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert optional<std::unique_ptr<int>> opt(std::unique_ptr<int>(new int(2))); 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert opt = std::unique_ptr<int>(new int(3)); 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(static_cast<bool>(opt) == true); 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(**opt == 3); 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // _LIBCPP_STD_VER > 11 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 73