180e66ac1SEric Fiselier //===----------------------------------------------------------------------===//
280e66ac1SEric 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
680e66ac1SEric Fiselier //
780e66ac1SEric Fiselier //===----------------------------------------------------------------------===//
880e66ac1SEric Fiselier
9*31cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
1080e66ac1SEric Fiselier
1180e66ac1SEric Fiselier // <variant>
1280e66ac1SEric Fiselier
1380e66ac1SEric Fiselier // template <size_t I, class T> struct variant_alternative; // undefined
1480e66ac1SEric Fiselier // template <size_t I, class T> struct variant_alternative<I, const T>;
1580e66ac1SEric Fiselier // template <size_t I, class T> struct variant_alternative<I, volatile T>;
1680e66ac1SEric Fiselier // template <size_t I, class T> struct variant_alternative<I, const volatile T>;
1780e66ac1SEric Fiselier // template <size_t I, class T>
1880e66ac1SEric Fiselier // using variant_alternative_t = typename variant_alternative<I, T>::type;
1980e66ac1SEric Fiselier //
2080e66ac1SEric Fiselier // template <size_t I, class... Types>
2180e66ac1SEric Fiselier // struct variant_alternative<I, variant<Types...>>;
2280e66ac1SEric Fiselier
2380e66ac1SEric Fiselier #include <memory>
2480e66ac1SEric Fiselier #include <type_traits>
2580e66ac1SEric Fiselier #include <variant>
2680e66ac1SEric Fiselier
2780e66ac1SEric Fiselier #include "test_macros.h"
28cc89063bSNico Weber #include "variant_test_helpers.h"
2980e66ac1SEric Fiselier
test()3080e66ac1SEric Fiselier template <class V, size_t I, class E> void test() {
3180e66ac1SEric Fiselier static_assert(
3280e66ac1SEric Fiselier std::is_same_v<typename std::variant_alternative<I, V>::type, E>, "");
3380e66ac1SEric Fiselier static_assert(
3480e66ac1SEric Fiselier std::is_same_v<typename std::variant_alternative<I, const V>::type,
3580e66ac1SEric Fiselier const E>,
3680e66ac1SEric Fiselier "");
3780e66ac1SEric Fiselier static_assert(
3880e66ac1SEric Fiselier std::is_same_v<typename std::variant_alternative<I, volatile V>::type,
3980e66ac1SEric Fiselier volatile E>,
4080e66ac1SEric Fiselier "");
4180e66ac1SEric Fiselier static_assert(
4280e66ac1SEric Fiselier std::is_same_v<
4380e66ac1SEric Fiselier typename std::variant_alternative<I, const volatile V>::type,
4480e66ac1SEric Fiselier const volatile E>,
4580e66ac1SEric Fiselier "");
4680e66ac1SEric Fiselier static_assert(std::is_same_v<std::variant_alternative_t<I, V>, E>, "");
4780e66ac1SEric Fiselier static_assert(std::is_same_v<std::variant_alternative_t<I, const V>, const E>,
4880e66ac1SEric Fiselier "");
4980e66ac1SEric Fiselier static_assert(
5080e66ac1SEric Fiselier std::is_same_v<std::variant_alternative_t<I, volatile V>, volatile E>,
5180e66ac1SEric Fiselier "");
5280e66ac1SEric Fiselier static_assert(std::is_same_v<std::variant_alternative_t<I, const volatile V>,
5380e66ac1SEric Fiselier const volatile E>,
5480e66ac1SEric Fiselier "");
5580e66ac1SEric Fiselier }
5680e66ac1SEric Fiselier
main(int,char **)572df59c50SJF Bastien int main(int, char**) {
5880e66ac1SEric Fiselier {
5980e66ac1SEric Fiselier using V = std::variant<int, void *, const void *, long double>;
6080e66ac1SEric Fiselier test<V, 0, int>();
6180e66ac1SEric Fiselier test<V, 1, void *>();
6280e66ac1SEric Fiselier test<V, 2, const void *>();
6380e66ac1SEric Fiselier test<V, 3, long double>();
6480e66ac1SEric Fiselier }
6580e66ac1SEric Fiselier #if !defined(TEST_VARIANT_HAS_NO_REFERENCES)
6680e66ac1SEric Fiselier {
670d3d8de0SEric Fiselier using V = std::variant<int, int &, const int &, int &&, long double>;
6880e66ac1SEric Fiselier test<V, 0, int>();
6980e66ac1SEric Fiselier test<V, 1, int &>();
700d3d8de0SEric Fiselier test<V, 2, const int &>();
7180e66ac1SEric Fiselier test<V, 3, int &&>();
7280e66ac1SEric Fiselier test<V, 4, long double>();
7380e66ac1SEric Fiselier }
7480e66ac1SEric Fiselier #endif
752df59c50SJF Bastien
762df59c50SJF Bastien return 0;
7780e66ac1SEric Fiselier }
78