//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++98, c++03, c++11, c++14
// <optional>

// optional<T>& operator=(const optional<T>& rhs);

#include <optional>
#include <string>
#include <type_traits>

using std::optional;

struct X {};

struct Y
{
    Y() = default;
    Y& operator=(const Y&) { return *this; }
};

struct Z1
{
    Z1() = default;
    Z1(Z1&&) = default;
    Z1(const Z1&) = default;
    Z1& operator=(Z1&&) = default;
    Z1& operator=(const Z1&) = delete;
};

struct Z2
{
    Z2() = default;
    Z2(Z2&&) = default;
    Z2(const Z2&) = delete;
    Z2& operator=(Z2&&) = default;
    Z2& operator=(const Z2&) = default;
};

template <class T>
constexpr bool
test()
{
    optional<T> opt;
    optional<T> opt2;
    opt = opt2;
    return true;
}

int main(int, char**)
{
    {
        using T = int;
        static_assert((std::is_trivially_copy_assignable<optional<T>>::value), "");
        static_assert(test<T>(), "");
    }
    {
        using T = X;
        static_assert((std::is_trivially_copy_assignable<optional<T>>::value), "");
        static_assert(test<T>(), "");
    }
    static_assert(!(std::is_trivially_copy_assignable<optional<Y>>::value), "");
    static_assert(!(std::is_trivially_copy_assignable<optional<std::string>>::value), "");

    static_assert(!(std::is_copy_assignable<optional<Z1>>::value), "");
    static_assert(!(std::is_copy_assignable<optional<Z2>>::value), "");

  return 0;
}
