summaryrefslogtreecommitdiffstats
path: root/clang/include
diff options
context:
space:
mode:
Diffstat (limited to 'clang/include')
-rw-r--r--clang/include/clang/AST/DeclTemplate.h23
-rw-r--r--clang/include/clang/AST/Type.h13
2 files changed, 21 insertions, 15 deletions
diff --git a/clang/include/clang/AST/DeclTemplate.h b/clang/include/clang/AST/DeclTemplate.h
index 86016209313..17c8bc877d0 100644
--- a/clang/include/clang/AST/DeclTemplate.h
+++ b/clang/include/clang/AST/DeclTemplate.h
@@ -315,7 +315,7 @@ public:
void setArgumentPack(TemplateArgument *Args, unsigned NumArgs, bool CopyArgs);
/// \brief Used to insert TemplateArguments into FoldingSets.
- void Profile(llvm::FoldingSetNodeID &ID) const {
+ void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context) const {
ID.AddInteger(Kind);
switch (Kind) {
case Null:
@@ -326,7 +326,7 @@ public:
break;
case Declaration:
- ID.AddPointer(getAsDecl()); // FIXME: Must be canonical!
+ ID.AddPointer(getAsDecl()? getAsDecl()->getCanonicalDecl() : 0);
break;
case Integral:
@@ -335,14 +335,13 @@ public:
break;
case Expression:
- // FIXME: We need a canonical representation of expressions.
- ID.AddPointer(getAsExpr());
+ getAsExpr()->Profile(ID, Context, true);
break;
case Pack:
ID.AddInteger(Args.NumArgs);
for (unsigned I = 0; I != Args.NumArgs; ++I)
- Args.Args[I].Profile(ID);
+ Args.Args[I].Profile(ID, Context);
}
}
};
@@ -534,15 +533,16 @@ public:
void Profile(llvm::FoldingSetNodeID &ID) {
Profile(ID, TemplateArguments->getFlatArgumentList(),
- TemplateArguments->flat_size());
+ TemplateArguments->flat_size(),
+ Function->getASTContext());
}
static void
Profile(llvm::FoldingSetNodeID &ID, const TemplateArgument *TemplateArgs,
- unsigned NumTemplateArgs) {
+ unsigned NumTemplateArgs, ASTContext &Context) {
ID.AddInteger(NumTemplateArgs);
for (unsigned Arg = 0; Arg != NumTemplateArgs; ++Arg)
- TemplateArgs[Arg].Profile(ID);
+ TemplateArgs[Arg].Profile(ID, Context);
}
};
@@ -918,15 +918,16 @@ public:
}
void Profile(llvm::FoldingSetNodeID &ID) const {
- Profile(ID, TemplateArgs.getFlatArgumentList(), TemplateArgs.flat_size());
+ Profile(ID, TemplateArgs.getFlatArgumentList(), TemplateArgs.flat_size(),
+ getASTContext());
}
static void
Profile(llvm::FoldingSetNodeID &ID, const TemplateArgument *TemplateArgs,
- unsigned NumTemplateArgs) {
+ unsigned NumTemplateArgs, ASTContext &Context) {
ID.AddInteger(NumTemplateArgs);
for (unsigned Arg = 0; Arg != NumTemplateArgs; ++Arg)
- TemplateArgs[Arg].Profile(ID);
+ TemplateArgs[Arg].Profile(ID, Context);
}
static bool classof(const Decl *D) {
diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h
index be018026e36..66d23f3eb56 100644
--- a/clang/include/clang/AST/Type.h
+++ b/clang/include/clang/AST/Type.h
@@ -1782,14 +1782,18 @@ public:
class TemplateSpecializationType
: public Type, public llvm::FoldingSetNode {
- /// \brief The name of the template being specialized.
+ // FIXME: Currently needed for profiling expressions; can we avoid this?
+ ASTContext &Context;
+
+ /// \brief The name of the template being specialized.
TemplateName Template;
/// \brief - The number of template arguments named in this class
/// template specialization.
unsigned NumArgs;
- TemplateSpecializationType(TemplateName T,
+ TemplateSpecializationType(ASTContext &Context,
+ TemplateName T,
const TemplateArgument *Args,
unsigned NumArgs, QualType Canon);
@@ -1833,11 +1837,12 @@ public:
const PrintingPolicy &Policy) const;
void Profile(llvm::FoldingSetNodeID &ID) {
- Profile(ID, Template, getArgs(), NumArgs);
+ Profile(ID, Template, getArgs(), NumArgs, Context);
}
static void Profile(llvm::FoldingSetNodeID &ID, TemplateName T,
- const TemplateArgument *Args, unsigned NumArgs);
+ const TemplateArgument *Args, unsigned NumArgs,
+ ASTContext &Context);
static bool classof(const Type *T) {
return T->getTypeClass() == TemplateSpecialization;
OpenPOWER on IntegriCloud