376 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <functional>10 11// result_of<Fn(ArgTypes...)>12 13// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX20_REMOVED_TYPE_TRAITS14// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS15 16#include <type_traits>17#include <cassert>18#include <functional>19#include <memory>20#include "test_macros.h"21 22struct S23{24 typedef short (*FreeFunc)(long);25 operator FreeFunc() const;26 double operator()(char, int&);27 double const& operator()(char, int&) const;28 double volatile& operator()(char, int&) volatile;29 double const volatile& operator()(char, int&) const volatile;30};31 32 33struct SD : public S { };34 35struct NotDerived {};36 37template <class Tp>38struct Voider {39 typedef void type;40};41 42template <class T, class = void>43struct HasType : std::false_type {};44 45template <class T>46struct HasType<T, typename Voider<typename T::type>::type> : std::true_type {};47 48#if TEST_STD_VER > 1449template <typename T, typename U>50struct test_invoke_result;51 52template <typename Fn, typename ...Args, typename Ret>53struct test_invoke_result<Fn(Args...), Ret>54{55 static void call()56 {57 static_assert(std::is_invocable<Fn, Args...>::value, "");58 static_assert(std::is_invocable_r<Ret, Fn, Args...>::value, "");59 ASSERT_SAME_TYPE(Ret, typename std::invoke_result<Fn, Args...>::type);60 }61};62#endif63 64template <class T, class U>65void test_result_of()66{67 ASSERT_SAME_TYPE(U, typename std::result_of<T>::type);68#if TEST_STD_VER > 1469 test_invoke_result<T, U>::call();70#endif71}72 73#if TEST_STD_VER > 1474template <typename T>75struct test_invoke_no_result;76 77template <typename Fn, typename ...Args>78struct test_invoke_no_result<Fn(Args...)>79{80 static void call()81 {82 static_assert(std::is_invocable<Fn, Args...>::value == false, "");83 static_assert((!HasType<std::invoke_result<Fn, Args...> >::value), "");84 }85};86#endif87 88template <class T>89void test_no_result()90{91#if TEST_STD_VER >= 1192 static_assert((!HasType<std::result_of<T> >::value), "");93#endif94#if TEST_STD_VER > 1495 test_invoke_no_result<T>::call();96#endif97}98 99int main(int, char**)100{101 typedef NotDerived ND;102 { // functor object103 test_result_of<S(int), short> ();104 test_result_of<S&(unsigned char, int&), double> ();105 test_result_of<S const&(unsigned char, int&), double const &> ();106 test_result_of<S volatile&(unsigned char, int&), double volatile&> ();107 test_result_of<S const volatile&(unsigned char, int&), double const volatile&> ();108 }109 { // pointer to function110 typedef bool (&RF0)();111 typedef bool* (&RF1)(int);112 typedef bool& (&RF2)(int, int);113 typedef bool const& (&RF3)(int, int, int);114 typedef bool (&RF4)(int, ...);115 typedef bool (*PF0)();116 typedef bool* (*PF1)(int);117 typedef bool& (*PF2)(int, int);118 typedef bool const& (*PF3)(int, int, int);119 typedef bool (*PF4)(int, ...);120 typedef bool (*&PRF0)();121 typedef bool* (*&PRF1)(int);122 typedef bool& (*&PRF2)(int, int);123 typedef bool const& (*&PRF3)(int, int, int);124 typedef bool (*&PRF4)(int, ...);125 test_result_of<RF0(), bool>();126 test_result_of<RF1(int), bool*>();127 test_result_of<RF2(int, long), bool&>();128 test_result_of<RF3(int, long, int), bool const&>();129 test_result_of<RF4(int, float, void*), bool>();130 test_result_of<PF0(), bool>();131 test_result_of<PF1(int), bool*>();132 test_result_of<PF2(int, long), bool&>();133 test_result_of<PF3(int, long, int), bool const&>();134 test_result_of<PF4(int, float, void*), bool>();135 test_result_of<PRF0(), bool>();136 test_result_of<PRF1(int), bool*>();137 test_result_of<PRF2(int, long), bool&>();138 test_result_of<PRF3(int, long, int), bool const&>();139 test_result_of<PRF4(int, float, void*), bool>();140 }141 { // pointer to member function142 143 typedef int (S::*PMS0)();144 typedef int* (S::*PMS1)(long);145 typedef int& (S::*PMS2)(long, int);146 typedef const int& (S::*PMS3)(int, ...);147 test_result_of<PMS0( S), int> ();148 test_result_of<PMS0( S&), int> ();149 test_result_of<PMS0( S*), int> ();150 test_result_of<PMS0( S*&), int> ();151 test_result_of<PMS0( std::reference_wrapper<S>), int> ();152 test_result_of<PMS0(const std::reference_wrapper<S>&), int> ();153 test_result_of<PMS0( std::reference_wrapper<SD>), int> ();154 test_result_of<PMS0(const std::reference_wrapper<SD>&), int> ();155 test_result_of<PMS0(std::unique_ptr<S>), int> ();156 test_result_of<PMS0(std::unique_ptr<SD>), int> ();157 test_no_result<PMS0(const S&)>();158 test_no_result<PMS0(volatile S&)>();159 test_no_result<PMS0(const volatile S&)>();160 test_no_result<PMS0(ND & )>();161 test_no_result<PMS0(const ND& )>();162 test_no_result<PMS0(std::unique_ptr<S const> )>();163 test_no_result<PMS0(std::reference_wrapper<S const>)>();164 test_no_result<PMS0(std::reference_wrapper<ND> )>();165 test_no_result<PMS0(std::unique_ptr<ND> )>();166 167 test_result_of<PMS1( S, int), int*> ();168 test_result_of<PMS1( S&, int), int*> ();169 test_result_of<PMS1( S*, int), int*> ();170 test_result_of<PMS1( S*&, int), int*> ();171 test_result_of<PMS1(std::unique_ptr<S>, int), int*> ();172 test_result_of<PMS1(std::unique_ptr<SD>, int), int*> ();173 test_result_of<PMS1(std::reference_wrapper<S>, int), int*> ();174 test_result_of<PMS1(const std::reference_wrapper<S>&, int), int*> ();175 test_result_of<PMS1(std::reference_wrapper<SD>, int), int*> ();176 test_result_of<PMS1(const std::reference_wrapper<SD>&, int), int*> ();177 test_no_result<PMS1(const S&, int)>();178 test_no_result<PMS1(volatile S&, int)>();179 test_no_result<PMS1(const volatile S&, int)>();180 test_no_result<PMS1(ND &, int)>();181 test_no_result<PMS1(const ND&, int)>();182 test_no_result<PMS1(std::unique_ptr<S const>, int)>();183 test_no_result<PMS1(std::reference_wrapper<S const>, int)>();184 test_no_result<PMS1(std::reference_wrapper<ND>, int)>();185 test_no_result<PMS1(std::unique_ptr<ND>, int)>();186 187 test_result_of<PMS2( S, int, int), int&> ();188 test_result_of<PMS2( S&, int, int), int&> ();189 test_result_of<PMS2( S*, int, int), int&> ();190 test_result_of<PMS2( S*&, int, int), int&> ();191 test_result_of<PMS2(std::unique_ptr<S>, int, int), int&> ();192 test_result_of<PMS2(std::unique_ptr<SD>, int, int), int&> ();193 test_result_of<PMS2(std::reference_wrapper<S>, int, int), int&> ();194 test_result_of<PMS2(const std::reference_wrapper<S>&, int, int), int&> ();195 test_result_of<PMS2(std::reference_wrapper<SD>, int, int), int&> ();196 test_result_of<PMS2(const std::reference_wrapper<SD>&, int, int), int&> ();197 test_no_result<PMS2(const S&, int, int)>();198 test_no_result<PMS2(volatile S&, int, int)>();199 test_no_result<PMS2(const volatile S&, int, int)>();200 test_no_result<PMS2(std::unique_ptr<S const>, int, int)>();201 test_no_result<PMS2(std::reference_wrapper<S const>, int, int)>();202 test_no_result<PMS2(const ND&, int, int)>();203 test_no_result<PMS2(std::reference_wrapper<ND>, int, int)>();204 test_no_result<PMS2(std::unique_ptr<ND>, int, int)>();205 206 test_result_of<PMS3(S&, int), const int &>();207 test_result_of<PMS3(S&, int, long), const int &>();208 209 typedef int (S::*PMS0C)() const;210 typedef int* (S::*PMS1C)(long) const;211 typedef int& (S::*PMS2C)(long, int) const;212 typedef const int& (S::*PMS3C)(int, ...) const;213 test_result_of<PMS0C( S), int> ();214 test_result_of<PMS0C( S&), int> ();215 test_result_of<PMS0C(const S&), int> ();216 test_result_of<PMS0C( S*), int> ();217 test_result_of<PMS0C(const S*), int> ();218 test_result_of<PMS0C( S*&), int> ();219 test_result_of<PMS0C(const S*&), int> ();220 test_result_of<PMS0C(std::unique_ptr<S>), int> ();221 test_result_of<PMS0C(std::unique_ptr<SD>), int> ();222 test_result_of<PMS0C(std::reference_wrapper<S> ), int> ();223 test_result_of<PMS0C(std::reference_wrapper<const S> ), int> ();224 test_result_of<PMS0C(const std::reference_wrapper<S> & ), int> ();225 test_result_of<PMS0C(const std::reference_wrapper<const S> &), int> ();226 test_result_of<PMS0C(std::reference_wrapper<SD> ), int> ();227 test_result_of<PMS0C(std::reference_wrapper<const SD> ), int> ();228 test_result_of<PMS0C(const std::reference_wrapper<SD> & ), int> ();229 test_result_of<PMS0C(const std::reference_wrapper<const SD> &), int> ();230 test_no_result<PMS0C(volatile S&)>();231 test_no_result<PMS0C(const volatile S&)>();232 233 test_result_of<PMS1C( S, int), int*> ();234 test_result_of<PMS1C( S&, int), int*> ();235 test_result_of<PMS1C(const S&, int), int*> ();236 test_result_of<PMS1C( S*, int), int*> ();237 test_result_of<PMS1C(const S*, int), int*> ();238 test_result_of<PMS1C( S*&, int), int*> ();239 test_result_of<PMS1C(const S*&, int), int*> ();240 test_result_of<PMS1C(std::unique_ptr<S>, int), int*> ();241 test_no_result<PMS1C(volatile S&, int)>();242 test_no_result<PMS1C(const volatile S&, int)>();243 244 test_result_of<PMS2C( S, int, int), int&> ();245 test_result_of<PMS2C( S&, int, int), int&> ();246 test_result_of<PMS2C(const S&, int, int), int&> ();247 test_result_of<PMS2C( S*, int, int), int&> ();248 test_result_of<PMS2C(const S*, int, int), int&> ();249 test_result_of<PMS2C( S*&, int, int), int&> ();250 test_result_of<PMS2C(const S*&, int, int), int&> ();251 test_result_of<PMS2C(std::unique_ptr<S>, int, int), int&> ();252 test_no_result<PMS2C(volatile S&, int, int)>();253 test_no_result<PMS2C(const volatile S&, int, int)>();254 255 test_result_of<PMS3C(S&, int), const int &>();256 test_result_of<PMS3C(S&, int, long), const int &>();257 258 typedef int (S::*PMS0V)() volatile;259 typedef int* (S::*PMS1V)(long) volatile;260 typedef int& (S::*PMS2V)(long, int) volatile;261 typedef const int& (S::*PMS3V)(int, ...) volatile;262 test_result_of<PMS0V( S), int> ();263 test_result_of<PMS0V( S&), int> ();264 test_result_of<PMS0V(volatile S&), int> ();265 test_result_of<PMS0V( S*), int> ();266 test_result_of<PMS0V(volatile S*), int> ();267 test_result_of<PMS0V( S*&), int> ();268 test_result_of<PMS0V(volatile S*&), int> ();269 test_result_of<PMS0V(std::unique_ptr<S>), int> ();270 test_no_result<PMS0V(const S&)>();271 test_no_result<PMS0V(const volatile S&)>();272 273 test_result_of<PMS1V( S, int), int*> ();274 test_result_of<PMS1V( S&, int), int*> ();275 test_result_of<PMS1V(volatile S&, int), int*> ();276 test_result_of<PMS1V( S*, int), int*> ();277 test_result_of<PMS1V(volatile S*, int), int*> ();278 test_result_of<PMS1V( S*&, int), int*> ();279 test_result_of<PMS1V(volatile S*&, int), int*> ();280 test_result_of<PMS1V(std::unique_ptr<S>, int), int*> ();281 test_no_result<PMS1V(const S&, int)>();282 test_no_result<PMS1V(const volatile S&, int)>();283 284 test_result_of<PMS2V( S, int, int), int&> ();285 test_result_of<PMS2V( S&, int, int), int&> ();286 test_result_of<PMS2V(volatile S&, int, int), int&> ();287 test_result_of<PMS2V( S*, int, int), int&> ();288 test_result_of<PMS2V(volatile S*, int, int), int&> ();289 test_result_of<PMS2V( S*&, int, int), int&> ();290 test_result_of<PMS2V(volatile S*&, int, int), int&> ();291 test_result_of<PMS2V(std::unique_ptr<S>, int, int), int&> ();292 test_no_result<PMS2V(const S&, int, int)>();293 test_no_result<PMS2V(const volatile S&, int, int)>();294 295 test_result_of<PMS3V(S&, int), const int &>();296 test_result_of<PMS3V(S&, int, long), const int &>();297 298 typedef int (S::*PMS0CV)() const volatile;299 typedef int* (S::*PMS1CV)(long) const volatile;300 typedef int& (S::*PMS2CV)(long, int) const volatile;301 typedef const int& (S::*PMS3CV)(int, ...) const volatile;302 test_result_of<PMS0CV( S), int> ();303 test_result_of<PMS0CV( S&), int> ();304 test_result_of<PMS0CV(const S&), int> ();305 test_result_of<PMS0CV(volatile S&), int> ();306 test_result_of<PMS0CV(const volatile S&), int> ();307 test_result_of<PMS0CV( S*), int> ();308 test_result_of<PMS0CV(const S*), int> ();309 test_result_of<PMS0CV(volatile S*), int> ();310 test_result_of<PMS0CV(const volatile S*), int> ();311 test_result_of<PMS0CV( S*&), int> ();312 test_result_of<PMS0CV(const S*&), int> ();313 test_result_of<PMS0CV(volatile S*&), int> ();314 test_result_of<PMS0CV(const volatile S*&), int> ();315 test_result_of<PMS0CV(std::unique_ptr<S>), int> ();316 317 test_result_of<PMS1CV( S, int), int*> ();318 test_result_of<PMS1CV( S&, int), int*> ();319 test_result_of<PMS1CV(const S&, int), int*> ();320 test_result_of<PMS1CV(volatile S&, int), int*> ();321 test_result_of<PMS1CV(const volatile S&, int), int*> ();322 test_result_of<PMS1CV( S*, int), int*> ();323 test_result_of<PMS1CV(const S*, int), int*> ();324 test_result_of<PMS1CV(volatile S*, int), int*> ();325 test_result_of<PMS1CV(const volatile S*, int), int*> ();326 test_result_of<PMS1CV( S*&, int), int*> ();327 test_result_of<PMS1CV(const S*&, int), int*> ();328 test_result_of<PMS1CV(volatile S*&, int), int*> ();329 test_result_of<PMS1CV(const volatile S*&, int), int*> ();330 test_result_of<PMS1CV(std::unique_ptr<S>, int), int*> ();331 332 test_result_of<PMS2CV( S, int, int), int&> ();333 test_result_of<PMS2CV( S&, int, int), int&> ();334 test_result_of<PMS2CV(const S&, int, int), int&> ();335 test_result_of<PMS2CV(volatile S&, int, int), int&> ();336 test_result_of<PMS2CV(const volatile S&, int, int), int&> ();337 test_result_of<PMS2CV( S*, int, int), int&> ();338 test_result_of<PMS2CV(const S*, int, int), int&> ();339 test_result_of<PMS2CV(volatile S*, int, int), int&> ();340 test_result_of<PMS2CV(const volatile S*, int, int), int&> ();341 test_result_of<PMS2CV( S*&, int, int), int&> ();342 test_result_of<PMS2CV(const S*&, int, int), int&> ();343 test_result_of<PMS2CV(volatile S*&, int, int), int&> ();344 test_result_of<PMS2CV(const volatile S*&, int, int), int&> ();345 test_result_of<PMS2CV(std::unique_ptr<S>, int, int), int&> ();346 347 test_result_of<PMS3CV(S&, int), const int &>();348 test_result_of<PMS3CV(S&, int, long), const int &>();349 }350 { // pointer to member data351 typedef char S::*PMD;352 test_result_of<PMD(S&), char &>();353 test_result_of<PMD(S*), char &>();354 test_result_of<PMD(S* const), char &>();355 test_result_of<PMD(const S&), const char&> ();356 test_result_of<PMD(const S*), const char&> ();357 test_result_of<PMD(volatile S&), volatile char&> ();358 test_result_of<PMD(volatile S*), volatile char&> ();359 test_result_of<PMD(const volatile S&), const volatile char&> ();360 test_result_of<PMD(const volatile S*), const volatile char&> ();361 test_result_of<PMD(SD&), char &>();362 test_result_of<PMD(SD const&), const char&>();363 test_result_of<PMD(SD*), char&>();364 test_result_of<PMD(const SD*), const char&>();365 test_result_of<PMD(std::unique_ptr<S>), char &>();366 test_result_of<PMD(std::unique_ptr<S const>), const char&>();367#if TEST_STD_VER >= 11368 test_result_of<PMD(std::reference_wrapper<S>), char&>();369 test_result_of<PMD(std::reference_wrapper<S const>), const char&>();370#endif371 test_no_result<PMD(ND&)>();372 }373 374 return 0;375}376