[cfe-commits] r72915 - in /cfe/trunk: include/clang/AST/DeclTemplate.h lib/Sema/Sema.h lib/Sema/SemaTemplate.cpp

Anders Carlsson andersca at mac.com
Thu Jun 4 20:43:21 PDT 2009


Author: andersca
Date: Thu Jun  4 22:43:12 2009
New Revision: 72915

URL: http://llvm.org/viewvc/llvm-project?rev=72915&view=rev
Log:
Add a helper class for building template argument lists.

Modified:
    cfe/trunk/include/clang/AST/DeclTemplate.h
    cfe/trunk/lib/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaTemplate.cpp

Modified: cfe/trunk/include/clang/AST/DeclTemplate.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclTemplate.h?rev=72915&r1=72914&r2=72915&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/DeclTemplate.h (original)
+++ cfe/trunk/include/clang/AST/DeclTemplate.h Thu Jun  4 22:43:12 2009
@@ -573,6 +573,20 @@
   }
 };
 
+/// \brief A helper class for making template argument lists.
+class TemplateArgumentListBuilder {
+  llvm::SmallVector<TemplateArgument, 16> Args;
+
+public:
+  // FIXME: Should use index array size.
+  size_t size() const { return Args.size(); }
+
+  size_t flatSize() const { return Args.size(); }
+    
+  TemplateArgument *getFlatArgumentList() { return Args.data(); }
+  void push_back(const TemplateArgument& Arg) { Args.push_back(Arg); }
+};
+
 /// \brief A template argument list.
 ///
 /// FIXME: In the future, this class will be extended to support
@@ -589,7 +603,6 @@
   /// argument list.
   unsigned NumArguments;
 
-
 public:
   TemplateArgumentList(ASTContext &Context,
                        TemplateArgument *TemplateArgs,

Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=72915&r1=72914&r2=72915&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Thu Jun  4 22:43:12 2009
@@ -20,6 +20,7 @@
 #include "SemaOverload.h"
 #include "clang/AST/DeclBase.h"
 #include "clang/AST/DeclObjC.h"
+#include "clang/AST/DeclTemplate.h"
 #include "clang/Parse/Action.h"
 #include "clang/Sema/SemaDiagnostic.h"
 #include "llvm/ADT/SmallVector.h"
@@ -1971,7 +1972,7 @@
                                  const TemplateArgument *TemplateArgs,
                                  unsigned NumTemplateArgs,
                                  SourceLocation RAngleLoc,
-                       llvm::SmallVectorImpl<TemplateArgument> &Converted);
+                                 TemplateArgumentListBuilder &Converted);
 
   bool CheckTemplateArgument(TemplateTypeParmDecl *Param, QualType Arg,
                              SourceLocation ArgLoc);
@@ -1980,7 +1981,7 @@
   bool CheckTemplateArgumentPointerToMember(Expr *Arg, NamedDecl *&Member);
   bool CheckTemplateArgument(NonTypeTemplateParmDecl *Param, 
                              QualType InstantiatedParamType, Expr *&Arg,
-                       llvm::SmallVectorImpl<TemplateArgument> *Converted = 0);
+                             TemplateArgumentListBuilder *Converted = 0);
   bool CheckTemplateArgument(TemplateTemplateParmDecl *Param, DeclRefExpr *Arg);
   bool TemplateParameterListsAreEqual(TemplateParameterList *New,
                                       TemplateParameterList *Old,

Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=72915&r1=72914&r2=72915&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp Thu Jun  4 22:43:12 2009
@@ -811,7 +811,7 @@
 
   // Check that the template argument list is well-formed for this
   // template.
-  llvm::SmallVector<TemplateArgument, 16> ConvertedTemplateArgs;
+  TemplateArgumentListBuilder ConvertedTemplateArgs;
   if (CheckTemplateArgumentList(Template, TemplateLoc, LAngleLoc, 
                                 TemplateArgs, NumTemplateArgs, RAngleLoc,
                                 ConvertedTemplateArgs))
@@ -835,15 +835,16 @@
     //   template<typename T, typename U = T> struct A;
     TemplateName CanonName = Context.getCanonicalTemplateName(Name);
     CanonType = Context.getTemplateSpecializationType(CanonName, 
-                                                    &ConvertedTemplateArgs[0],
-                                                ConvertedTemplateArgs.size());
+                                    ConvertedTemplateArgs.getFlatArgumentList(),
+                                    ConvertedTemplateArgs.flatSize());
   } else if (ClassTemplateDecl *ClassTemplate 
                = dyn_cast<ClassTemplateDecl>(Template)) {
     // Find the class template specialization declaration that
     // corresponds to these arguments.
     llvm::FoldingSetNodeID ID;
-    ClassTemplateSpecializationDecl::Profile(ID, &ConvertedTemplateArgs[0],
-                                             ConvertedTemplateArgs.size());
+    ClassTemplateSpecializationDecl::Profile(ID, 
+                                    ConvertedTemplateArgs.getFlatArgumentList(),
+                                    ConvertedTemplateArgs.flatSize());
     void *InsertPos = 0;
     ClassTemplateSpecializationDecl *Decl
       = ClassTemplate->getSpecializations().FindNodeOrInsertPos(ID, InsertPos);
@@ -852,12 +853,11 @@
       // specialization. Create the canonical declaration and add it to
       // the set of specializations.
       Decl = ClassTemplateSpecializationDecl::Create(Context, 
-                                           ClassTemplate->getDeclContext(),
-                                                     TemplateLoc,
-                                                     ClassTemplate,
-                                                     &ConvertedTemplateArgs[0],
-                                                  ConvertedTemplateArgs.size(),
-                                                     0);
+                                    ClassTemplate->getDeclContext(),
+                                    TemplateLoc,
+                                    ClassTemplate,
+                                    ConvertedTemplateArgs.getFlatArgumentList(),
+                                    ConvertedTemplateArgs.flatSize(), 0);
       ClassTemplate->getSpecializations().InsertNode(Decl, InsertPos);
       Decl->setLexicalDeclContext(CurContext);
     }
@@ -955,7 +955,7 @@
                                      const TemplateArgument *TemplateArgs,
                                      unsigned NumTemplateArgs,
                                      SourceLocation RAngleLoc,
-                          llvm::SmallVectorImpl<TemplateArgument> &Converted) {
+                                     TemplateArgumentListBuilder &Converted) {
   TemplateParameterList *Params = Template->getTemplateParameters();
   unsigned NumParams = Params->size();
   unsigned NumArgs = NumTemplateArgs;
@@ -1004,12 +1004,13 @@
         // on the previously-computed template arguments.
         if (ArgType->isDependentType()) {
           InstantiatingTemplate Inst(*this, TemplateLoc, 
-                                     Template, &Converted[0], 
-                                     Converted.size(),
+                                     Template, Converted.getFlatArgumentList(),
+                                     Converted.flatSize(),
                                      SourceRange(TemplateLoc, RAngleLoc));
 
-          TemplateArgumentList TemplateArgs(Context, &Converted[0],
-                                            Converted.size(), 
+          TemplateArgumentList TemplateArgs(Context, 
+                                            Converted.getFlatArgumentList(),
+                                            Converted.flatSize(), 
                                             /*CopyArgs=*/false);
           ArgType = InstantiateType(ArgType, TemplateArgs,
                                     TTP->getDefaultArgumentLoc(),
@@ -1075,12 +1076,13 @@
       if (NTTPType->isDependentType()) {
         // Instantiate the type of the non-type template parameter.
         InstantiatingTemplate Inst(*this, TemplateLoc, 
-                                   Template, &Converted[0], 
-                                   Converted.size(),
+                                   Template, Converted.getFlatArgumentList(),
+                                   Converted.flatSize(),
                                    SourceRange(TemplateLoc, RAngleLoc));
 
-        TemplateArgumentList TemplateArgs(Context, &Converted[0],
-                                          Converted.size(), 
+        TemplateArgumentList TemplateArgs(Context, 
+                                          Converted.getFlatArgumentList(),
+                                          Converted.flatSize(), 
                                           /*CopyArgs=*/false);
         NTTPType = InstantiateType(NTTPType, TemplateArgs,
                                    NTTP->getLocation(),
@@ -1393,7 +1395,7 @@
 /// of this argument will be added to the end of the Converted vector.
 bool Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
                                  QualType InstantiatedParamType, Expr *&Arg, 
-                         llvm::SmallVectorImpl<TemplateArgument> *Converted) {
+                                 TemplateArgumentListBuilder *Converted) {
   SourceLocation StartLoc = Arg->getSourceRange().getBegin();
 
   // If either the parameter has a dependent type or the argument is
@@ -2065,7 +2067,7 @@
 
   // Check that the template argument list is well-formed for this
   // template.
-  llvm::SmallVector<TemplateArgument, 16> ConvertedTemplateArgs;
+  TemplateArgumentListBuilder ConvertedTemplateArgs;
   if (CheckTemplateArgumentList(ClassTemplate, TemplateNameLoc, LAngleLoc, 
                                 &TemplateArgs[0], TemplateArgs.size(),
                                 RAngleLoc, ConvertedTemplateArgs))
@@ -2080,11 +2082,13 @@
   llvm::FoldingSetNodeID ID;
   if (isPartialSpecialization)
     // FIXME: Template parameter list matters, too
-    ClassTemplatePartialSpecializationDecl::Profile(ID, &ConvertedTemplateArgs[0],
-                                                    ConvertedTemplateArgs.size());
+    ClassTemplatePartialSpecializationDecl::Profile(ID, 
+                                    ConvertedTemplateArgs.getFlatArgumentList(),
+                                              ConvertedTemplateArgs.flatSize());
   else
-    ClassTemplateSpecializationDecl::Profile(ID, &ConvertedTemplateArgs[0],
-                                             ConvertedTemplateArgs.size());
+    ClassTemplateSpecializationDecl::Profile(ID,
+                                    ConvertedTemplateArgs.getFlatArgumentList(),
+                                             ConvertedTemplateArgs.flatSize());
   void *InsertPos = 0;
   ClassTemplateSpecializationDecl *PrevDecl = 0;
 
@@ -2128,8 +2132,8 @@
                                                 TemplateNameLoc,
                                                 TemplateParams,
                                                 ClassTemplate,
-                                                &ConvertedTemplateArgs[0],
-                                                ConvertedTemplateArgs.size(),
+                                    ConvertedTemplateArgs.getFlatArgumentList(),
+                                               ConvertedTemplateArgs.flatSize(),
                                                 PrevPartial);
 
     if (PrevPartial) {
@@ -2147,8 +2151,8 @@
                                              ClassTemplate->getDeclContext(),
                                                 TemplateNameLoc,
                                                 ClassTemplate,
-                                                &ConvertedTemplateArgs[0],
-                                                ConvertedTemplateArgs.size(),
+                                    ConvertedTemplateArgs.getFlatArgumentList(),
+                                               ConvertedTemplateArgs.flatSize(),
                                                 PrevDecl);
 
     if (PrevDecl) {
@@ -2269,7 +2273,7 @@
 
   // Check that the template argument list is well-formed for this
   // template.
-  llvm::SmallVector<TemplateArgument, 16> ConvertedTemplateArgs;
+  TemplateArgumentListBuilder ConvertedTemplateArgs;
   if (CheckTemplateArgumentList(ClassTemplate, TemplateNameLoc, LAngleLoc, 
                                 TemplateArgs.data(), TemplateArgs.size(),
                                 RAngleLoc, ConvertedTemplateArgs))
@@ -2282,8 +2286,9 @@
   // Find the class template specialization declaration that
   // corresponds to these arguments.
   llvm::FoldingSetNodeID ID;
-  ClassTemplateSpecializationDecl::Profile(ID, &ConvertedTemplateArgs[0],
-                                           ConvertedTemplateArgs.size());
+  ClassTemplateSpecializationDecl::Profile(ID, 
+                                    ConvertedTemplateArgs.getFlatArgumentList(),
+                                           ConvertedTemplateArgs.flatSize());
   void *InsertPos = 0;
   ClassTemplateSpecializationDecl *PrevDecl
     = ClassTemplate->getSpecializations().FindNodeOrInsertPos(ID, InsertPos);
@@ -2326,8 +2331,8 @@
                                              ClassTemplate->getDeclContext(),
                                                   TemplateNameLoc,
                                                   ClassTemplate,
-                                                  &ConvertedTemplateArgs[0],
-                                                  ConvertedTemplateArgs.size(),
+                                    ConvertedTemplateArgs.getFlatArgumentList(),
+                                               ConvertedTemplateArgs.flatSize(),
                                                   0);
       Specialization->setLexicalDeclContext(CurContext);
       CurContext->addDecl(Context, Specialization);
@@ -2354,8 +2359,8 @@
                                              ClassTemplate->getDeclContext(),
                                                 TemplateNameLoc,
                                                 ClassTemplate,
-                                                &ConvertedTemplateArgs[0],
-                                                ConvertedTemplateArgs.size(),
+                                    ConvertedTemplateArgs.getFlatArgumentList(),
+                                                ConvertedTemplateArgs.flatSize(),
                                                 0);
 
     ClassTemplate->getSpecializations().InsertNode(Specialization, 





More information about the cfe-commits mailing list