lwg3286.cc 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // Copyright (C) 2020-2022 Free Software Foundation, Inc.
  2. //
  3. // This file is part of the GNU ISO C++ Library. This library is free
  4. // software; you can redistribute it and/or modify it under the
  5. // terms of the GNU General Public License as published by the
  6. // Free Software Foundation; either version 3, or (at your option)
  7. // any later version.
  8. // This library is distributed in the hope that it will be useful,
  9. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. // GNU General Public License for more details.
  12. // You should have received a copy of the GNU General Public License along
  13. // with this library; see the file COPYING3. If not see
  14. // <http://www.gnu.org/licenses/>.
  15. // { dg-options "-std=gnu++2a" }
  16. // { dg-do run { target c++2a } }
  17. #include <ranges>
  18. #include <testsuite_iterators.h>
  19. #include <testsuite_hooks.h>
  20. using __gnu_test::test_input_range;
  21. namespace ranges = std::ranges;
  22. struct my_range
  23. {
  24. static inline int x[] = {1,2,3};
  25. static inline test_input_range<int> r{x};
  26. bool called_begin = false;
  27. auto
  28. begin()
  29. {
  30. called_begin = true;
  31. return r.begin();
  32. }
  33. auto
  34. end()
  35. {
  36. return r.end();
  37. }
  38. ranges::range_difference_t<decltype(r)>
  39. size()
  40. {
  41. VERIFY( !called_begin );
  42. return 3;
  43. }
  44. };
  45. void
  46. test01()
  47. {
  48. my_range r;
  49. static_assert(!ranges::forward_range<my_range>);
  50. static_assert(ranges::sized_range<my_range>);
  51. ranges::subrange sr = r;
  52. VERIFY( ranges::size(sr) == 3 );
  53. }
  54. int
  55. main()
  56. {
  57. test01();
  58. }