deduction.cc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // { dg-do compile { target c++17 } }
  2. #include <set>
  3. #include <testsuite_allocator.h>
  4. #include <testsuite_iterators.h>
  5. using __gnu_test::SimpleAllocator;
  6. using value_type = std::set<int>::value_type;
  7. static_assert(std::is_same_v<
  8. decltype(std::set{1, 2, 3}),
  9. std::set<int>>);
  10. static_assert(std::is_same_v<
  11. decltype(std::set{1, 2, 3}),
  12. std::set<int>>);
  13. static_assert(std::is_same_v<
  14. decltype(std::set{{1, 2, 3},
  15. std::less<int>{}, {}}),
  16. std::set<int>>);
  17. static_assert(std::is_same_v<
  18. decltype(std::set{{1, 2, 3},
  19. std::less<int>{}}),
  20. std::set<int>>);
  21. static_assert(std::is_same_v<
  22. decltype(std::set{{1, 2, 3},
  23. SimpleAllocator<int>{}}),
  24. std::set<int, std::less<int>,
  25. SimpleAllocator<int>>>);
  26. static_assert(std::is_same_v<
  27. decltype(std::set{{1, 2, 3},
  28. {}, SimpleAllocator<int>{}}),
  29. std::set<int, std::less<int>,
  30. SimpleAllocator<int>>>);
  31. void f()
  32. {
  33. std::set<int> x;
  34. static_assert(std::is_same_v<
  35. decltype(std::set(x.begin(), x.end())),
  36. std::set<int>>);
  37. static_assert(std::is_same_v<
  38. decltype(std::set{x.begin(), x.end(),
  39. std::less<int>{},
  40. std::allocator<int>{}}),
  41. std::set<int>>);
  42. static_assert(std::is_same_v<
  43. decltype(std::set{x.begin(), x.end(),
  44. std::less<int>{}, {}}),
  45. std::set<int>>);
  46. static_assert(std::is_same_v<
  47. decltype(std::set(x.begin(), x.end(),
  48. std::less<int>{})),
  49. std::set<int>>);
  50. static_assert(std::is_same_v<
  51. decltype(std::set{x.begin(), x.end(),
  52. {},
  53. std::allocator<int>{}}),
  54. std::set<int>>);
  55. static_assert(std::is_same_v<
  56. decltype(std::set{x.begin(), x.end(),
  57. SimpleAllocator<int>{}}),
  58. std::set<int, std::less<int>, SimpleAllocator<int>>>);
  59. static_assert(std::is_same_v<
  60. decltype(std::set{x.begin(), x.end(),
  61. {},
  62. SimpleAllocator<int>{}}),
  63. std::set<int, std::less<int>, SimpleAllocator<int>>>);
  64. }
  65. using __gnu_test::test_container;
  66. using __gnu_test::input_iterator_wrapper;
  67. void g()
  68. {
  69. value_type array[1];
  70. test_container<value_type, input_iterator_wrapper> x(array);
  71. static_assert(std::is_same_v<
  72. decltype(std::set(x.begin(), x.end())),
  73. std::set<int>>);
  74. static_assert(std::is_same_v<
  75. decltype(std::set{x.begin(), x.end(),
  76. std::less<int>{},
  77. std::allocator<value_type>{}}),
  78. std::set<int>>);
  79. static_assert(std::is_same_v<
  80. decltype(std::set{x.begin(), x.end(),
  81. std::less<int>{}, {}}),
  82. std::set<int>>);
  83. static_assert(std::is_same_v<
  84. decltype(std::set(x.begin(), x.end(),
  85. std::less<int>{})),
  86. std::set<int>>);
  87. static_assert(std::is_same_v<
  88. decltype(std::set{x.begin(), x.end(),
  89. std::allocator<value_type>{}}),
  90. std::set<int>>);
  91. static_assert(std::is_same_v<
  92. decltype(std::set{x.begin(), x.end(),
  93. SimpleAllocator<value_type>{}}),
  94. std::set<int, std::less<int>,
  95. SimpleAllocator<value_type>>>);
  96. static_assert(std::is_same_v<
  97. decltype(std::set{x.begin(), x.end(),
  98. {},
  99. std::allocator<value_type>{}}),
  100. std::set<int>>);
  101. static_assert(std::is_same_v<
  102. decltype(std::set{x.begin(), x.end(),
  103. {},
  104. SimpleAllocator<value_type>{}}),
  105. std::set<int, std::less<int>,
  106. SimpleAllocator<value_type>>>);
  107. }
  108. template<typename T, typename U> struct require_same;
  109. template<typename T> struct require_same<T, T> { using type = void; };
  110. template<typename T, typename U>
  111. typename require_same<T, U>::type
  112. check_type(U&) { }
  113. struct Pool;
  114. template<typename T>
  115. struct Alloc : __gnu_test::SimpleAllocator<T>
  116. {
  117. Alloc(Pool*) { }
  118. template<typename U>
  119. Alloc(const Alloc<U>&) { }
  120. };
  121. void
  122. test_p1518r2()
  123. {
  124. // P1518R2 - Stop overconstraining allocators in container deduction guides.
  125. // This is a C++23 feature but we support it for C++17 too.
  126. using Set = std::set<unsigned, std::greater<>, Alloc<unsigned>>;
  127. Pool* p = nullptr;
  128. Set s(p);
  129. std::set s1(s, p);
  130. check_type<Set>(s1);
  131. std::set s2(std::move(s), p);
  132. check_type<Set>(s2);
  133. }