diff options
Diffstat (limited to 'lib/Sema/SemaTemplateDeduction.cpp')
-rw-r--r-- | lib/Sema/SemaTemplateDeduction.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/lib/Sema/SemaTemplateDeduction.cpp b/lib/Sema/SemaTemplateDeduction.cpp index bc6138d559..b448633381 100644 --- a/lib/Sema/SemaTemplateDeduction.cpp +++ b/lib/Sema/SemaTemplateDeduction.cpp @@ -2935,8 +2935,12 @@ DeduceTemplateArgumentByListElement(Sema &S, } // For all other cases, just match by type. + QualType ArgType = Arg->getType(); + if (AdjustFunctionParmAndArgTypesForDeduction(S, TemplateParams, ParamType, + ArgType, Arg, TDF)) + return Sema::TDK_FailedOverloadResolution; return DeduceTemplateArgumentsByTypeMatch(S, TemplateParams, ParamType, - Arg->getType(), Info, Deduced, TDF); + ArgType, Info, Deduced, TDF); } /// \brief Perform template argument deduction from a function call @@ -3494,22 +3498,24 @@ Sema::DeduceAutoType(TypeSourceInfo *Type, Expr *&Init, Deduced.resize(1); QualType InitType = Init->getType(); unsigned TDF = 0; - if (AdjustFunctionParmAndArgTypesForDeduction(*this, &TemplateParams, - FuncParam, InitType, Init, - TDF)) - return DAR_Failed; TemplateDeductionInfo Info(Context, Loc); InitListExpr * InitList = dyn_cast<InitListExpr>(Init); if (InitList) { for (unsigned i = 0, e = InitList->getNumInits(); i < e; ++i) { - if (DeduceTemplateArgumentsByTypeMatch(*this, &TemplateParams, FuncParam, - InitList->getInit(i)->getType(), - Info, Deduced, TDF)) + if (DeduceTemplateArgumentByListElement(*this, &TemplateParams, + TemplArg, + InitList->getInit(i), + Info, Deduced, TDF)) return DAR_Failed; } } else { + if (AdjustFunctionParmAndArgTypesForDeduction(*this, &TemplateParams, + FuncParam, InitType, Init, + TDF)) + return DAR_Failed; + if (DeduceTemplateArgumentsByTypeMatch(*this, &TemplateParams, FuncParam, InitType, Info, Deduced, TDF)) return DAR_Failed; |