<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>