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<class T> struct tuple_size; 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 <typename C> 20*2ea5d167SHristo Hristov concept HasTupleSize = requires { std::tuple_size<C>{}; }; 21*2ea5d167SHristo Hristov 22*2ea5d167SHristo Hristov struct SomeObject {}; 23*2ea5d167SHristo Hristov 24*2ea5d167SHristo Hristov static_assert(!HasTupleSize<SomeObject>); 25*2ea5d167SHristo Hristov 26*2ea5d167SHristo Hristov template <typename T> test()27*2ea5d167SHristo Hristovvoid test() { 28*2ea5d167SHristo Hristov using C = std::complex<T>; 29*2ea5d167SHristo Hristov 30*2ea5d167SHristo Hristov static_assert(HasTupleSize<C>); 31*2ea5d167SHristo Hristov static_assert(std::same_as<typename std::tuple_size<C>::value_type, size_t>); 32*2ea5d167SHristo Hristov static_assert(std::tuple_size<C>() == 2); 33*2ea5d167SHristo Hristov } 34*2ea5d167SHristo Hristov test()35*2ea5d167SHristo Hristovvoid test() { 36*2ea5d167SHristo Hristov test<float>(); 37*2ea5d167SHristo Hristov test<double>(); 38*2ea5d167SHristo Hristov test<long double>(); 39*2ea5d167SHristo Hristov } 40