TemplateBase.cpp revision 63c8e75e3df30caab2d7251514a0d7ddc9cb39a2
1//===--- TemplateBase.cpp - Common template AST class implementation ------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements common classes used throughout C++ template 11// representations. 12// 13//===----------------------------------------------------------------------===// 14 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" 20 21using namespace clang; 22 23//===----------------------------------------------------------------------===// 24// TemplateArgument Implementation 25//===----------------------------------------------------------------------===// 26 27/// \brief Construct a template argument pack. 28void TemplateArgument::setArgumentPack(TemplateArgument *args, unsigned NumArgs, 29 bool CopyArgs) { 30 assert(isNull() && "Must call setArgumentPack on a null argument"); 31 32 Kind = Pack; 33 Args.NumArgs = NumArgs; 34 Args.CopyArgs = CopyArgs; 35 if (!Args.CopyArgs) { 36 Args.Args = args; 37 return; 38 } 39 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]; 44} 45 46void TemplateArgument::Profile(llvm::FoldingSetNodeID &ID, 47 ASTContext &Context) const { 48 ID.AddInteger(Kind); 49 switch (Kind) { 50 case Null: 51 break; 52 53 case Type: 54 getAsType().Profile(ID); 55 break; 56 57 case Declaration: 58 ID.AddPointer(getAsDecl()? getAsDecl()->getCanonicalDecl() : 0); 59 break; 60 61 case Template: 62 ID.AddPointer(getAsTemplate().getAsVoidPointer()); 63 break; 64 65 case Integral: 66 getAsIntegral()->Profile(ID); 67 getIntegralType().Profile(ID); 68 break; 69 70 case Expression: 71 getAsExpr()->Profile(ID, Context, true); 72 break; 73 74 case Pack: 75 ID.AddInteger(Args.NumArgs); 76 for (unsigned I = 0; I != Args.NumArgs; ++I) 77 Args.Args[I].Profile(ID, Context); 78 } 79} 80 81//===----------------------------------------------------------------------===// 82// TemplateArgumentLoc Implementation 83//===----------------------------------------------------------------------===// 84 85SourceRange TemplateArgumentLoc::getSourceRange() const { 86 switch (Argument.getKind()) { 87 case TemplateArgument::Expression: 88 return getSourceExpression()->getSourceRange(); 89 90 case TemplateArgument::Declaration: 91 return getSourceDeclExpression()->getSourceRange(); 92 93 case TemplateArgument::Type: 94 return getSourceDeclaratorInfo()->getTypeLoc().getFullSourceRange(); 95 96 case TemplateArgument::Template: 97 if (getTemplateQualifierRange().isValid()) 98 return SourceRange(getTemplateQualifierRange().getBegin(), 99 getTemplateNameLoc()); 100 return SourceRange(getTemplateNameLoc()); 101 102 case TemplateArgument::Integral: 103 case TemplateArgument::Pack: 104 case TemplateArgument::Null: 105 return SourceRange(); 106 } 107 108 // Silence bonus gcc warning. 109 return SourceRange(); 110} 111