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