aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/AST/DeclTemplate.h8
-rw-r--r--lib/AST/DeclTemplate.cpp13
-rw-r--r--lib/Sema/SemaTemplate.cpp6
-rw-r--r--lib/Sema/SemaTemplateDeduction.cpp2
4 files changed, 22 insertions, 7 deletions
diff --git a/include/clang/AST/DeclTemplate.h b/include/clang/AST/DeclTemplate.h
index 3028c4d317..d1899006cc 100644
--- a/include/clang/AST/DeclTemplate.h
+++ b/include/clang/AST/DeclTemplate.h
@@ -577,14 +577,16 @@ public:
class TemplateArgumentListBuilder {
llvm::SmallVector<TemplateArgument, 16> Args;
+ ASTContext &Context;
public:
+ TemplateArgumentListBuilder(ASTContext &Context) : Context(Context) { }
+
// FIXME: Should use the index array size.
size_t size() const { return Args.size(); }
-
size_t flatSize() const { return Args.size(); }
-
+
+ void push_back(const TemplateArgument& Arg);
TemplateArgument *getFlatArgumentList() { return Args.data(); }
- void push_back(const TemplateArgument& Arg) { Args.push_back(Arg); }
};
/// \brief A template argument list.
diff --git a/lib/AST/DeclTemplate.cpp b/lib/AST/DeclTemplate.cpp
index fbaaf4de7f..11b9275e34 100644
--- a/lib/AST/DeclTemplate.cpp
+++ b/lib/AST/DeclTemplate.cpp
@@ -236,6 +236,19 @@ TemplateArgument::TemplateArgument(Expr *E) : Kind(Expression) {
}
//===----------------------------------------------------------------------===//
+// TemplateArgumentListBuilder Implementation
+//===----------------------------------------------------------------------===//
+void TemplateArgumentListBuilder::push_back(const TemplateArgument& Arg) {
+ switch (Arg.getKind()) {
+ case TemplateArgument::Type:
+ assert(Arg.getAsType()->isCanonical() && "Type must be canonical!");
+ break;
+ }
+
+ Args.push_back(Arg);
+}
+
+//===----------------------------------------------------------------------===//
// TemplateArgumentList Implementation
//===----------------------------------------------------------------------===//
TemplateArgumentList::TemplateArgumentList(ASTContext &Context,
diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp
index 660f54ca78..f9176ca470 100644
--- a/lib/Sema/SemaTemplate.cpp
+++ b/lib/Sema/SemaTemplate.cpp
@@ -811,7 +811,7 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
// Check that the template argument list is well-formed for this
// template.
- TemplateArgumentListBuilder ConvertedTemplateArgs;
+ TemplateArgumentListBuilder ConvertedTemplateArgs(Context);
if (CheckTemplateArgumentList(Template, TemplateLoc, LAngleLoc,
TemplateArgs, NumTemplateArgs, RAngleLoc,
ConvertedTemplateArgs))
@@ -2064,7 +2064,7 @@ Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec, TagKind TK,
// Check that the template argument list is well-formed for this
// template.
- TemplateArgumentListBuilder ConvertedTemplateArgs;
+ TemplateArgumentListBuilder ConvertedTemplateArgs(Context);
if (CheckTemplateArgumentList(ClassTemplate, TemplateNameLoc, LAngleLoc,
&TemplateArgs[0], TemplateArgs.size(),
RAngleLoc, ConvertedTemplateArgs))
@@ -2268,7 +2268,7 @@ Sema::ActOnExplicitInstantiation(Scope *S, SourceLocation TemplateLoc,
// Check that the template argument list is well-formed for this
// template.
- TemplateArgumentListBuilder ConvertedTemplateArgs;
+ TemplateArgumentListBuilder ConvertedTemplateArgs(Context);
if (CheckTemplateArgumentList(ClassTemplate, TemplateNameLoc, LAngleLoc,
TemplateArgs.data(), TemplateArgs.size(),
RAngleLoc, ConvertedTemplateArgs))
diff --git a/lib/Sema/SemaTemplateDeduction.cpp b/lib/Sema/SemaTemplateDeduction.cpp
index 59793fe4c0..812b319804 100644
--- a/lib/Sema/SemaTemplateDeduction.cpp
+++ b/lib/Sema/SemaTemplateDeduction.cpp
@@ -386,7 +386,7 @@ Sema::DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial,
// FIXME: This is terrible. DeduceTemplateArguments should use a
// TemplateArgumentListBuilder directly.
- TemplateArgumentListBuilder Builder;
+ TemplateArgumentListBuilder Builder(Context);
for (unsigned I = 0, N = Deduced.size(); I != N; ++I)
Builder.push_back(Deduced[I]);