/* Copyright Barrett Adair 2016-2017 Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE.md or copy at http ://boost.org/LICENSE_1_0.txt) */ #include #include #include #include #include "test.hpp" #ifdef BOOST_CLBL_TRTS_GCC_OLDER_THAN_4_9_2 //gcc < 4.9 doesn't like the invoke_case pattern used here int main(){} #else template struct tag { using type = T; }; template struct invoke_case { template void operator()(tag) const { // when available, test parity with std implementation (c++2a breaks our expectations but we still match std impl) #if defined(__cpp_lib_is_invocable) || __cplusplus >= 201707L CT_ASSERT((std::is_invocable() == boost::callable_traits::is_invocable())); #else CT_ASSERT((Expect == boost::callable_traits::is_invocable())); #endif } }; template void run_tests() { using ignored = int[]; ignored x {(InvokeCases{}(tag{}),0)..., 0}; (void)x; } struct foo {}; int main() { run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); // MSVC doesn't handle cv + ref qualifiers in expression sfinae correctly #ifndef BOOST_CLBL_TRTS_MSVC run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); #endif // #ifndef BOOST_CLBL_TRTS_MSVC run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); auto f = [](int){}; run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); auto g = [](){}; run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); // libc++ requires constructible types be passed to std::is_invocable #ifndef _LIBCPP_VERSION run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case >(); run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); #endif run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); run_tests ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case> ,invoke_case ,invoke_case ,invoke_case ,invoke_case ,invoke_case, int> >(); } #endif //#ifdef BOOST_CLBL_TRTS_GCC_OLDER_THAN_4_9_2