add_member_rvalue_reference.cpp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /*
  2. Copyright Barrett Adair 2016-2017
  3. Distributed under the Boost Software License, Version 1.0.
  4. (See accompanying file LICENSE.md or copy at http ://boost.org/LICENSE_1_0.txt)
  5. */
  6. #include <type_traits>
  7. #include <functional>
  8. #include <tuple>
  9. #include <boost/callable_traits.hpp>
  10. #include "test.hpp"
  11. #ifdef BOOST_CLBL_TRTS_DISABLE_REFERENCE_QUALIFIERS
  12. int main(){ return 0; }
  13. #else
  14. struct foo{};
  15. int main() {
  16. {
  17. using f = void(foo::*)();
  18. using l = void(foo::*)() &;
  19. using r = void(foo::*)() &&;
  20. using c = void(foo::*)() const;
  21. using cl = void(foo::*)() const &;
  22. using cr = void(foo::*)() const &&;
  23. using v = void(foo::*)() volatile;
  24. using vl = void(foo::*)() volatile &;
  25. using vr = void(foo::*)() volatile &&;
  26. using cv = void(foo::*)() const volatile;
  27. using cvl = void(foo::*)() const volatile &;
  28. using cvr = void(foo::*)() const volatile &&;
  29. CT_ASSERT(std::is_same<r, TRAIT(add_member_rvalue_reference, f)>{});
  30. CT_ASSERT(std::is_same<cr, TRAIT(add_member_rvalue_reference, c)>{});
  31. CT_ASSERT(std::is_same<vr, TRAIT(add_member_rvalue_reference, v)>{});
  32. CT_ASSERT(std::is_same<cvr, TRAIT(add_member_rvalue_reference, cv)>{});
  33. CT_ASSERT(std::is_same<l, TRAIT(add_member_rvalue_reference, l)>{});
  34. CT_ASSERT(std::is_same<cl, TRAIT(add_member_rvalue_reference, cl)>{});
  35. CT_ASSERT(std::is_same<vl, TRAIT(add_member_rvalue_reference, vl)>{});
  36. CT_ASSERT(std::is_same<cvl, TRAIT(add_member_rvalue_reference, cvl)>{});
  37. CT_ASSERT(std::is_same<r, TRAIT(add_member_rvalue_reference, r)>{});
  38. CT_ASSERT(!std::is_same<r, TRAIT(add_member_rvalue_reference, l)>{});
  39. CT_ASSERT(std::is_same<cr, TRAIT(add_member_rvalue_reference, cr)>{});
  40. CT_ASSERT(std::is_same<vr, TRAIT(add_member_rvalue_reference, vr)>{});
  41. CT_ASSERT(std::is_same<cvr, TRAIT(add_member_rvalue_reference, cvr)>{});
  42. }
  43. {
  44. using f = void(foo::*)();
  45. using l = void(foo::*)() &;
  46. using r = void(foo::*)() &&;
  47. using c = void(foo::*)() const;
  48. using cl = void(foo::*)() const &;
  49. using cr = void(foo::*)() const &&;
  50. using v = void(foo::*)() volatile;
  51. using vl = void(foo::*)() volatile &;
  52. using vr = void(foo::*)() volatile &&;
  53. using cv = void(foo::*)() const volatile;
  54. using cvl = void(foo::*)() const volatile &;
  55. using cvr = void(foo::*)() const volatile &&;
  56. CT_ASSERT(std::is_same<r, TRAIT(add_member_rvalue_reference, f)>{});
  57. CT_ASSERT(std::is_same<cr, TRAIT(add_member_rvalue_reference, c)>{});
  58. CT_ASSERT(std::is_same<vr, TRAIT(add_member_rvalue_reference, v)>{});
  59. CT_ASSERT(std::is_same<cvr, TRAIT(add_member_rvalue_reference, cv)>{});
  60. CT_ASSERT(std::is_same<l, TRAIT(add_member_rvalue_reference, l)>{});
  61. CT_ASSERT(std::is_same<cl, TRAIT(add_member_rvalue_reference, cl)>{});
  62. CT_ASSERT(std::is_same<vl, TRAIT(add_member_rvalue_reference, vl)>{});
  63. CT_ASSERT(std::is_same<cvl, TRAIT(add_member_rvalue_reference, cvl)>{});
  64. CT_ASSERT(std::is_same<r, TRAIT(add_member_rvalue_reference, r)>{});
  65. CT_ASSERT(!std::is_same<r, TRAIT(add_member_rvalue_reference, l)>{});
  66. CT_ASSERT(std::is_same<cr, TRAIT(add_member_rvalue_reference, cr)>{});
  67. CT_ASSERT(std::is_same<vr, TRAIT(add_member_rvalue_reference, vr)>{});
  68. CT_ASSERT(std::is_same<cvr, TRAIT(add_member_rvalue_reference, cvr)>{});
  69. }
  70. {
  71. using f = void(foo::*)(...);
  72. using l = void(foo::*)(...) &;
  73. using r = void(foo::*)(...) &&;
  74. using c = void(foo::*)(...) const;
  75. using cl = void(foo::*)(...) const &;
  76. using cr = void(foo::*)(...) const &&;
  77. using v = void(foo::*)(...) volatile;
  78. using vl = void(foo::*)(...) volatile &;
  79. using vr = void(foo::*)(...) volatile &&;
  80. using cv = void(foo::*)(...) const volatile;
  81. using cvl = void(foo::*)(...) const volatile &;
  82. using cvr = void(foo::*)(...) const volatile &&;
  83. CT_ASSERT(std::is_same<r, TRAIT(add_member_rvalue_reference, f)>{});
  84. CT_ASSERT(std::is_same<cr, TRAIT(add_member_rvalue_reference, c)>{});
  85. CT_ASSERT(std::is_same<vr, TRAIT(add_member_rvalue_reference, v)>{});
  86. CT_ASSERT(std::is_same<cvr, TRAIT(add_member_rvalue_reference, cv)>{});
  87. CT_ASSERT(std::is_same<l, TRAIT(add_member_rvalue_reference, l)>{});
  88. CT_ASSERT(std::is_same<cl, TRAIT(add_member_rvalue_reference, cl)>{});
  89. CT_ASSERT(std::is_same<vl, TRAIT(add_member_rvalue_reference, vl)>{});
  90. CT_ASSERT(std::is_same<cvl, TRAIT(add_member_rvalue_reference, cvl)>{});
  91. CT_ASSERT(std::is_same<r, TRAIT(add_member_rvalue_reference, r)>{});
  92. CT_ASSERT(!std::is_same<r, TRAIT(add_member_rvalue_reference, l)>{});
  93. CT_ASSERT(std::is_same<cr, TRAIT(add_member_rvalue_reference, cr)>{});
  94. CT_ASSERT(std::is_same<vr, TRAIT(add_member_rvalue_reference, vr)>{});
  95. CT_ASSERT(std::is_same<cvr, TRAIT(add_member_rvalue_reference, cvr)>{});
  96. }
  97. {
  98. using f = void(foo::*)();
  99. using l = void(foo::*)() &;
  100. using r = void(foo::*)() &&;
  101. using c = void(foo::*)() const;
  102. using cl = void(foo::*)() const &;
  103. using cr = void(foo::*)() const &&;
  104. using v = void(foo::*)() volatile;
  105. using vl = void(foo::*)() volatile &;
  106. using vr = void(foo::*)() volatile &&;
  107. using cv = void(foo::*)() const volatile;
  108. using cvl = void(foo::*)() const volatile &;
  109. using cvr = void(foo::*)() const volatile &&;
  110. CT_ASSERT(std::is_same<r, TRAIT(add_member_rvalue_reference, f)>{});
  111. CT_ASSERT(std::is_same<cr, TRAIT(add_member_rvalue_reference, c)>{});
  112. CT_ASSERT(std::is_same<vr, TRAIT(add_member_rvalue_reference, v)>{});
  113. CT_ASSERT(std::is_same<cvr, TRAIT(add_member_rvalue_reference, cv)>{});
  114. CT_ASSERT(std::is_same<l, TRAIT(add_member_rvalue_reference, l)>{});
  115. CT_ASSERT(std::is_same<cl, TRAIT(add_member_rvalue_reference, cl)>{});
  116. CT_ASSERT(std::is_same<vl, TRAIT(add_member_rvalue_reference, vl)>{});
  117. CT_ASSERT(std::is_same<cvl, TRAIT(add_member_rvalue_reference, cvl)>{});
  118. CT_ASSERT(std::is_same<r, TRAIT(add_member_rvalue_reference, r)>{});
  119. CT_ASSERT(!std::is_same<r, TRAIT(add_member_rvalue_reference, l)>{});
  120. CT_ASSERT(std::is_same<cr, TRAIT(add_member_rvalue_reference, cr)>{});
  121. CT_ASSERT(std::is_same<vr, TRAIT(add_member_rvalue_reference, vr)>{});
  122. CT_ASSERT(std::is_same<cvr, TRAIT(add_member_rvalue_reference, cvr)>{});
  123. }
  124. {
  125. using f = void();
  126. using l = void() &;
  127. using r = void() &&;
  128. using c = void() const;
  129. using cl = void() const &;
  130. using cr = void() const &&;
  131. using v = void() volatile;
  132. using vl = void() volatile &;
  133. using vr = void() volatile &&;
  134. using cv = void() const volatile;
  135. using cvl = void() const volatile &;
  136. using cvr = void() const volatile &&;
  137. CT_ASSERT(std::is_same<r, TRAIT(add_member_rvalue_reference, f)>{});
  138. CT_ASSERT(std::is_same<cr, TRAIT(add_member_rvalue_reference, c)>{});
  139. CT_ASSERT(std::is_same<vr, TRAIT(add_member_rvalue_reference, v)>{});
  140. CT_ASSERT(std::is_same<cvr, TRAIT(add_member_rvalue_reference, cv)>{});
  141. CT_ASSERT(std::is_same<l, TRAIT(add_member_rvalue_reference, l)>{});
  142. CT_ASSERT(std::is_same<cl, TRAIT(add_member_rvalue_reference, cl)>{});
  143. CT_ASSERT(std::is_same<vl, TRAIT(add_member_rvalue_reference, vl)>{});
  144. CT_ASSERT(std::is_same<cvl, TRAIT(add_member_rvalue_reference, cvl)>{});
  145. CT_ASSERT(std::is_same<r, TRAIT(add_member_rvalue_reference, r)>{});
  146. CT_ASSERT(!std::is_same<r, TRAIT(add_member_rvalue_reference, l)>{});
  147. CT_ASSERT(std::is_same<cr, TRAIT(add_member_rvalue_reference, cr)>{});
  148. CT_ASSERT(std::is_same<vr, TRAIT(add_member_rvalue_reference, vr)>{});
  149. CT_ASSERT(std::is_same<cvr, TRAIT(add_member_rvalue_reference, cvr)>{});
  150. }
  151. }
  152. #endif //#ifdef BOOST_CLBL_TRTS_DISABLE_REFERENCE_QUALIFIERS