]> granicus.if.org Git - clang/commitdiff
Add a new 'Pack' argument kind to TemplateArgument. This is not yet used.
authorAnders Carlsson <andersca@mac.com>
Mon, 15 Jun 2009 17:04:53 +0000 (17:04 +0000)
committerAnders Carlsson <andersca@mac.com>
Mon, 15 Jun 2009 17:04:53 +0000 (17:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73391 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclTemplate.h
lib/AST/DeclTemplate.cpp
lib/AST/Type.cpp
lib/Sema/SemaTemplate.cpp
lib/Sema/SemaTemplateDeduction.cpp
lib/Sema/SemaTemplateInstantiate.cpp

index a480f54394c6f8ecb508cb166837a9116d705a2c..7d5dc06f235a19af33c86a7d192534a799af7ba4 100644 (file)
@@ -404,6 +404,11 @@ class TemplateArgument {
       char Value[sizeof(llvm::APSInt)];
       void *Type;
     } Integer;
+    struct {
+      TemplateArgument *Args;
+      unsigned NumArgs;
+      bool CopyArgs;
+    } Args;
   };
 
   /// \brief Location of the beginning of this template argument.
@@ -413,7 +418,7 @@ public:
   /// \brief The type of template argument we're storing.
   enum ArgKind {
     Null = 0,
-    /// The template argument is a type. It's value is stored in the
+    /// The template argument is a type. Its value is stored in the
     /// TypeOrValue field.
     Type = 1,
     /// The template argument is a declaration
@@ -422,7 +427,11 @@ public:
     Integral = 3,
     /// The template argument is a value- or type-dependent expression
     /// stored in an Expr*.
-    Expression = 4
+    Expression = 4,
+
+    /// The template argument is actually a parameter pack. Arguments are stored
+    /// in the Args struct.
+    Pack = 5
   } Kind;
 
   /// \brief Construct an empty, invalid template argument.
@@ -459,8 +468,13 @@ public:
   /// occur in a non-dependent, canonical template argument list.
   TemplateArgument(Expr *E);
 
+  /// \brief Construct a template argument pack.
+  TemplateArgument(SourceLocation Loc, TemplateArgument *Args, 
+                   unsigned NumArgs, bool OwnsArgs);
+  
   /// \brief Copy constructor for a template argument.
   TemplateArgument(const TemplateArgument &Other) : Kind(Other.Kind) {
+    assert(Kind != Pack && "FIXME: Handle packs");
     if (Kind == Integral) {
       new (Integer.Value) llvm::APSInt(*Other.getAsIntegral());
       Integer.Type = Other.Integer.Type;
@@ -475,6 +489,10 @@ public:
     // safety.
     using llvm::APSInt;
 
+    // FIXME: Handle Packs
+    assert(Kind != Pack && "FIXME: Handle packs");
+    assert(Other.Kind != Pack && "FIXME: Handle packs");
+
     if (Kind == Other.Kind && Kind == Integral) {
       // Copy integral values.
       *this->getAsIntegral() = *Other.getAsIntegral();
@@ -502,6 +520,8 @@ public:
 
     if (Kind == Integral)
       getAsIntegral()->~APSInt();
+    else if (Kind == Pack && Args.CopyArgs)
+      delete[] Args.Args;
   }
 
   /// \brief Return the kind of stored template argument.
@@ -586,6 +606,11 @@ public:
       // FIXME: We need a canonical representation of expressions.
       ID.AddPointer(getAsExpr());
       break;
+    
+    case Pack:
+      ID.AddInteger(Args.NumArgs);
+      for (unsigned I = 0; I != Args.NumArgs; ++I)
+        Args.Args[I].Profile(ID);
     }
   }
 };
index 5b1bf9b3afc52e5b7ad0ee3ec6046df6f1bbb321..d57a43040f6bb54d1c667365e651c145d9158779 100644 (file)
@@ -238,6 +238,22 @@ TemplateArgument::TemplateArgument(Expr *E) : Kind(Expression) {
   StartLoc = E->getSourceRange().getBegin();
 }
 
+/// \brief Construct a template argument pack.
+TemplateArgument::TemplateArgument(SourceLocation Loc, TemplateArgument *args, 
+                                   unsigned NumArgs, bool CopyArgs) 
+  : Kind(Pack) {
+    Args.NumArgs = NumArgs;
+    Args.CopyArgs = CopyArgs;
+    if (!Args.CopyArgs) {
+      Args.Args = args;
+      return;
+    }
+
+    Args.Args = new TemplateArgument[NumArgs];
+    for (unsigned I = 0; I != NumArgs; ++I)
+      Args.Args[I] = args[I];
+}
+
 //===----------------------------------------------------------------------===//
 // TemplateArgumentListBuilder Implementation
 //===----------------------------------------------------------------------===//
index e304f54226363adcba28a921ce6567354e6f1f8a..40a997cebccc322c3c5821b99c6de2b2d7d5cbfa 100644 (file)
@@ -1068,6 +1068,10 @@ anyDependentTemplateArguments(const TemplateArgument *Args, unsigned NumArgs) {
           Args[Idx].getAsExpr()->isValueDependent())
         return true;
       break;
+        
+    case TemplateArgument::Pack:
+      assert(0 && "FIXME: Implement!");
+      break;
     }
   }
 
@@ -1476,6 +1480,9 @@ TemplateSpecializationType::PrintTemplateArgumentList(
       Args[Arg].getAsExpr()->printPretty(s, 0, Policy);
       break;
     }
+    case TemplateArgument::Pack:
+      assert(0 && "FIXME: Implement!");
+      break;
     }
 
     // If this is the first argument and its string representation
index b2a82ed74d51b316896c0b3ede410abffd92cc93..2b2272d9995ba14d318e3f4b82049b3bdf2f7b5a 100644 (file)
@@ -806,6 +806,10 @@ static void CanonicalizeTemplateArguments(const TemplateArgument *TemplateArgs,
       Canonical.push_back(TemplateArgument(SourceLocation(), CanonType));
       break;
     }
+    
+    case TemplateArgument::Pack:
+      assert(0 && "FIXME: Implement!");
+      break;
     }
   }
 }
@@ -1207,6 +1211,11 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,
           Diag(Arg.getLocation(), diag::err_template_arg_must_be_expr);
         Diag((*Param)->getLocation(), diag::note_template_param_here);
         Invalid = true;
+        break;
+      
+      case TemplateArgument::Pack:
+        assert(0 && "FIXME: Implement!");
+        break;
       }
     } else { 
       // Check template template parameters.
@@ -1251,6 +1260,10 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,
       case TemplateArgument::Integral:
         assert(false && "Integral argument with template template parameter");
         break;
+      
+      case TemplateArgument::Pack:
+        assert(0 && "FIXME: Implement!");
+        break;
       }
     }
   }
index 84d802d1bf89ecc4dcb667abab93d6d44564478b..9305024cc9aa5867cabb3cd6c2b9a1857b613679 100644 (file)
@@ -597,6 +597,9 @@ DeduceTemplateArguments(ASTContext &Context,
     // Can't deduce anything, but that's okay.
     return Sema::TDK_Success;
   }
+  case TemplateArgument::Pack:
+    assert(0 && "FIXME: Implement!");
+    break;
   }
       
   return Sema::TDK_Success;
@@ -898,6 +901,9 @@ MarkDeducedTemplateParameters(Sema &SemaRef,
   case TemplateArgument::Expression:
     MarkDeducedTemplateParameters(TemplateArg.getAsExpr(), Deduced);
     break;
+  case TemplateArgument::Pack:
+    assert(0 && "FIXME: Implement!");
+    break;
   }
 }
 
index 18b2d75accbc53258c5ad9d47b377b29e0839ab6..0a2934b1c8a5e391d8bdd0542bc517dea32c1e58 100644 (file)
@@ -1153,6 +1153,10 @@ TemplateArgument Sema::Instantiate(TemplateArgument Arg,
       return TemplateArgument();
     return TemplateArgument(E.takeAs<Expr>());
   }
+  
+  case TemplateArgument::Pack:
+    assert(0 && "FIXME: Implement!");
+    break;
   }
 
   assert(false && "Unhandled template argument kind");