[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