get_if_index.pass.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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... Types>
  13. // constexpr add_pointer_t<variant_alternative_t<I, variant<Types...>>>
  14. // get_if(variant<Types...>* v) noexcept;
  15. // template <size_t I, class... Types>
  16. // constexpr add_pointer_t<const variant_alternative_t<I, variant<Types...>>>
  17. // get_if(const variant<Types...>* v) noexcept;
  18. #include "test_macros.h"
  19. #include "variant_test_helpers.hpp"
  20. #include <cassert>
  21. #include <memory>
  22. #include <variant>
  23. void test_const_get_if() {
  24. {
  25. using V = std::variant<int>;
  26. constexpr const V *v = nullptr;
  27. static_assert(std::get_if<0>(v) == nullptr, "");
  28. }
  29. {
  30. using V = std::variant<int, long>;
  31. constexpr V v(42);
  32. ASSERT_NOEXCEPT(std::get_if<0>(&v));
  33. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int const *);
  34. static_assert(*std::get_if<0>(&v) == 42, "");
  35. static_assert(std::get_if<1>(&v) == nullptr, "");
  36. }
  37. {
  38. using V = std::variant<int, long>;
  39. constexpr V v(42l);
  40. ASSERT_SAME_TYPE(decltype(std::get_if<1>(&v)), long const *);
  41. static_assert(*std::get_if<1>(&v) == 42, "");
  42. static_assert(std::get_if<0>(&v) == nullptr, "");
  43. }
  44. // FIXME: Remove these once reference support is reinstated
  45. #if !defined(TEST_VARIANT_HAS_NO_REFERENCES)
  46. {
  47. using V = std::variant<int &>;
  48. int x = 42;
  49. const V v(x);
  50. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *);
  51. assert(std::get_if<0>(&v) == &x);
  52. }
  53. {
  54. using V = std::variant<int &&>;
  55. int x = 42;
  56. const V v(std::move(x));
  57. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *);
  58. assert(std::get_if<0>(&v) == &x);
  59. }
  60. {
  61. using V = std::variant<const int &&>;
  62. int x = 42;
  63. const V v(std::move(x));
  64. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), const int *);
  65. assert(std::get_if<0>(&v) == &x);
  66. }
  67. #endif
  68. }
  69. void test_get_if() {
  70. {
  71. using V = std::variant<int>;
  72. V *v = nullptr;
  73. assert(std::get_if<0>(v) == nullptr);
  74. }
  75. {
  76. using V = std::variant<int, long>;
  77. V v(42);
  78. ASSERT_NOEXCEPT(std::get_if<0>(&v));
  79. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *);
  80. assert(*std::get_if<0>(&v) == 42);
  81. assert(std::get_if<1>(&v) == nullptr);
  82. }
  83. {
  84. using V = std::variant<int, long>;
  85. V v(42l);
  86. ASSERT_SAME_TYPE(decltype(std::get_if<1>(&v)), long *);
  87. assert(*std::get_if<1>(&v) == 42);
  88. assert(std::get_if<0>(&v) == nullptr);
  89. }
  90. // FIXME: Remove these once reference support is reinstated
  91. #if !defined(TEST_VARIANT_HAS_NO_REFERENCES)
  92. {
  93. using V = std::variant<int &>;
  94. int x = 42;
  95. V v(x);
  96. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *);
  97. assert(std::get_if<0>(&v) == &x);
  98. }
  99. {
  100. using V = std::variant<const int &>;
  101. int x = 42;
  102. V v(x);
  103. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), const int *);
  104. assert(std::get_if<0>(&v) == &x);
  105. }
  106. {
  107. using V = std::variant<int &&>;
  108. int x = 42;
  109. V v(std::move(x));
  110. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *);
  111. assert(std::get_if<0>(&v) == &x);
  112. }
  113. {
  114. using V = std::variant<const int &&>;
  115. int x = 42;
  116. V v(std::move(x));
  117. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), const int *);
  118. assert(std::get_if<0>(&v) == &x);
  119. }
  120. #endif
  121. }
  122. int main() {
  123. test_const_get_if();
  124. test_get_if();
  125. }