From: Eli Friedman Date: Wed, 8 Feb 2012 03:07:05 +0000 (+0000) Subject: Make sure template argument deduction is consistently performed in an unevaluated... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=59a839c5a4eecfeb495fc64224f6a949d1c5b2da;p=clang 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 --- 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 &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 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: diff --git a/test/SemaCXX/undefined-internal.cpp b/test/SemaCXX/undefined-internal.cpp index a253020b8e..154172001e 100644 --- a/test/SemaCXX/undefined-internal.cpp +++ b/test/SemaCXX/undefined-internal.cpp @@ -170,3 +170,14 @@ namespace cxx11_odr_rules { b(); } } + + +namespace OverloadUse { + namespace { + void f(); + void f(int); // expected-warning {{function 'OverloadUse::::f' has internal linkage but is not defined}} + } + template void t(int*) { x(); } + template void t(long*) { x(10); } // expected-note {{used here}} + void g() { long a; t(&a); } +}