1a9e65961SEric Fiselier //===----------------------------------------------------------------------===//
2a9e65961SEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a9e65961SEric Fiselier //
7a9e65961SEric Fiselier //===----------------------------------------------------------------------===//
8a9e65961SEric Fiselier 
931cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
10*a42a58c9SLouis Dionne 
11a9e65961SEric Fiselier // <optional>
12a9e65961SEric Fiselier 
13a9e65961SEric Fiselier // optional<T>& operator=(const optional<T>& rhs);
14a9e65961SEric Fiselier 
15a9e65961SEric Fiselier #include <optional>
16a9e65961SEric Fiselier #include <string>
17a9e65961SEric Fiselier #include <type_traits>
18a9e65961SEric Fiselier 
197fc6a556SMarshall Clow #include "test_macros.h"
207fc6a556SMarshall Clow 
21a9e65961SEric Fiselier using std::optional;
22a9e65961SEric Fiselier 
23a9e65961SEric Fiselier struct X {};
24a9e65961SEric Fiselier 
25a9e65961SEric Fiselier struct Y
26a9e65961SEric Fiselier {
27a9e65961SEric Fiselier     Y() = default;
operator =Y28a9e65961SEric Fiselier     Y& operator=(const Y&) { return *this; }
29a9e65961SEric Fiselier };
30a9e65961SEric Fiselier 
31a9e65961SEric Fiselier struct Z1
32a9e65961SEric Fiselier {
33a9e65961SEric Fiselier     Z1() = default;
34a9e65961SEric Fiselier     Z1(Z1&&) = default;
35a9e65961SEric Fiselier     Z1(const Z1&) = default;
36a9e65961SEric Fiselier     Z1& operator=(Z1&&) = default;
37a9e65961SEric Fiselier     Z1& operator=(const Z1&) = delete;
38a9e65961SEric Fiselier };
39a9e65961SEric Fiselier 
40a9e65961SEric Fiselier struct Z2
41a9e65961SEric Fiselier {
42a9e65961SEric Fiselier     Z2() = default;
43a9e65961SEric Fiselier     Z2(Z2&&) = default;
44a9e65961SEric Fiselier     Z2(const Z2&) = delete;
45a9e65961SEric Fiselier     Z2& operator=(Z2&&) = default;
46a9e65961SEric Fiselier     Z2& operator=(const Z2&) = default;
47a9e65961SEric Fiselier };
48a9e65961SEric Fiselier 
49a9e65961SEric Fiselier template <class T>
50a9e65961SEric Fiselier constexpr bool
test()51a9e65961SEric Fiselier test()
52a9e65961SEric Fiselier {
53a9e65961SEric Fiselier     optional<T> opt;
54a9e65961SEric Fiselier     optional<T> opt2;
55a9e65961SEric Fiselier     opt = opt2;
56a9e65961SEric Fiselier     return true;
57a9e65961SEric Fiselier }
58a9e65961SEric Fiselier 
main(int,char **)592df59c50SJF Bastien int main(int, char**)
60a9e65961SEric Fiselier {
61a9e65961SEric Fiselier     {
62a9e65961SEric Fiselier         using T = int;
63a9e65961SEric Fiselier         static_assert((std::is_trivially_copy_assignable<optional<T>>::value), "");
64a9e65961SEric Fiselier         static_assert(test<T>(), "");
65a9e65961SEric Fiselier     }
66a9e65961SEric Fiselier     {
67a9e65961SEric Fiselier         using T = X;
68a9e65961SEric Fiselier         static_assert((std::is_trivially_copy_assignable<optional<T>>::value), "");
69a9e65961SEric Fiselier         static_assert(test<T>(), "");
70a9e65961SEric Fiselier     }
71a9e65961SEric Fiselier     static_assert(!(std::is_trivially_copy_assignable<optional<Y>>::value), "");
72a9e65961SEric Fiselier     static_assert(!(std::is_trivially_copy_assignable<optional<std::string>>::value), "");
73a9e65961SEric Fiselier 
74a9e65961SEric Fiselier     static_assert(!(std::is_copy_assignable<optional<Z1>>::value), "");
75a9e65961SEric Fiselier     static_assert(!(std::is_copy_assignable<optional<Z2>>::value), "");
762df59c50SJF Bastien 
772df59c50SJF Bastien   return 0;
78a9e65961SEric Fiselier }
79