diff options
-rw-r--r-- | lib/Sema/SemaTemplateDeduction.cpp | 11 | ||||
-rw-r--r-- | test/CXX/temp/temp.arg/temp.arg.type/p2.cpp | 9 |
2 files changed, 13 insertions, 7 deletions
diff --git a/lib/Sema/SemaTemplateDeduction.cpp b/lib/Sema/SemaTemplateDeduction.cpp index f3ffa716f1..6237610c09 100644 --- a/lib/Sema/SemaTemplateDeduction.cpp +++ b/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<NamedDecl *>( + = const_cast<NamedDecl *>( 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/test/CXX/temp/temp.arg/temp.arg.type/p2.cpp b/test/CXX/temp/temp.arg/temp.arg.type/p2.cpp index 0384aa70fa..5c44ccb635 100644 --- a/test/CXX/temp/temp.arg/temp.arg.type/p2.cpp +++ b/test/CXX/temp/temp.arg/temp.arg.type/p2.cpp @@ -10,3 +10,12 @@ template<typename T> struct B { }; B<function> b; // expected-note{{instantiation of}} +template <typename T> 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'}} +} + |