From d4a83d078cbb07a064fab90e24bc21a7933f415a Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Sat, 11 Dec 2010 00:05:19 +0000 Subject: [PATCH] The implementation of the new definition of result_of (N3123) resulted in some test failures in [func.memfn] that I failed to previously notice. This corrects that mistake. llvm-svn: 121600 --- libcxx/include/type_traits | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits index a1e00d542778..db1cdb7a4b8e 100644 --- a/libcxx/include/type_traits +++ b/libcxx/include/type_traits @@ -1394,31 +1394,31 @@ public: typedef decltype(declval<_Fn>()(declval<_ArgTypes>()...)) type; }; -template +template struct __result_of_mp {}; // member function pointer template -struct __result_of_mp<_R (_Class::*)(_Params...), _Tp, _Args...> +struct __result_of_mp<_R (_Class::*)(_Params...), _Tp, true, _Args...> { typedef _R type; }; template -struct __result_of_mp<_R (_Class::*)(_Params...) const, _Tp, _Args...> +struct __result_of_mp<_R (_Class::*)(_Params...) const, _Tp, true, _Args...> { typedef _R type; }; template -struct __result_of_mp<_R (_Class::*)(_Params...) volatile, _Tp, _Args...> +struct __result_of_mp<_R (_Class::*)(_Params...) volatile, _Tp, true, _Args...> { typedef _R type; }; template -struct __result_of_mp<_R (_Class::*)(_Params...) const volatile, _Tp, _Args...> +struct __result_of_mp<_R (_Class::*)(_Params...) const volatile, _Tp, true, _Args...> { typedef _R type; }; @@ -1441,7 +1441,7 @@ struct __result_of_mdp<_R _Class::*, _Tp, true> }; template -struct __result_of_mp<_R _Class::*, _Tp> +struct __result_of_mp<_R _Class::*, _Tp, false> : public __result_of_mdp<_R _Class::*, _Tp, is_base_of<_Class, typename remove_reference<_Tp>::type>::value> { @@ -1449,7 +1449,8 @@ struct __result_of_mp<_R _Class::*, _Tp> template class __result_of<_Fn(_Tp, _ArgTypes...), false> // _Fn must be member pointer - : public __result_of_mp<_Fn, _Tp, _ArgTypes...> + : public __result_of_mp<_Fn, _Tp, is_member_function_pointer<_Fn>::value, + _ArgTypes...> { };