get_if_index.pass.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // -*- C++ -*-
  2. //===----------------------------------------------------------------------===//
  3. //
  4. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  5. // See https://llvm.org/LICENSE.txt for license information.
  6. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  7. //
  8. //===----------------------------------------------------------------------===//
  9. // UNSUPPORTED: c++98, c++03, c++11, c++14
  10. // <variant>
  11. // template <size_t I, class... Types>
  12. // constexpr add_pointer_t<variant_alternative_t<I, variant<Types...>>>
  13. // get_if(variant<Types...>* v) noexcept;
  14. // template <size_t I, class... Types>
  15. // constexpr add_pointer_t<const variant_alternative_t<I, variant<Types...>>>
  16. // get_if(const variant<Types...>* v) noexcept;
  17. #include "test_macros.h"
  18. #include "variant_test_helpers.h"
  19. #include <cassert>
  20. #include <memory>
  21. #include <variant>
  22. void test_const_get_if() {
  23. {
  24. using V = std::variant<int>;
  25. constexpr const V *v = nullptr;
  26. static_assert(std::get_if<0>(v) == nullptr, "");
  27. }
  28. {
  29. using V = std::variant<int, const long>;
  30. constexpr V v(42);
  31. ASSERT_NOEXCEPT(std::get_if<0>(&v));
  32. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), const int *);
  33. static_assert(*std::get_if<0>(&v) == 42, "");
  34. static_assert(std::get_if<1>(&v) == nullptr, "");
  35. }
  36. {
  37. using V = std::variant<int, const long>;
  38. constexpr V v(42l);
  39. ASSERT_SAME_TYPE(decltype(std::get_if<1>(&v)), const long *);
  40. static_assert(*std::get_if<1>(&v) == 42, "");
  41. static_assert(std::get_if<0>(&v) == nullptr, "");
  42. }
  43. // FIXME: Remove these once reference support is reinstated
  44. #if !defined(TEST_VARIANT_HAS_NO_REFERENCES)
  45. {
  46. using V = std::variant<int &>;
  47. int x = 42;
  48. const V v(x);
  49. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *);
  50. assert(std::get_if<0>(&v) == &x);
  51. }
  52. {
  53. using V = std::variant<int &&>;
  54. int x = 42;
  55. const V v(std::move(x));
  56. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *);
  57. assert(std::get_if<0>(&v) == &x);
  58. }
  59. {
  60. using V = std::variant<const int &&>;
  61. int x = 42;
  62. const V v(std::move(x));
  63. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), const int *);
  64. assert(std::get_if<0>(&v) == &x);
  65. }
  66. #endif
  67. }
  68. void test_get_if() {
  69. {
  70. using V = std::variant<int>;
  71. V *v = nullptr;
  72. assert(std::get_if<0>(v) == nullptr);
  73. }
  74. {
  75. using V = std::variant<int, long>;
  76. V v(42);
  77. ASSERT_NOEXCEPT(std::get_if<0>(&v));
  78. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *);
  79. assert(*std::get_if<0>(&v) == 42);
  80. assert(std::get_if<1>(&v) == nullptr);
  81. }
  82. {
  83. using V = std::variant<int, const long>;
  84. V v(42l);
  85. ASSERT_SAME_TYPE(decltype(std::get_if<1>(&v)), const long *);
  86. assert(*std::get_if<1>(&v) == 42);
  87. assert(std::get_if<0>(&v) == nullptr);
  88. }
  89. // FIXME: Remove these once reference support is reinstated
  90. #if !defined(TEST_VARIANT_HAS_NO_REFERENCES)
  91. {
  92. using V = std::variant<int &>;
  93. int x = 42;
  94. V v(x);
  95. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *);
  96. assert(std::get_if<0>(&v) == &x);
  97. }
  98. {
  99. using V = std::variant<const int &>;
  100. int x = 42;
  101. V v(x);
  102. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), const int *);
  103. assert(std::get_if<0>(&v) == &x);
  104. }
  105. {
  106. using V = std::variant<int &&>;
  107. int x = 42;
  108. V v(std::move(x));
  109. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), int *);
  110. assert(std::get_if<0>(&v) == &x);
  111. }
  112. {
  113. using V = std::variant<const int &&>;
  114. int x = 42;
  115. V v(std::move(x));
  116. ASSERT_SAME_TYPE(decltype(std::get_if<0>(&v)), const int *);
  117. assert(std::get_if<0>(&v) == &x);
  118. }
  119. #endif
  120. }
  121. int main(int, char**) {
  122. test_const_get_if();
  123. test_get_if();
  124. return 0;
  125. }