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