12c6217f2SLouis Dionne //===----------------------------------------------------------------------===//
22c6217f2SLouis Dionne //
32c6217f2SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42c6217f2SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
52c6217f2SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62c6217f2SLouis Dionne //
72c6217f2SLouis Dionne //===----------------------------------------------------------------------===//
82c6217f2SLouis Dionne //
92c6217f2SLouis Dionne // WARNING: This test was generated by generate_feature_test_macro_components.py
102c6217f2SLouis Dionne // and should not be edited manually.
112c6217f2SLouis Dionne //
122c6217f2SLouis Dionne // clang-format off
132c6217f2SLouis Dionne 
142c6217f2SLouis Dionne // <optional>
152c6217f2SLouis Dionne 
162c6217f2SLouis Dionne // Test the feature test macros defined by <optional>
172c6217f2SLouis Dionne 
182c6217f2SLouis Dionne /*  Constant                            Value
19b699a9baSLouis Dionne     __cpp_lib_constrained_equality      202403L [C++26]
20f49ccca8SMark de Wever     __cpp_lib_freestanding_optional     202311L [C++26]
212c6217f2SLouis Dionne     __cpp_lib_optional                  201606L [C++17]
22*cae351f3SA. Jiang                                         202106L [C++20]
2371400505SMark de Wever                                         202110L [C++23]
242dadf8d7SMark de Wever     __cpp_lib_optional_range_support    202406L [C++26]
252c6217f2SLouis Dionne */
262c6217f2SLouis Dionne 
272c6217f2SLouis Dionne #include <optional>
282c6217f2SLouis Dionne #include "test_macros.h"
292c6217f2SLouis Dionne 
302c6217f2SLouis Dionne #if TEST_STD_VER < 14
312c6217f2SLouis Dionne 
32b699a9baSLouis Dionne # ifdef __cpp_lib_constrained_equality
33b699a9baSLouis Dionne #   error "__cpp_lib_constrained_equality should not be defined before c++26"
34b699a9baSLouis Dionne # endif
35b699a9baSLouis Dionne 
36f49ccca8SMark de Wever # ifdef __cpp_lib_freestanding_optional
37f49ccca8SMark de Wever #   error "__cpp_lib_freestanding_optional should not be defined before c++26"
38f49ccca8SMark de Wever # endif
39f49ccca8SMark de Wever 
402c6217f2SLouis Dionne # ifdef __cpp_lib_optional
412c6217f2SLouis Dionne #   error "__cpp_lib_optional should not be defined before c++17"
422c6217f2SLouis Dionne # endif
432c6217f2SLouis Dionne 
442dadf8d7SMark de Wever # ifdef __cpp_lib_optional_range_support
452dadf8d7SMark de Wever #   error "__cpp_lib_optional_range_support should not be defined before c++26"
462dadf8d7SMark de Wever # endif
472dadf8d7SMark de Wever 
482c6217f2SLouis Dionne #elif TEST_STD_VER == 14
492c6217f2SLouis Dionne 
50b699a9baSLouis Dionne # ifdef __cpp_lib_constrained_equality
51b699a9baSLouis Dionne #   error "__cpp_lib_constrained_equality should not be defined before c++26"
52b699a9baSLouis Dionne # endif
53b699a9baSLouis Dionne 
54f49ccca8SMark de Wever # ifdef __cpp_lib_freestanding_optional
55f49ccca8SMark de Wever #   error "__cpp_lib_freestanding_optional should not be defined before c++26"
56f49ccca8SMark de Wever # endif
57f49ccca8SMark de Wever 
582c6217f2SLouis Dionne # ifdef __cpp_lib_optional
592c6217f2SLouis Dionne #   error "__cpp_lib_optional should not be defined before c++17"
602c6217f2SLouis Dionne # endif
612c6217f2SLouis Dionne 
622dadf8d7SMark de Wever # ifdef __cpp_lib_optional_range_support
632dadf8d7SMark de Wever #   error "__cpp_lib_optional_range_support should not be defined before c++26"
642dadf8d7SMark de Wever # endif
652dadf8d7SMark de Wever 
662c6217f2SLouis Dionne #elif TEST_STD_VER == 17
672c6217f2SLouis Dionne 
68b699a9baSLouis Dionne # ifdef __cpp_lib_constrained_equality
69b699a9baSLouis Dionne #   error "__cpp_lib_constrained_equality should not be defined before c++26"
70b699a9baSLouis Dionne # endif
71b699a9baSLouis Dionne 
72f49ccca8SMark de Wever # ifdef __cpp_lib_freestanding_optional
73f49ccca8SMark de Wever #   error "__cpp_lib_freestanding_optional should not be defined before c++26"
74f49ccca8SMark de Wever # endif
75f49ccca8SMark de Wever 
762c6217f2SLouis Dionne # ifndef __cpp_lib_optional
772c6217f2SLouis Dionne #   error "__cpp_lib_optional should be defined in c++17"
782c6217f2SLouis Dionne # endif
792c6217f2SLouis Dionne # if __cpp_lib_optional != 201606L
802c6217f2SLouis Dionne #   error "__cpp_lib_optional should have the value 201606L in c++17"
812c6217f2SLouis Dionne # endif
822c6217f2SLouis Dionne 
832dadf8d7SMark de Wever # ifdef __cpp_lib_optional_range_support
842dadf8d7SMark de Wever #   error "__cpp_lib_optional_range_support should not be defined before c++26"
852dadf8d7SMark de Wever # endif
862dadf8d7SMark de Wever 
872c6217f2SLouis Dionne #elif TEST_STD_VER == 20
882c6217f2SLouis Dionne 
89b699a9baSLouis Dionne # ifdef __cpp_lib_constrained_equality
90b699a9baSLouis Dionne #   error "__cpp_lib_constrained_equality should not be defined before c++26"
91b699a9baSLouis Dionne # endif
92b699a9baSLouis Dionne 
93f49ccca8SMark de Wever # ifdef __cpp_lib_freestanding_optional
94f49ccca8SMark de Wever #   error "__cpp_lib_freestanding_optional should not be defined before c++26"
95f49ccca8SMark de Wever # endif
96f49ccca8SMark de Wever 
972c6217f2SLouis Dionne # ifndef __cpp_lib_optional
982c6217f2SLouis Dionne #   error "__cpp_lib_optional should be defined in c++20"
992c6217f2SLouis Dionne # endif
100*cae351f3SA. Jiang # if __cpp_lib_optional != 202106L
101*cae351f3SA. Jiang #   error "__cpp_lib_optional should have the value 202106L in c++20"
1022c6217f2SLouis Dionne # endif
1032c6217f2SLouis Dionne 
1042dadf8d7SMark de Wever # ifdef __cpp_lib_optional_range_support
1052dadf8d7SMark de Wever #   error "__cpp_lib_optional_range_support should not be defined before c++26"
1062dadf8d7SMark de Wever # endif
1072dadf8d7SMark de Wever 
10800c97cbcSMark de Wever #elif TEST_STD_VER == 23
1092c6217f2SLouis Dionne 
110b699a9baSLouis Dionne # ifdef __cpp_lib_constrained_equality
111b699a9baSLouis Dionne #   error "__cpp_lib_constrained_equality should not be defined before c++26"
112b699a9baSLouis Dionne # endif
113b699a9baSLouis Dionne 
114f49ccca8SMark de Wever # ifdef __cpp_lib_freestanding_optional
115f49ccca8SMark de Wever #   error "__cpp_lib_freestanding_optional should not be defined before c++26"
116f49ccca8SMark de Wever # endif
117f49ccca8SMark de Wever 
1182c6217f2SLouis Dionne # ifndef __cpp_lib_optional
11971400505SMark de Wever #   error "__cpp_lib_optional should be defined in c++23"
1202c6217f2SLouis Dionne # endif
1219e5c2934SMark de Wever # if __cpp_lib_optional != 202110L
12271400505SMark de Wever #   error "__cpp_lib_optional should have the value 202110L in c++23"
1232c6217f2SLouis Dionne # endif
1242c6217f2SLouis Dionne 
1252dadf8d7SMark de Wever # ifdef __cpp_lib_optional_range_support
1262dadf8d7SMark de Wever #   error "__cpp_lib_optional_range_support should not be defined before c++26"
1272dadf8d7SMark de Wever # endif
1282dadf8d7SMark de Wever 
12900c97cbcSMark de Wever #elif TEST_STD_VER > 23
13000c97cbcSMark de Wever 
131f49ccca8SMark de Wever # if !defined(_LIBCPP_VERSION)
132b699a9baSLouis Dionne #   ifndef __cpp_lib_constrained_equality
133b699a9baSLouis Dionne #     error "__cpp_lib_constrained_equality should be defined in c++26"
134b699a9baSLouis Dionne #   endif
135b699a9baSLouis Dionne #   if __cpp_lib_constrained_equality != 202403L
136b699a9baSLouis Dionne #     error "__cpp_lib_constrained_equality should have the value 202403L in c++26"
137b699a9baSLouis Dionne #   endif
138b699a9baSLouis Dionne # else // _LIBCPP_VERSION
139b699a9baSLouis Dionne #   ifdef __cpp_lib_constrained_equality
140b699a9baSLouis Dionne #     error "__cpp_lib_constrained_equality should not be defined because it is unimplemented in libc++!"
141b699a9baSLouis Dionne #   endif
142b699a9baSLouis Dionne # endif
143b699a9baSLouis Dionne 
144b699a9baSLouis Dionne # if !defined(_LIBCPP_VERSION)
145f49ccca8SMark de Wever #   ifndef __cpp_lib_freestanding_optional
146f49ccca8SMark de Wever #     error "__cpp_lib_freestanding_optional should be defined in c++26"
147f49ccca8SMark de Wever #   endif
148f49ccca8SMark de Wever #   if __cpp_lib_freestanding_optional != 202311L
149f49ccca8SMark de Wever #     error "__cpp_lib_freestanding_optional should have the value 202311L in c++26"
150f49ccca8SMark de Wever #   endif
151f49ccca8SMark de Wever # else // _LIBCPP_VERSION
152f49ccca8SMark de Wever #   ifdef __cpp_lib_freestanding_optional
153f49ccca8SMark de Wever #     error "__cpp_lib_freestanding_optional should not be defined because it is unimplemented in libc++!"
154f49ccca8SMark de Wever #   endif
155f49ccca8SMark de Wever # endif
156f49ccca8SMark de Wever 
15700c97cbcSMark de Wever # ifndef __cpp_lib_optional
15800c97cbcSMark de Wever #   error "__cpp_lib_optional should be defined in c++26"
15900c97cbcSMark de Wever # endif
16000c97cbcSMark de Wever # if __cpp_lib_optional != 202110L
16100c97cbcSMark de Wever #   error "__cpp_lib_optional should have the value 202110L in c++26"
16200c97cbcSMark de Wever # endif
16300c97cbcSMark de Wever 
1642dadf8d7SMark de Wever # if !defined(_LIBCPP_VERSION)
1652dadf8d7SMark de Wever #   ifndef __cpp_lib_optional_range_support
1662dadf8d7SMark de Wever #     error "__cpp_lib_optional_range_support should be defined in c++26"
1672dadf8d7SMark de Wever #   endif
1682dadf8d7SMark de Wever #   if __cpp_lib_optional_range_support != 202406L
1692dadf8d7SMark de Wever #     error "__cpp_lib_optional_range_support should have the value 202406L in c++26"
1702dadf8d7SMark de Wever #   endif
1712dadf8d7SMark de Wever # else // _LIBCPP_VERSION
1722dadf8d7SMark de Wever #   ifdef __cpp_lib_optional_range_support
1732dadf8d7SMark de Wever #     error "__cpp_lib_optional_range_support should not be defined because it is unimplemented in libc++!"
1742dadf8d7SMark de Wever #   endif
1752dadf8d7SMark de Wever # endif
1762dadf8d7SMark de Wever 
17700c97cbcSMark de Wever #endif // TEST_STD_VER > 23
1782c6217f2SLouis Dionne 
179