diff options
-rw-r--r-- | clang/lib/Sema/SemaTemplateDeduction.cpp | 13 | ||||
-rw-r--r-- | clang/test/SemaCXX/calling-conv-compat.cpp | 13 |
2 files changed, 24 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 2605acddfac..4b811c7e252 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -1517,10 +1517,19 @@ DeduceTemplateArgumentsByTypeMatch(Sema &S, if (!MemPtrArg) return Sema::TDK_NonDeducedMismatch; + QualType ParamPointeeType = MemPtrParam->getPointeeType(); + if (ParamPointeeType->isFunctionType()) + S.adjustMemberFunctionCC(ParamPointeeType, /*IsStatic=*/true, + /*IsCtorOrDtor=*/false, Info.getLocation()); + QualType ArgPointeeType = MemPtrArg->getPointeeType(); + if (ArgPointeeType->isFunctionType()) + S.adjustMemberFunctionCC(ArgPointeeType, /*IsStatic=*/true, + /*IsCtorOrDtor=*/false, Info.getLocation()); + if (Sema::TemplateDeductionResult Result = DeduceTemplateArgumentsByTypeMatch(S, TemplateParams, - MemPtrParam->getPointeeType(), - MemPtrArg->getPointeeType(), + ParamPointeeType, + ArgPointeeType, Info, Deduced, TDF & TDF_IgnoreQualifiers)) return Result; diff --git a/clang/test/SemaCXX/calling-conv-compat.cpp b/clang/test/SemaCXX/calling-conv-compat.cpp index cebac9fad6c..20d93b41e1d 100644 --- a/clang/test/SemaCXX/calling-conv-compat.cpp +++ b/clang/test/SemaCXX/calling-conv-compat.cpp @@ -370,6 +370,19 @@ X<fun_cdecl >::p tmpl6 = &A::method_thiscall; X<fun_stdcall >::p tmpl7 = &A::method_stdcall; X<fun_fastcall>::p tmpl8 = &A::method_fastcall; +// Make sure we adjust thiscall to cdecl when extracting the function type from +// a member pointer. +template <typename> struct Y; + +template <typename Fn, typename C> +struct Y<Fn C::*> { + typedef Fn *p; +}; + +void __cdecl f_cdecl(); +Y<decltype(&A::method_thiscall)>::p tmpl9 = &f_cdecl; + + } // end namespace MemberPointers // Test that lambdas that capture nothing convert to cdecl function pointers. |