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