diff options
author | John McCall <rjmccall@apple.com> | 2010-06-13 09:25:03 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-06-13 09:25:03 +0000 |
commit | 71d74bc0d6e522ce7c21a599db8e19d3883b518f (patch) | |
tree | 978c8f08117b5aca9275131bebf154738a418211 | |
parent | e6563256a4b3b9fee70ce3335d28406607c1faaf (diff) |
TemplateSpecializationType's isCurrentInstantiation bit can be derived
from its canonical type.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@105912 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/ASTContext.h | 6 | ||||
-rw-r--r-- | include/clang/AST/Type.h | 10 | ||||
-rw-r--r-- | lib/AST/ASTContext.cpp | 17 | ||||
-rw-r--r-- | lib/AST/Type.cpp | 4 | ||||
-rw-r--r-- | lib/Sema/SemaTemplate.cpp | 5 |
5 files changed, 10 insertions, 32 deletions
diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h index b69d27613e..9d0469368f 100644 --- a/include/clang/AST/ASTContext.h +++ b/include/clang/AST/ASTContext.h @@ -606,13 +606,11 @@ public: QualType getTemplateSpecializationType(TemplateName T, const TemplateArgument *Args, unsigned NumArgs, - QualType Canon = QualType(), - bool IsCurrentInstantiation = false); + QualType Canon = QualType()); QualType getTemplateSpecializationType(TemplateName T, const TemplateArgumentListInfo &Args, - QualType Canon = QualType(), - bool IsCurrentInstantiation = false); + QualType Canon = QualType()); TypeSourceInfo * getTemplateSpecializationTypeInfo(TemplateName T, SourceLocation TLoc, diff --git a/include/clang/AST/Type.h b/include/clang/AST/Type.h index c6d3f996ed..7fa747b62e 100644 --- a/include/clang/AST/Type.h +++ b/include/clang/AST/Type.h @@ -2419,10 +2419,6 @@ public: /// dependent. class TemplateSpecializationType : public Type, public llvm::FoldingSetNode { - - // The bool is whether this is a current instantiation. - bool IsCurrentInstantiation; - /// \brief The name of the template being specialized. TemplateName Template; @@ -2431,7 +2427,6 @@ class TemplateSpecializationType unsigned NumArgs; TemplateSpecializationType(TemplateName T, - bool IsCurrentInstantiation, const TemplateArgument *Args, unsigned NumArgs, QualType Canon); @@ -2466,7 +2461,7 @@ public: /// True if this template specialization type matches a current /// instantiation in the context in which it is found. bool isCurrentInstantiation() const { - return IsCurrentInstantiation; + return isa<InjectedClassNameType>(getCanonicalTypeInternal()); } typedef const TemplateArgument * iterator; @@ -2495,11 +2490,10 @@ public: QualType desugar() const { return getCanonicalTypeInternal(); } void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Ctx) { - Profile(ID, Template, isCurrentInstantiation(), getArgs(), NumArgs, Ctx); + Profile(ID, Template, getArgs(), NumArgs, Ctx); } static void Profile(llvm::FoldingSetNodeID &ID, TemplateName T, - bool IsCurrentInstantiation, const TemplateArgument *Args, unsigned NumArgs, ASTContext &Context); diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 065ebe9f9a..bb27ab9747 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -1778,8 +1778,7 @@ ASTContext::getTemplateSpecializationTypeInfo(TemplateName Name, QualType ASTContext::getTemplateSpecializationType(TemplateName Template, const TemplateArgumentListInfo &Args, - QualType Canon, - bool IsCurrentInstantiation) { + QualType Canon) { unsigned NumArgs = Args.size(); llvm::SmallVector<TemplateArgument, 4> ArgVec; @@ -1788,22 +1787,17 @@ ASTContext::getTemplateSpecializationType(TemplateName Template, ArgVec.push_back(Args[i].getArgument()); return getTemplateSpecializationType(Template, ArgVec.data(), NumArgs, - Canon, IsCurrentInstantiation); + Canon); } QualType ASTContext::getTemplateSpecializationType(TemplateName Template, const TemplateArgument *Args, unsigned NumArgs, - QualType Canon, - bool IsCurrentInstantiation) { + QualType Canon) { if (!Canon.isNull()) Canon = getCanonicalType(Canon); else { - assert(!IsCurrentInstantiation && - "current-instantiation specializations should always " - "have a canonical type"); - // Build the canonical template specialization type. TemplateName CanonTemplate = getCanonicalTemplateName(Template); llvm::SmallVector<TemplateArgument, 4> CanonArgs; @@ -1814,7 +1808,7 @@ ASTContext::getTemplateSpecializationType(TemplateName Template, // Determine whether this canonical template specialization type already // exists. llvm::FoldingSetNodeID ID; - TemplateSpecializationType::Profile(ID, CanonTemplate, false, + TemplateSpecializationType::Profile(ID, CanonTemplate, CanonArgs.data(), NumArgs, *this); void *InsertPos = 0; @@ -1826,7 +1820,7 @@ ASTContext::getTemplateSpecializationType(TemplateName Template, void *Mem = Allocate((sizeof(TemplateSpecializationType) + sizeof(TemplateArgument) * NumArgs), TypeAlignment); - Spec = new (Mem) TemplateSpecializationType(CanonTemplate, false, + Spec = new (Mem) TemplateSpecializationType(CanonTemplate, CanonArgs.data(), NumArgs, Canon); Types.push_back(Spec); @@ -1847,7 +1841,6 @@ ASTContext::getTemplateSpecializationType(TemplateName Template, TypeAlignment); TemplateSpecializationType *Spec = new (Mem) TemplateSpecializationType(Template, - IsCurrentInstantiation, Args, NumArgs, Canon); diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index 7a699b0015..1d91e76c8f 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -1131,13 +1131,11 @@ anyDependentTemplateArguments(const TemplateArgument *Args, unsigned N) { TemplateSpecializationType:: TemplateSpecializationType(TemplateName T, - bool IsCurrentInstantiation, const TemplateArgument *Args, unsigned NumArgs, QualType Canon) : Type(TemplateSpecialization, Canon.isNull()? QualType(this, 0) : Canon, T.isDependent() || anyDependentTemplateArguments(Args, NumArgs)), - IsCurrentInstantiation(IsCurrentInstantiation), Template(T), NumArgs(NumArgs) { assert((!Canon.isNull() || T.isDependent() || anyDependentTemplateArguments(Args, NumArgs)) && @@ -1161,11 +1159,9 @@ void TemplateSpecializationType::Destroy(ASTContext& C) { void TemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID, TemplateName T, - bool IsCurrentInstantiation, const TemplateArgument *Args, unsigned NumArgs, ASTContext &Context) { - ID.AddBoolean(IsCurrentInstantiation); T.Profile(ID); for (unsigned Idx = 0; Idx < NumArgs; ++Idx) Args[Idx].Profile(ID, Context); diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index 6be74a0897..0c75cda57e 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -1448,7 +1448,6 @@ QualType Sema::CheckTemplateIdType(TemplateName Name, "Converted template argument list is too short!"); QualType CanonType; - bool IsCurrentInstantiation = false; if (Name.isDependent() || TemplateSpecializationType::anyDependentTemplateArguments( @@ -1505,7 +1504,6 @@ QualType Sema::CheckTemplateIdType(TemplateName Name, // class name type of the record we just found. assert(ICNT.isCanonical()); CanonType = ICNT; - IsCurrentInstantiation = true; break; } } @@ -1543,8 +1541,7 @@ QualType Sema::CheckTemplateIdType(TemplateName Name, // Build the fully-sugared type for this class template // specialization, which refers back to the class template // specialization we created or found. - return Context.getTemplateSpecializationType(Name, TemplateArgs, CanonType, - IsCurrentInstantiation); + return Context.getTemplateSpecializationType(Name, TemplateArgs, CanonType); } Action::TypeResult |