forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			149 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
//                     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 <experimental/optional>
 | 
						|
#include <type_traits>
 | 
						|
#include <cassert>
 | 
						|
#include <memory>
 | 
						|
 | 
						|
#if _LIBCPP_STD_VER > 11
 | 
						|
 | 
						|
using std::experimental::optional;
 | 
						|
 | 
						|
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
 | 
						|
    {
 | 
						|
        optional<int> opt;
 | 
						|
        opt.emplace();
 | 
						|
        assert(static_cast<bool>(opt) == true);
 | 
						|
        assert(*opt == 0);
 | 
						|
    }
 | 
						|
    {
 | 
						|
        optional<int> opt;
 | 
						|
        opt.emplace(1);
 | 
						|
        assert(static_cast<bool>(opt) == true);
 | 
						|
        assert(*opt == 1);
 | 
						|
    }
 | 
						|
    {
 | 
						|
        optional<int> opt(2);
 | 
						|
        opt.emplace();
 | 
						|
        assert(static_cast<bool>(opt) == true);
 | 
						|
        assert(*opt == 0);
 | 
						|
    }
 | 
						|
    {
 | 
						|
        optional<int> opt(2);
 | 
						|
        opt.emplace(1);
 | 
						|
        assert(static_cast<bool>(opt) == true);
 | 
						|
        assert(*opt == 1);
 | 
						|
    }
 | 
						|
    {
 | 
						|
        optional<X> opt;
 | 
						|
        opt.emplace();
 | 
						|
        assert(static_cast<bool>(opt) == true);
 | 
						|
        assert(*opt == X());
 | 
						|
    }
 | 
						|
    {
 | 
						|
        optional<X> opt;
 | 
						|
        opt.emplace(1);
 | 
						|
        assert(static_cast<bool>(opt) == true);
 | 
						|
        assert(*opt == X(1));
 | 
						|
    }
 | 
						|
    {
 | 
						|
        optional<X> opt;
 | 
						|
        opt.emplace(1, 2);
 | 
						|
        assert(static_cast<bool>(opt) == true);
 | 
						|
        assert(*opt == X(1, 2));
 | 
						|
    }
 | 
						|
    {
 | 
						|
        optional<X> opt(X{3});
 | 
						|
        opt.emplace();
 | 
						|
        assert(static_cast<bool>(opt) == true);
 | 
						|
        assert(*opt == X());
 | 
						|
    }
 | 
						|
    {
 | 
						|
        optional<X> opt(X{3});
 | 
						|
        opt.emplace(1);
 | 
						|
        assert(static_cast<bool>(opt) == true);
 | 
						|
        assert(*opt == X(1));
 | 
						|
    }
 | 
						|
    {
 | 
						|
        optional<X> opt(X{3});
 | 
						|
        opt.emplace(1, 2);
 | 
						|
        assert(static_cast<bool>(opt) == true);
 | 
						|
        assert(*opt == X(1, 2));
 | 
						|
    }
 | 
						|
    {
 | 
						|
        Y y;
 | 
						|
        {
 | 
						|
            optional<Y> opt(y);
 | 
						|
            assert(Y::dtor_called == false);
 | 
						|
            opt.emplace();
 | 
						|
            assert(Y::dtor_called == true);
 | 
						|
        }
 | 
						|
    }
 | 
						|
    {
 | 
						|
        Z z;
 | 
						|
        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
 | 
						|
}
 |