aboutsummaryrefslogtreecommitdiff
path: root/clang/test/AST/ByteCode/libcxx/non-const-local-temporary.cpp
blob: 11d4b5383dbf54c504fc70bd3e264ada0443521f (plain)
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());