diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2012-02-08 03:07:05 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2012-02-08 03:07:05 +0000 |
commit | 59a839c5a4eecfeb495fc64224f6a949d1c5b2da (patch) | |
tree | b865e7d7358489fe91d173285649400c9f7baa31 /lib/Sema/SemaTemplateDeduction.cpp | |
parent | 7b318d16992cb68567c3ee217b86cac2ed11d5d8 (diff) |
Make sure template argument deduction is consistently performed in an unevaluated context.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150049 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplateDeduction.cpp')
-rw-r--r-- | lib/Sema/SemaTemplateDeduction.cpp | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/lib/Sema/SemaTemplateDeduction.cpp b/lib/Sema/SemaTemplateDeduction.cpp index 596326c661..9d711001b3 100644 --- a/lib/Sema/SemaTemplateDeduction.cpp +++ b/lib/Sema/SemaTemplateDeduction.cpp @@ -2019,7 +2019,8 @@ FinishTemplateArgumentDeduction(Sema &S, const TemplateArgumentList &TemplateArgs, SmallVectorImpl<DeducedTemplateArgument> &Deduced, TemplateDeductionInfo &Info) { - // Trap errors. + // Unevaluated SFINAE context. + EnterExpressionEvaluationContext Unevaluated(S, Sema::Unevaluated); Sema::SFINAETrap Trap(S); Sema::ContextRAII SavedContext(S, Partial); @@ -2145,7 +2146,11 @@ Sema::DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, // argument list if the template arguments of the partial // specialization can be deduced from the actual template argument // list (14.8.2). + + // Unevaluated SFINAE context. + EnterExpressionEvaluationContext Unevaluated(*this, Sema::Unevaluated); SFINAETrap Trap(*this); + SmallVector<DeducedTemplateArgument, 4> Deduced; Deduced.resize(Partial->getTemplateParameters()->size()); if (TemplateDeductionResult Result @@ -2226,8 +2231,8 @@ Sema::SubstituteExplicitTemplateArguments( return TDK_Success; } - // Substitution of the explicit template arguments into a function template - /// is a SFINAE context. Trap any errors that might occur. + // Unevaluated SFINAE context. + EnterExpressionEvaluationContext Unevaluated(*this, Sema::Unevaluated); SFINAETrap Trap(*this); // C++ [temp.arg.explicit]p3: @@ -2449,8 +2454,8 @@ Sema::FinishTemplateArgumentDeduction(FunctionTemplateDecl *FunctionTemplate, TemplateParameterList *TemplateParams = FunctionTemplate->getTemplateParameters(); - // Template argument deduction for function templates in a SFINAE context. - // Trap any errors that might occur. + // Unevaluated SFINAE context. + EnterExpressionEvaluationContext Unevaluated(*this, Sema::Unevaluated); SFINAETrap Trap(*this); // Enter a new template instantiation context while we instantiate the @@ -3172,8 +3177,8 @@ Sema::DeduceTemplateArguments(FunctionTemplateDecl *FunctionTemplate, NumExplicitlySpecified = Deduced.size(); } - // Template argument deduction for function templates in a SFINAE context. - // Trap any errors that might occur. + // Unevaluated SFINAE context. + EnterExpressionEvaluationContext Unevaluated(*this, Sema::Unevaluated); SFINAETrap Trap(*this); Deduced.resize(TemplateParams->size()); @@ -3257,8 +3262,8 @@ Sema::DeduceTemplateArguments(FunctionTemplateDecl *FunctionTemplate, A = A.getUnqualifiedType(); } - // Template argument deduction for function templates in a SFINAE context. - // Trap any errors that might occur. + // Unevaluated SFINAE context. + EnterExpressionEvaluationContext Unevaluated(*this, Sema::Unevaluated); SFINAETrap Trap(*this); // C++ [temp.deduct.conv]p1: |