copy.pass.cpp revision 0cdbe6048173c1f05628dbc85430acf191a3e173
1cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber//===----------------------------------------------------------------------===// 2cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber// 3cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber// The LLVM Compiler Infrastructure 4cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber// 5cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber// This file is dual licensed under the MIT and the University of Illinois Open 6cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber// Source Licenses. See LICENSE.TXT for details. 7cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber// 8cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber//===----------------------------------------------------------------------===// 9cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 10cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber// <optional> 11cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 12cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber// optional(const optional<T>& rhs); 13cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 14cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#include <experimental/optional> 15cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#include <type_traits> 16cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#include <cassert> 17cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 18cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#if _LIBCPP_STD_VER > 11 19cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 20cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huberusing std::experimental::optional; 21cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 22cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Hubertemplate <class T> 23cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Hubervoid 24cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Hubertest(const optional<T>& rhs, bool is_going_to_throw = false) 25cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber{ 26cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber bool rhs_engaged = static_cast<bool>(rhs); 27cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber try 28cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber { 29cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber optional<T> lhs = rhs; 30cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber assert(is_going_to_throw == false); 31cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber assert(static_cast<bool>(lhs) == rhs_engaged); 32cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber if (rhs_engaged) 33cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber assert(*lhs == *rhs); 34cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 35cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber catch (int i) 36cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber { 3784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber assert(i == 6); 3884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber } 3984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber} 40cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 41cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huberclass X 42cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber{ 43cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber int i_; 44cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huberpublic: 45cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber X(int i) : i_(i) {} 46cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber X(const X& x) : i_(x.i_) {} 47cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber ~X() {i_ = 0;} 48cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;} 49cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber}; 50cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 51cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huberclass Y 52cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber{ 53cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber int i_; 54cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huberpublic: 55cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber Y(int i) : i_(i) {} 56cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber Y(const Y& x) : i_(x.i_) {} 57cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 58cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_;} 59cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber}; 60cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 61cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huberint count = 0; 62cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 63cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huberclass Z 64cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber{ 65cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber int i_; 66cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huberpublic: 67cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber Z(int i) : i_(i) {} 68cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber Z(const Z&) 69cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber { 70cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber if (++count == 2) 71cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber throw 6; 72cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 73cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 74cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_;} 75cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber}; 76cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 77cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 78cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#endif // _LIBCPP_STD_VER > 11 79cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 80cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huberint main() 81cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber{ 82cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#if _LIBCPP_STD_VER > 11 83cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber { 84cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber typedef int T; 85cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber optional<T> rhs; 86cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber test(rhs); 87cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 88cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber { 89cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber typedef int T; 90cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber optional<T> rhs(3); 91cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber test(rhs); 92cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 93cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber { 94cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber typedef X T; 95cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber optional<T> rhs; 96cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber test(rhs); 97cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 98cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber { 99cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber typedef X T; 100cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber optional<T> rhs(X(3)); 101cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber test(rhs); 102cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 103cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber { 104cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber typedef Y T; 105cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber optional<T> rhs; 106cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber test(rhs); 107cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 108cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber { 109cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber typedef Y T; 110cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber optional<T> rhs(Y(3)); 111cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber test(rhs); 112cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 113cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber { 114cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber typedef Z T; 115cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber optional<T> rhs; 116cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber test(rhs); 117cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber } 118cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber { 119cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber typedef Z T; 120cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber optional<T> rhs(Z(3)); 121cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber test(rhs, true); 122 } 123#endif // _LIBCPP_STD_VER > 11 124} 125