diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-03-09 23:48:35 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-03-09 23:48:35 +0000 |
commit | 40808ce6ac04b102c3b56244a635d6b98eed6d97 (patch) | |
tree | 92301d6219bc011b5ef02707aa8251e30d3f0db0 /lib/AST/ASTContext.cpp | |
parent | e15b486ada22517bd976768cabf80213cef44347 (diff) |
Implement template instantiation for ClassTemplateSpecializationTypes,
such as replacing 'T' in vector<T>. There are a few aspects to this:
- Extend TemplateArgument to allow arbitrary expressions (an
Expr*), and switch ClassTemplateSpecializationType to store
TemplateArguments rather than it's own type-or-expression
representation.
- ClassTemplateSpecializationType can now store dependent types. In
that case, the canonical type is another
ClassTemplateSpecializationType (with default template arguments
expanded) rather than a declaration (we don't build Decls for
dependent types).
- Split ActOnClassTemplateId into ActOnClassTemplateId (called from
the parser) and CheckClassTemplateId (called from
ActOnClassTemplateId and InstantiateType). They're smart enough to
handle dependent types, now.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66509 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/ASTContext.cpp')
-rw-r--r-- | lib/AST/ASTContext.cpp | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 4579fb5a60..a51f432880 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -1309,14 +1309,15 @@ QualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index, QualType ASTContext::getClassTemplateSpecializationType(TemplateDecl *Template, + const TemplateArgument *Args, unsigned NumArgs, - uintptr_t *Args, bool *ArgIsType, QualType Canon) { - Canon = getCanonicalType(Canon); + if (!Canon.isNull()) + Canon = getCanonicalType(Canon); llvm::FoldingSetNodeID ID; - ClassTemplateSpecializationType::Profile(ID, Template, NumArgs, Args, - ArgIsType); + ClassTemplateSpecializationType::Profile(ID, Template, Args, NumArgs); + void *InsertPos = 0; ClassTemplateSpecializationType *Spec = ClassTemplateSpecializationTypes.FindNodeOrInsertPos(ID, InsertPos); @@ -1324,13 +1325,11 @@ ASTContext::getClassTemplateSpecializationType(TemplateDecl *Template, if (Spec) return QualType(Spec, 0); - void *Mem = Allocate(sizeof(ClassTemplateSpecializationType) + - (sizeof(uintptr_t) * - (ClassTemplateSpecializationType:: - getNumPackedWords(NumArgs) + - NumArgs)), 8); - Spec = new (Mem) ClassTemplateSpecializationType(Template, NumArgs, Args, - ArgIsType, Canon); + void *Mem = Allocate((sizeof(ClassTemplateSpecializationType) + + sizeof(TemplateArgument) * NumArgs), + 8); + Spec = new (Mem) ClassTemplateSpecializationType(Template, Args, NumArgs, + Canon); Types.push_back(Spec); ClassTemplateSpecializationTypes.InsertNode(Spec, InsertPos); |