Index: llvm-4.0.0.src/tools/clang/lib/Sema/SemaTemplateDeduction.cpp =================================================================== --- llvm-4.0.0.src/tools/clang/lib/Sema/SemaTemplateDeduction.cpp +++ llvm-4.0.0.src/tools/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -1895,7 +1895,7 @@ // Check whether we have enough arguments. if (!hasTemplateArgumentForDeduction(Args, ArgIdx)) - return NumberOfArgumentsMustMatch ? Sema::TDK_TooFewArguments + return NumberOfArgumentsMustMatch ? Sema::TDK_MiscellaneousDeductionFailure : Sema::TDK_Success; if (Args[ArgIdx].isPackExpansion()) { Index: llvm-4.0.0.src/tools/clang/test/SemaTemplate/deduction.cpp =================================================================== --- llvm-4.0.0.src/tools/clang/test/SemaTemplate/deduction.cpp +++ llvm-4.0.0.src/tools/clang/test/SemaTemplate/deduction.cpp @@ -348,3 +348,14 @@ template int B::error> {}; // expected-note {{instantiation of}} int bi = B; // expected-note {{during template argument deduction for variable template partial specialization 'B::error>' [with T = char]}} } + +namespace PR31043 { +template +struct tuple {}; + +template +int foo(tuple); // expected-note{{candidate template ignored: failed template argument deduction}} + +int z = foo(tuple<>{}); // expected-error{{no matching function call to 'foo'}} +} +