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