1 //===--- TemplateBase.cpp - Common template AST class implementation ------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements common classes used throughout C++ template
13 //===----------------------------------------------------------------------===//
15 #include "llvm/ADT/FoldingSet.h"
16 #include "clang/AST/TemplateBase.h"
17 #include "clang/AST/DeclBase.h"
18 #include "clang/AST/Expr.h"
19 #include "clang/AST/TypeLoc.h"
21 using namespace clang;
23 //===----------------------------------------------------------------------===//
24 // TemplateArgument Implementation
25 //===----------------------------------------------------------------------===//
27 /// \brief Construct a template argument pack.
28 void TemplateArgument::setArgumentPack(TemplateArgument *args, unsigned NumArgs,
30 assert(isNull() && "Must call setArgumentPack on a null argument");
33 Args.NumArgs = NumArgs;
34 Args.CopyArgs = CopyArgs;
40 // FIXME: Allocate in ASTContext
41 Args.Args = new TemplateArgument[NumArgs];
42 for (unsigned I = 0; I != Args.NumArgs; ++I)
43 Args.Args[I] = args[I];
46 void TemplateArgument::Profile(llvm::FoldingSetNodeID &ID,
47 ASTContext &Context) const {
54 getAsType().Profile(ID);
58 ID.AddPointer(getAsDecl()? getAsDecl()->getCanonicalDecl() : 0);
62 ID.AddPointer(Context.getCanonicalTemplateName(getAsTemplate())
67 getAsIntegral()->Profile(ID);
68 getIntegralType().Profile(ID);
72 getAsExpr()->Profile(ID, Context, true);
76 ID.AddInteger(Args.NumArgs);
77 for (unsigned I = 0; I != Args.NumArgs; ++I)
78 Args.Args[I].Profile(ID, Context);
82 //===----------------------------------------------------------------------===//
83 // TemplateArgumentLoc Implementation
84 //===----------------------------------------------------------------------===//
86 SourceRange TemplateArgumentLoc::getSourceRange() const {
87 switch (Argument.getKind()) {
88 case TemplateArgument::Expression:
89 return getSourceExpression()->getSourceRange();
91 case TemplateArgument::Declaration:
92 return getSourceDeclExpression()->getSourceRange();
94 case TemplateArgument::Type:
95 return getSourceDeclaratorInfo()->getTypeLoc().getFullSourceRange();
97 case TemplateArgument::Template:
98 if (getTemplateQualifierRange().isValid())
99 return SourceRange(getTemplateQualifierRange().getBegin(),
100 getTemplateNameLoc());
101 return SourceRange(getTemplateNameLoc());
103 case TemplateArgument::Integral:
104 case TemplateArgument::Pack:
105 case TemplateArgument::Null:
106 return SourceRange();
109 // Silence bonus gcc warning.
110 return SourceRange();