<br><br><div class="gmail_quote">On Thu, Dec 6, 2012 at 7:44 AM, Richard Smith <span dir="ltr"><<a href="mailto:richard-llvm@metafoo.co.uk" target="_blank">richard-llvm@metafoo.co.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: rsmith<br>
Date: Thu Dec 6 00:44:44 2012<br>
New Revision: 169475<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=169475&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=169475&view=rev</a><br>
Log:<br>
Fix <a href="http://stackoverflow.com/questions/13521163" target="_blank">http://stackoverflow.com/questions/13521163</a><br>
<br></blockquote><div><br>Just curious: did you stumble on it by accident or are you actively watching the `clang` tag ?<br><br>In any case it's great to see that a bug that did not even hit the bug database got fixed!<br>
<br>-- Matthieu<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Don't require that, during template deduction, a template specialization type<br>
as a function parameter has at least as many template arguments as one used in<br>
a function argument (not even if the argument has been resolved to an exact<br>
type); the additional parameters might be provided by default template<br>
arguments in the template. We don't need this check, since we now implement<br>
[temp.deduct.call]p4 with an additional check after deduction.<br>
<br>
Modified:<br>
cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp<br>
cfe/trunk/test/CXX/temp/temp.fct.spec/temp.deduct/temp.deduct.type/p9-0x.cpp<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp?rev=169475&r1=169474&r2=169475&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp?rev=169475&r1=169474&r2=169475&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp Thu Dec 6 00:44:44 2012<br>
@@ -130,8 +130,7 @@<br>
const TemplateArgument *Params, unsigned NumParams,<br>
const TemplateArgument *Args, unsigned NumArgs,<br>
TemplateDeductionInfo &Info,<br>
- SmallVectorImpl<DeducedTemplateArgument> &Deduced,<br>
- bool NumberOfArgumentsMustMatch = true);<br>
+ SmallVectorImpl<DeducedTemplateArgument> &Deduced);<br>
<br>
/// \brief If the given expression is of a form that permits the deduction<br>
/// of a non-type template parameter, return the declaration of that<br>
@@ -482,8 +481,7 @@<br>
return DeduceTemplateArguments(S, TemplateParams,<br>
Param->getArgs(), Param->getNumArgs(),<br>
SpecArg->getArgs(), SpecArg->getNumArgs(),<br>
- Info, Deduced,<br>
- /*NumberOfArgumentsMustMatch=*/false);<br>
+ Info, Deduced);<br>
}<br>
<br>
// If the argument type is a class template specialization, we<br>
@@ -1749,8 +1747,7 @@<br>
const TemplateArgument *Params, unsigned NumParams,<br>
const TemplateArgument *Args, unsigned NumArgs,<br>
TemplateDeductionInfo &Info,<br>
- SmallVectorImpl<DeducedTemplateArgument> &Deduced,<br>
- bool NumberOfArgumentsMustMatch) {<br>
+ SmallVectorImpl<DeducedTemplateArgument> &Deduced) {<br>
// C++0x [temp.deduct.type]p9:<br>
// If the template argument list of P contains a pack expansion that is not<br>
// the last template argument, the entire template argument list is a<br>
@@ -1770,8 +1767,7 @@<br>
<br>
// Check whether we have enough arguments.<br>
if (!hasTemplateArgumentForDeduction(Args, ArgIdx, NumArgs))<br>
- return NumberOfArgumentsMustMatch? Sema::TDK_NonDeducedMismatch<br>
- : Sema::TDK_Success;<br>
+ return Sema::TDK_Success;<br>
<br>
if (Args[ArgIdx].isPackExpansion()) {<br>
// FIXME: We follow the logic of C++0x [temp.deduct.type]p22 here,<br>
@@ -1867,11 +1863,6 @@<br>
return Result;<br>
}<br>
<br>
- // If there is an argument remaining, then we had too many arguments.<br>
- if (NumberOfArgumentsMustMatch &&<br>
- hasTemplateArgumentForDeduction(Args, ArgIdx, NumArgs))<br>
- return Sema::TDK_NonDeducedMismatch;<br>
-<br>
return Sema::TDK_Success;<br>
}<br>
<br>
<br>
Modified: cfe/trunk/test/CXX/temp/temp.fct.spec/temp.deduct/temp.deduct.type/p9-0x.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/temp/temp.fct.spec/temp.deduct/temp.deduct.type/p9-0x.cpp?rev=169475&r1=169474&r2=169475&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/temp/temp.fct.spec/temp.deduct/temp.deduct.type/p9-0x.cpp?rev=169475&r1=169474&r2=169475&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CXX/temp/temp.fct.spec/temp.deduct/temp.deduct.type/p9-0x.cpp (original)<br>
+++ cfe/trunk/test/CXX/temp/temp.fct.spec/temp.deduct/temp.deduct.type/p9-0x.cpp Thu Dec 6 00:44:44 2012<br>
@@ -53,3 +53,16 @@<br>
tuple<unsigned_c<1>, unsigned_c<2>, unsigned_c<3>><br>
>::value? 1 : -1];<br>
}<br>
+<br>
+namespace DeduceWithDefaultArgs {<br>
+ template<template<typename...> class Container> void f(Container<int>); // expected-note {{substitution failure [with Container = X]}}<br>
+ template<typename, typename = int> struct X {};<br>
+ void g() {<br>
+ // OK, use default argument for the second template parameter.<br>
+ f(X<int>{});<br>
+ f(X<int, int>{});<br>
+<br>
+ // Not OK.<br>
+ f(X<int, double>{}); // expected-error {{no matching function for call to 'f'}}<br>
+ }<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br>