variant_alternative.pass.cpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // -*- C++ -*-
  2. //===----------------------------------------------------------------------===//
  3. //
  4. // The LLVM Compiler Infrastructure
  5. //
  6. // This file is dual licensed under the MIT and the University of Illinois Open
  7. // Source Licenses. See LICENSE.TXT for details.
  8. //
  9. //===----------------------------------------------------------------------===//
  10. // UNSUPPORTED: c++98, c++03, c++11, c++14
  11. // <variant>
  12. // template <size_t I, class T> struct variant_alternative; // undefined
  13. // template <size_t I, class T> struct variant_alternative<I, const T>;
  14. // template <size_t I, class T> struct variant_alternative<I, volatile T>;
  15. // template <size_t I, class T> struct variant_alternative<I, const volatile T>;
  16. // template <size_t I, class T>
  17. // using variant_alternative_t = typename variant_alternative<I, T>::type;
  18. //
  19. // template <size_t I, class... Types>
  20. // struct variant_alternative<I, variant<Types...>>;
  21. #include <memory>
  22. #include <type_traits>
  23. #include <variant>
  24. #include "test_macros.h"
  25. #include "variant_test_helpers.hpp"
  26. template <class V, size_t I, class E> void test() {
  27. static_assert(
  28. std::is_same_v<typename std::variant_alternative<I, V>::type, E>, "");
  29. static_assert(
  30. std::is_same_v<typename std::variant_alternative<I, const V>::type,
  31. const E>,
  32. "");
  33. static_assert(
  34. std::is_same_v<typename std::variant_alternative<I, volatile V>::type,
  35. volatile E>,
  36. "");
  37. static_assert(
  38. std::is_same_v<
  39. typename std::variant_alternative<I, const volatile V>::type,
  40. const volatile E>,
  41. "");
  42. static_assert(std::is_same_v<std::variant_alternative_t<I, V>, E>, "");
  43. static_assert(std::is_same_v<std::variant_alternative_t<I, const V>, const E>,
  44. "");
  45. static_assert(
  46. std::is_same_v<std::variant_alternative_t<I, volatile V>, volatile E>,
  47. "");
  48. static_assert(std::is_same_v<std::variant_alternative_t<I, const volatile V>,
  49. const volatile E>,
  50. "");
  51. }
  52. int main() {
  53. {
  54. using V = std::variant<int, void *, const void *, long double>;
  55. test<V, 0, int>();
  56. test<V, 1, void *>();
  57. test<V, 2, const void *>();
  58. test<V, 3, long double>();
  59. }
  60. #if !defined(TEST_VARIANT_HAS_NO_REFERENCES)
  61. {
  62. using V = std::variant<int, int &, int const &, int &&, long double>;
  63. test<V, 0, int>();
  64. test<V, 1, int &>();
  65. test<V, 2, int const &>();
  66. test<V, 3, int &&>();
  67. test<V, 4, long double>();
  68. }
  69. #endif
  70. }