]> granicus.if.org Git - clang/commitdiff
Move handling of template parameter packs out of the
authorDouglas Gregor <dgregor@apple.com>
Wed, 11 Nov 2009 19:41:09 +0000 (19:41 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 11 Nov 2009 19:41:09 +0000 (19:41 +0000)
template-type-parameter specific template argument checking code and
up to the template argument checking loop. In theory, this should make
variadic templates work better; in practice, they don't well enough
for us to care anyway (YET!), so this is mostly a re-organization to
simplify CheckTemplateArgument.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86868 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/Sema.h
lib/Sema/SemaTemplate.cpp

index 6ebdf887744928a39f6c3b6c7c4983c8d52dc452..b9cacafc4ca6dffc580dd1f1cdd93e2837a84e49 100644 (file)
@@ -2587,12 +2587,8 @@ public:
     
   bool CheckTemplateArgument(NamedDecl *Param,
                              const TemplateArgumentLoc &Arg,
-                             unsigned ArgIdx,
                              TemplateDecl *Template,
                              SourceLocation TemplateLoc,
-                             SourceLocation LAngleLoc,
-                             const TemplateArgumentLoc *TemplateArgs,
-                             unsigned NumTemplateArgs,
                              SourceLocation RAngleLoc,
                              TemplateArgumentListBuilder &Converted);
   
index ed7e28e27a516163d7a78584323c0ba5c45fc4ee..aace9834416e179ebd69c6af2c4f47f27f251e2f 100644 (file)
@@ -1610,34 +1610,16 @@ SubstDefaultTemplateArgument(Sema &SemaRef,
 /// template parameter.
 bool Sema::CheckTemplateArgument(NamedDecl *Param,
                                  const TemplateArgumentLoc &Arg,
-                                 unsigned ArgIdx,
                                  TemplateDecl *Template,
                                  SourceLocation TemplateLoc,
-                                 SourceLocation LAngleLoc,
-                                 const TemplateArgumentLoc *TemplateArgs,
-                                 unsigned NumTemplateArgs,
                                  SourceLocation RAngleLoc,
                                  TemplateArgumentListBuilder &Converted) {
-  if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
-    // Check template type parameters.
-    if (TTP->isParameterPack()) {
-      // Check all the remaining arguments (if any).
-      Converted.BeginPack();
-      for (; ArgIdx < NumTemplateArgs; ++ArgIdx) {
-        if (CheckTemplateTypeArgument(TTP, TemplateArgs[ArgIdx], Converted))
-          return true;
-      }
-      
-      Converted.EndPack();
-      return false;
-    } 
-    
+  // Check template type parameters.
+  if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
     return CheckTemplateTypeArgument(TTP, Arg, Converted);
-  }
   
-  if (NonTypeTemplateParmDecl *NTTP =dyn_cast<NonTypeTemplateParmDecl>(Param)) {
-    // Check non-type template parameters.
-    
+  // Check non-type template parameters.
+  if (NonTypeTemplateParmDecl *NTTP =dyn_cast<NonTypeTemplateParmDecl>(Param)) {    
     // Do substitution on the type of the non-type template parameter
     // with the template arguments we've seen thus far.
     QualType NTTPType = NTTP->getType();
@@ -1740,7 +1722,7 @@ bool Sema::CheckTemplateArgument(NamedDecl *Param,
     }
       
     case TemplateArgument::Pack:
-      assert(0 && "FIXME: Implement!");
+      llvm::llvm_unreachable("Caller must expand template argument packs");
       break;
     }
     
@@ -1802,7 +1784,7 @@ bool Sema::CheckTemplateArgument(NamedDecl *Param,
     break;
     
   case TemplateArgument::Pack:
-    assert(0 && "FIXME: Implement!");
+    llvm::llvm_unreachable("Caller must expand template argument packs");
     break;
   }
   
@@ -1859,6 +1841,21 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,
     if (ArgIdx > NumArgs && PartialTemplateArgs)
       break;
 
+    // If we have a template parameter pack, check every remaining template
+    // argument against that template parameter pack.
+    if ((*Param)->isTemplateParameterPack()) {
+      Converted.BeginPack();
+      for (; ArgIdx < NumArgs; ++ArgIdx) {
+        if (CheckTemplateArgument(*Param, TemplateArgs[ArgIdx], Template,
+                                  TemplateLoc, RAngleLoc, Converted)) {
+          Invalid = true;
+          break;
+        }
+      }
+      Converted.EndPack();
+      continue;
+    }
+    
     // Decode the template argument
     TemplateArgumentLoc Arg;
 
@@ -1926,8 +1923,7 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,
       Arg = TemplateArgs[ArgIdx];
     }
     
-    if (CheckTemplateArgument(*Param, Arg, ArgIdx, Template, TemplateLoc,
-                              LAngleLoc, TemplateArgs, NumTemplateArgs, 
+    if (CheckTemplateArgument(*Param, Arg, Template, TemplateLoc,
                               RAngleLoc, Converted))
       return true;
   }