101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant//===----------------------------------------------------------------------===// 201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant// 301afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant// The LLVM Compiler Infrastructure 401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant// 501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant// 801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant//===----------------------------------------------------------------------===// 901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant 1001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant// <optional> 1101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant 1201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant// template <class... Args> void optional<T>::emplace(Args&&... args); 1301afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant 140cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow#include <experimental/optional> 1501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant#include <type_traits> 1601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant#include <cassert> 1701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant#include <memory> 1801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant 1901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant#if _LIBCPP_STD_VER > 11 2001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant 210cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clowusing std::experimental::optional; 220cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow 2301afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnantclass X 2401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant{ 2501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant int i_; 2601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant int j_ = 0; 2701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnantpublic: 2801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant X() : i_(0) {} 2901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant X(int i) : i_(i) {} 3001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant X(int i, int j) : i_(i), j_(j) {} 3101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant 3201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant friend bool operator==(const X& x, const X& y) 3301afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant {return x.i_ == y.i_ && x.j_ == y.j_;} 3401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant}; 3501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant 3601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnantclass Y 3701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant{ 3801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnantpublic: 3901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant static bool dtor_called; 4001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant Y() = default; 4101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant ~Y() {dtor_called = true;} 4201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant}; 4301afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant 4401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnantbool Y::dtor_called = false; 4501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant 4601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnantclass Z 4701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant{ 4801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnantpublic: 4901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant static bool dtor_called; 5001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant Z() = default; 5101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant Z(int) {throw 6;} 5201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant ~Z() {dtor_called = true;} 5301afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant}; 5401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant 5501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnantbool Z::dtor_called = false; 5601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant 5701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant#endif // _LIBCPP_STD_VER > 11 5801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant 5901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnantint main() 6001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant{ 6101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant#if _LIBCPP_STD_VER > 11 6201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant { 630cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow optional<int> opt; 6401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant opt.emplace(); 6501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(static_cast<bool>(opt) == true); 6601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(*opt == 0); 6701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant } 6801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant { 690cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow optional<int> opt; 7001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant opt.emplace(1); 7101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(static_cast<bool>(opt) == true); 7201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(*opt == 1); 7301afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant } 7401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant { 750cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow optional<int> opt(2); 7601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant opt.emplace(); 7701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(static_cast<bool>(opt) == true); 7801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(*opt == 0); 7901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant } 8001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant { 810cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow optional<int> opt(2); 8201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant opt.emplace(1); 8301afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(static_cast<bool>(opt) == true); 8401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(*opt == 1); 8501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant } 8601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant { 870cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow optional<X> opt; 8801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant opt.emplace(); 8901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(static_cast<bool>(opt) == true); 9001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(*opt == X()); 9101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant } 9201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant { 930cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow optional<X> opt; 9401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant opt.emplace(1); 9501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(static_cast<bool>(opt) == true); 9601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(*opt == X(1)); 9701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant } 9801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant { 990cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow optional<X> opt; 10001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant opt.emplace(1, 2); 10101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(static_cast<bool>(opt) == true); 10201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(*opt == X(1, 2)); 10301afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant } 10401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant { 1050cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow optional<X> opt(X{3}); 10601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant opt.emplace(); 10701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(static_cast<bool>(opt) == true); 10801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(*opt == X()); 10901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant } 11001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant { 1110cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow optional<X> opt(X{3}); 11201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant opt.emplace(1); 11301afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(static_cast<bool>(opt) == true); 11401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(*opt == X(1)); 11501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant } 11601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant { 1170cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow optional<X> opt(X{3}); 11801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant opt.emplace(1, 2); 11901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(static_cast<bool>(opt) == true); 12001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(*opt == X(1, 2)); 12101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant } 12201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant { 12301afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant Y y; 12401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant { 1250cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow optional<Y> opt(y); 12601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(Y::dtor_called == false); 12701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant opt.emplace(); 12801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(Y::dtor_called == true); 12901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant } 13001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant } 13101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant { 13201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant Z z; 1330cdbe6048173c1f05628dbc85430acf191a3e173Marshall Clow optional<Z> opt(z); 13401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant try 13501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant { 13601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(static_cast<bool>(opt) == true); 13701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(Z::dtor_called == false); 13801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant opt.emplace(1); 13901afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant } 14001afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant catch (int i) 14101afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant { 14201afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(i == 6); 14301afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(static_cast<bool>(opt) == false); 14401afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant assert(Z::dtor_called == true); 14501afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant } 14601afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant } 14701afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant#endif // _LIBCPP_STD_VER > 11 14801afa5c6e407e985d9643707d7b7ab1384bd9317Howard Hinnant} 149