171e699dda5442545e3335f8c07de27c860fe2046Marshall Clow//===----------------------------------------------------------------------===// 271e699dda5442545e3335f8c07de27c860fe2046Marshall Clow// 371e699dda5442545e3335f8c07de27c860fe2046Marshall Clow// The LLVM Compiler Infrastructure 471e699dda5442545e3335f8c07de27c860fe2046Marshall Clow// 571e699dda5442545e3335f8c07de27c860fe2046Marshall Clow// This file is dual licensed under the MIT and the University of Illinois Open 671e699dda5442545e3335f8c07de27c860fe2046Marshall Clow// Source Licenses. See LICENSE.TXT for details. 771e699dda5442545e3335f8c07de27c860fe2046Marshall Clow// 871e699dda5442545e3335f8c07de27c860fe2046Marshall Clow//===----------------------------------------------------------------------===// 971e699dda5442545e3335f8c07de27c860fe2046Marshall Clow 1071e699dda5442545e3335f8c07de27c860fe2046Marshall Clow// [func.require] 1171e699dda5442545e3335f8c07de27c860fe2046Marshall Clow 1271e699dda5442545e3335f8c07de27c860fe2046Marshall Clow// INVOKE 1371e699dda5442545e3335f8c07de27c860fe2046Marshall Clow#if __cplusplus < 201103L 1471e699dda5442545e3335f8c07de27c860fe2046Marshall Clowint main () {} // no __invoke in C++03 1571e699dda5442545e3335f8c07de27c860fe2046Marshall Clow#else 1671e699dda5442545e3335f8c07de27c860fe2046Marshall Clow 1771e699dda5442545e3335f8c07de27c860fe2046Marshall Clow#include <type_traits> 1871e699dda5442545e3335f8c07de27c860fe2046Marshall Clow 1971e699dda5442545e3335f8c07de27c860fe2046Marshall Clowtemplate <typename T, int N> 2071e699dda5442545e3335f8c07de27c860fe2046Marshall Clowstruct Array 2171e699dda5442545e3335f8c07de27c860fe2046Marshall Clow{ 2271e699dda5442545e3335f8c07de27c860fe2046Marshall Clow typedef T type[N]; 2371e699dda5442545e3335f8c07de27c860fe2046Marshall Clow}; 2471e699dda5442545e3335f8c07de27c860fe2046Marshall Clow 2571e699dda5442545e3335f8c07de27c860fe2046Marshall Clowstruct Type 2671e699dda5442545e3335f8c07de27c860fe2046Marshall Clow{ 2771e699dda5442545e3335f8c07de27c860fe2046Marshall Clow Array<char, 1>::type& f1(); 2871e699dda5442545e3335f8c07de27c860fe2046Marshall Clow Array<char, 2>::type& f2() const; 2971e699dda5442545e3335f8c07de27c860fe2046Marshall Clow 3071e699dda5442545e3335f8c07de27c860fe2046Marshall Clow Array<char, 1>::type& g1() &; 3171e699dda5442545e3335f8c07de27c860fe2046Marshall Clow Array<char, 2>::type& g2() const &; 3271e699dda5442545e3335f8c07de27c860fe2046Marshall Clow#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3371e699dda5442545e3335f8c07de27c860fe2046Marshall Clow Array<char, 3>::type& g3() &&; 3471e699dda5442545e3335f8c07de27c860fe2046Marshall Clow Array<char, 4>::type& g4() const &&; 3571e699dda5442545e3335f8c07de27c860fe2046Marshall Clow#endif 3671e699dda5442545e3335f8c07de27c860fe2046Marshall Clow}; 3771e699dda5442545e3335f8c07de27c860fe2046Marshall Clow 3871e699dda5442545e3335f8c07de27c860fe2046Marshall Clowint main() 3971e699dda5442545e3335f8c07de27c860fe2046Marshall Clow{ 4071e699dda5442545e3335f8c07de27c860fe2046Marshall Clow static_assert(sizeof(std::__invoke(&Type::f1, std::declval<Type >())) == 1, ""); 4171e699dda5442545e3335f8c07de27c860fe2046Marshall Clow static_assert(sizeof(std::__invoke(&Type::f2, std::declval<Type const >())) == 2, ""); 4271e699dda5442545e3335f8c07de27c860fe2046Marshall Clow 4371e699dda5442545e3335f8c07de27c860fe2046Marshall Clow static_assert(sizeof(std::__invoke(&Type::g1, std::declval<Type &>())) == 1, ""); 4471e699dda5442545e3335f8c07de27c860fe2046Marshall Clow static_assert(sizeof(std::__invoke(&Type::g2, std::declval<Type const &>())) == 2, ""); 4571e699dda5442545e3335f8c07de27c860fe2046Marshall Clow#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 4671e699dda5442545e3335f8c07de27c860fe2046Marshall Clow static_assert(sizeof(std::__invoke(&Type::g3, std::declval<Type &&>())) == 3, ""); 4771e699dda5442545e3335f8c07de27c860fe2046Marshall Clow static_assert(sizeof(std::__invoke(&Type::g4, std::declval<Type const&&>())) == 4, ""); 4871e699dda5442545e3335f8c07de27c860fe2046Marshall Clow#endif 4971e699dda5442545e3335f8c07de27c860fe2046Marshall Clow} 5071e699dda5442545e3335f8c07de27c860fe2046Marshall Clow#endif 51