From 6e9cf630f815780bb84533a51bcbe9c840ded15b Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Tue, 12 Oct 2010 18:51:08 +0000 Subject: [PATCH] When finalizing a function template specialization following template argument deduction, make sure to check the correctness of deduced template type arguments (which we had previously skipped) along with other kinds of template arguments. This fixes part of PR6784, but we're still swallowing the extension warning about unnamed/local template arguments. llvm-svn: 116327 --- clang/lib/Sema/SemaTemplateDeduction.cpp | 11 ++++------- clang/test/CXX/temp/temp.arg/temp.arg.type/p2.cpp | 9 +++++++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index f3ffa716f1b9..6237610c098d 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -1018,7 +1018,7 @@ FinishTemplateArgumentDeduction(Sema &S, for (unsigned I = 0, N = Deduced.size(); I != N; ++I) { if (Deduced[I].isNull()) { Decl *Param - = const_cast( + = const_cast( Partial->getTemplateParameters()->getParam(I)); Info.Param = makeTemplateParameter(Param); return Sema::TDK_Incomplete; @@ -1383,13 +1383,10 @@ Sema::FinishTemplateArgumentDeduction(FunctionTemplateDecl *FunctionTemplate, for (unsigned I = 0, N = Deduced.size(); I != N; ++I) { NamedDecl *Param = FunctionTemplate->getTemplateParameters()->getParam(I); if (!Deduced[I].isNull()) { - if (I < NumExplicitlySpecified || - Deduced[I].getKind() == TemplateArgument::Type) { + if (I < NumExplicitlySpecified) { // We have already fully type-checked and converted this - // argument (because it was explicitly-specified) or no - // additional checking is necessary (because it's a template - // type parameter). Just record the presence of this - // parameter. + // argument, because it was explicitly-specified. Just record the + // presence of this argument. Builder.Append(Deduced[I]); continue; } diff --git a/clang/test/CXX/temp/temp.arg/temp.arg.type/p2.cpp b/clang/test/CXX/temp/temp.arg/temp.arg.type/p2.cpp index 0384aa70fa00..5c44ccb63532 100644 --- a/clang/test/CXX/temp/temp.arg/temp.arg.type/p2.cpp +++ b/clang/test/CXX/temp/temp.arg/temp.arg.type/p2.cpp @@ -10,3 +10,12 @@ template struct B { }; B b; // expected-note{{instantiation of}} +template int f0(void *, const T&); // expected-note{{candidate template ignored: substitution failure}} +enum {e}; + +void test_f0(int n) { + int i = f0(0, e); // FIXME: We should get a warning here, at least + int vla[n]; + f0(0, vla); // expected-error{{no matching function for call to 'f0'}} +} +