1f35b4bc3SMarshall Clow //===----------------------------------------------------------------------===//
2f35b4bc3SMarshall Clow //
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
6f35b4bc3SMarshall Clow //
7f35b4bc3SMarshall Clow //===----------------------------------------------------------------------===//
8f35b4bc3SMarshall Clow 
9f35b4bc3SMarshall Clow // <optional>
1031cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
11f35b4bc3SMarshall Clow 
12f35b4bc3SMarshall Clow // template<class T>
13f35b4bc3SMarshall Clow //   optional(T) -> optional<T>;
14f35b4bc3SMarshall Clow 
15f35b4bc3SMarshall Clow #include <optional>
16f35b4bc3SMarshall Clow #include <cassert>
17f35b4bc3SMarshall Clow 
187fc6a556SMarshall Clow #include "test_macros.h"
197fc6a556SMarshall Clow 
20f35b4bc3SMarshall Clow struct A {};
21f35b4bc3SMarshall Clow 
main(int,char **)222df59c50SJF Bastien int main(int, char**)
23f35b4bc3SMarshall Clow {
24f35b4bc3SMarshall Clow //  Test the explicit deduction guides
25f35b4bc3SMarshall Clow     {
26f35b4bc3SMarshall Clow //  optional(T)
27f35b4bc3SMarshall Clow     std::optional opt(5);
28*f9f97caeSKonstantin Varlamov     ASSERT_SAME_TYPE(decltype(opt), std::optional<int>);
29f35b4bc3SMarshall Clow     assert(static_cast<bool>(opt));
30f35b4bc3SMarshall Clow     assert(*opt == 5);
31f35b4bc3SMarshall Clow     }
32f35b4bc3SMarshall Clow 
33f35b4bc3SMarshall Clow     {
34f35b4bc3SMarshall Clow //  optional(T)
35f35b4bc3SMarshall Clow     std::optional opt(A{});
36*f9f97caeSKonstantin Varlamov     ASSERT_SAME_TYPE(decltype(opt), std::optional<A>);
37f35b4bc3SMarshall Clow     assert(static_cast<bool>(opt));
38f35b4bc3SMarshall Clow     }
39f35b4bc3SMarshall Clow 
40*f9f97caeSKonstantin Varlamov     {
41*f9f97caeSKonstantin Varlamov //  optional(const T&);
42*f9f97caeSKonstantin Varlamov     const int& source = 5;
43*f9f97caeSKonstantin Varlamov     std::optional opt(source);
44*f9f97caeSKonstantin Varlamov     ASSERT_SAME_TYPE(decltype(opt), std::optional<int>);
45*f9f97caeSKonstantin Varlamov     assert(static_cast<bool>(opt));
46*f9f97caeSKonstantin Varlamov     assert(*opt == 5);
47*f9f97caeSKonstantin Varlamov     }
48*f9f97caeSKonstantin Varlamov 
49*f9f97caeSKonstantin Varlamov     {
50*f9f97caeSKonstantin Varlamov //  optional(T*);
51*f9f97caeSKonstantin Varlamov     const int* source = nullptr;
52*f9f97caeSKonstantin Varlamov     std::optional opt(source);
53*f9f97caeSKonstantin Varlamov     ASSERT_SAME_TYPE(decltype(opt), std::optional<const int*>);
54*f9f97caeSKonstantin Varlamov     assert(static_cast<bool>(opt));
55*f9f97caeSKonstantin Varlamov     assert(*opt == nullptr);
56*f9f97caeSKonstantin Varlamov     }
57*f9f97caeSKonstantin Varlamov 
58*f9f97caeSKonstantin Varlamov     {
59*f9f97caeSKonstantin Varlamov //  optional(T[]);
60*f9f97caeSKonstantin Varlamov     int source[] = {1, 2, 3};
61*f9f97caeSKonstantin Varlamov     std::optional opt(source);
62*f9f97caeSKonstantin Varlamov     ASSERT_SAME_TYPE(decltype(opt), std::optional<int*>);
63*f9f97caeSKonstantin Varlamov     assert(static_cast<bool>(opt));
64*f9f97caeSKonstantin Varlamov     assert((*opt)[0] == 1);
65*f9f97caeSKonstantin Varlamov     }
66*f9f97caeSKonstantin Varlamov 
67f35b4bc3SMarshall Clow //  Test the implicit deduction guides
6838549645SMarshall Clow     {
69c58f9b78SMarshall Clow //  optional(optional);
7038549645SMarshall Clow     std::optional<char> source('A');
7138549645SMarshall Clow     std::optional opt(source);
72*f9f97caeSKonstantin Varlamov     ASSERT_SAME_TYPE(decltype(opt), std::optional<char>);
7338549645SMarshall Clow     assert(static_cast<bool>(opt) == static_cast<bool>(source));
7438549645SMarshall Clow     assert(*opt == *source);
7538549645SMarshall Clow     }
762df59c50SJF Bastien 
772df59c50SJF Bastien   return 0;
78f35b4bc3SMarshall Clow }
79