1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
// RUN: %clang_cc1 -std=c++2c -fexperimental-new-constant-interpreter -verify=expected,both %s
// RUN: %clang_cc1 -std=c++2c -verify=ref,both %s
// both-no-diagnostics
namespace std {
template <class, int __v> struct integral_constant {
static const int value = __v;
};
using size_t = decltype(sizeof(int));
template <class _Tp, class>
concept __weakly_equality_comparable_with = requires(_Tp __t) { __t; };
template <size_t, class> struct tuple_element;
template <class> struct tuple_size;
template <class _Ip>
concept input_or_output_iterator = requires(_Ip __i) { __i; };
template <class _Sp, class _Ip>
concept sentinel_for = __weakly_equality_comparable_with<_Sp, _Ip>;
namespace ranges {
enum subrange_kind { unsized };
template <input_or_output_iterator _Iter, sentinel_for<_Iter> _Sent,
subrange_kind = unsized>
struct subrange {
_Iter __begin_;
_Sent __end_;
constexpr _Sent end() { return __end_; }
};
template <int, class _Iter, class _Sent, subrange_kind _Kind>
constexpr auto get(subrange<_Iter, _Sent, _Kind> __subrange) {
return __subrange.end();
}
} // namespace ranges
template <class _Ip, class _Sp, ranges::subrange_kind _Kp>
struct tuple_size<ranges::subrange<_Ip, _Sp, _Kp>>
: integral_constant<size_t, 2> {};
template <class _Ip, class _Sp, ranges::subrange_kind _Kp>
struct tuple_element<0, ranges::subrange<_Ip, _Sp, _Kp>> {
using type = _Ip;
};
template <class _Ip, class _Sp, ranges::subrange_kind _Kp>
struct tuple_element<1, ranges::subrange<_Ip, _Sp, _Kp>> {
using type = _Sp;
};
} // namespace std
constexpr bool test() {
int a[1];
auto r = std::ranges::subrange(a, a);
auto [first, last] = r;
last = a;
return true;
}
static_assert(test());
|