//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // [func.require] // INVOKE #if __cplusplus < 201103L int main () {} // no __invoke in C++03 #else #include template struct Array { typedef T type[N]; }; struct Type { Array::type& f1(); Array::type& f2() const; Array::type& g1() &; Array::type& g2() const &; #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES Array::type& g3() &&; Array::type& g4() const &&; #endif }; int main() { static_assert(sizeof(std::__invoke(&Type::f1, std::declval())) == 1, ""); static_assert(sizeof(std::__invoke(&Type::f2, std::declval())) == 2, ""); static_assert(sizeof(std::__invoke(&Type::g1, std::declval())) == 1, ""); static_assert(sizeof(std::__invoke(&Type::g2, std::declval())) == 2, ""); #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES static_assert(sizeof(std::__invoke(&Type::g3, std::declval())) == 3, ""); static_assert(sizeof(std::__invoke(&Type::g4, std::declval())) == 4, ""); #endif } #endif