1*2ea5d167SHristo Hristov //===----------------------------------------------------------------------===//
2*2ea5d167SHristo Hristov //
3*2ea5d167SHristo Hristov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2ea5d167SHristo Hristov // See https://llvm.org/LICENSE.txt for license information.
5*2ea5d167SHristo Hristov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*2ea5d167SHristo Hristov //
7*2ea5d167SHristo Hristov //===----------------------------------------------------------------------===//
8*2ea5d167SHristo Hristov
9*2ea5d167SHristo Hristov // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23
10*2ea5d167SHristo Hristov
11*2ea5d167SHristo Hristov // <complex>
12*2ea5d167SHristo Hristov
13*2ea5d167SHristo Hristov // template<size_t I, class T> struct tuple_element;
14*2ea5d167SHristo Hristov
15*2ea5d167SHristo Hristov #include <cassert>
16*2ea5d167SHristo Hristov #include <complex>
17*2ea5d167SHristo Hristov #include <concepts>
18*2ea5d167SHristo Hristov
19*2ea5d167SHristo Hristov template <size_t I, typename C>
20*2ea5d167SHristo Hristov concept HasTupleElement = requires { std::tuple_element<I, C>{}; };
21*2ea5d167SHristo Hristov
22*2ea5d167SHristo Hristov struct SomeObject {};
23*2ea5d167SHristo Hristov
24*2ea5d167SHristo Hristov static_assert(!HasTupleElement<0, SomeObject>);
25*2ea5d167SHristo Hristov static_assert(!HasTupleElement<1, SomeObject>);
26*2ea5d167SHristo Hristov static_assert(!HasTupleElement<3, SomeObject>);
27*2ea5d167SHristo Hristov
28*2ea5d167SHristo Hristov template <typename T>
test()29*2ea5d167SHristo Hristov void test() {
30*2ea5d167SHristo Hristov using C = std::complex<T>;
31*2ea5d167SHristo Hristov
32*2ea5d167SHristo Hristov static_assert(HasTupleElement<0, C>);
33*2ea5d167SHristo Hristov static_assert(HasTupleElement<1, C>);
34*2ea5d167SHristo Hristov
35*2ea5d167SHristo Hristov static_assert(std::same_as<typename std::tuple_element<0, C>::type, T>);
36*2ea5d167SHristo Hristov static_assert(std::same_as<typename std::tuple_element<1, C>::type, T>);
37*2ea5d167SHristo Hristov }
38*2ea5d167SHristo Hristov
test()39*2ea5d167SHristo Hristov void test() {
40*2ea5d167SHristo Hristov test<float>();
41*2ea5d167SHristo Hristov test<double>();
42*2ea5d167SHristo Hristov test<long double>();
43*2ea5d167SHristo Hristov }
44