blob: f341b45fb9714484b814334c9b8ff6beaf359acd [file] [log] [blame]
John McCall275c10a2009-10-29 07:48:15 +00001//===--- 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"
Douglas Gregor74295b32009-11-23 12:52:47 +000018#include "clang/AST/DeclTemplate.h"
John McCall275c10a2009-10-29 07:48:15 +000019#include "clang/AST/Expr.h"
John McCall833ca992009-10-29 08:12:44 +000020#include "clang/AST/TypeLoc.h"
John McCall275c10a2009-10-29 07:48:15 +000021
22using namespace clang;
23
24//===----------------------------------------------------------------------===//
25// TemplateArgument Implementation
26//===----------------------------------------------------------------------===//
27
John McCall275c10a2009-10-29 07:48:15 +000028/// \brief Construct a template argument pack.
29void TemplateArgument::setArgumentPack(TemplateArgument *args, unsigned NumArgs,
30 bool CopyArgs) {
31 assert(isNull() && "Must call setArgumentPack on a null argument");
32
33 Kind = Pack;
34 Args.NumArgs = NumArgs;
35 Args.CopyArgs = CopyArgs;
36 if (!Args.CopyArgs) {
37 Args.Args = args;
38 return;
39 }
40
41 // FIXME: Allocate in ASTContext
42 Args.Args = new TemplateArgument[NumArgs];
43 for (unsigned I = 0; I != Args.NumArgs; ++I)
44 Args.Args[I] = args[I];
45}
46
47void TemplateArgument::Profile(llvm::FoldingSetNodeID &ID,
48 ASTContext &Context) const {
49 ID.AddInteger(Kind);
50 switch (Kind) {
51 case Null:
52 break;
53
54 case Type:
55 getAsType().Profile(ID);
56 break;
57
58 case Declaration:
59 ID.AddPointer(getAsDecl()? getAsDecl()->getCanonicalDecl() : 0);
60 break;
61
Douglas Gregor788cd062009-11-11 01:00:40 +000062 case Template:
Douglas Gregor74295b32009-11-23 12:52:47 +000063 if (TemplateTemplateParmDecl *TTP
64 = dyn_cast_or_null<TemplateTemplateParmDecl>(
65 getAsTemplate().getAsTemplateDecl())) {
66 ID.AddBoolean(true);
67 ID.AddInteger(TTP->getDepth());
68 ID.AddInteger(TTP->getPosition());
69 } else {
70 ID.AddBoolean(false);
71 ID.AddPointer(Context.getCanonicalTemplateName(getAsTemplate())
72 .getAsVoidPointer());
73 }
Douglas Gregor788cd062009-11-11 01:00:40 +000074 break;
75
John McCall275c10a2009-10-29 07:48:15 +000076 case Integral:
77 getAsIntegral()->Profile(ID);
78 getIntegralType().Profile(ID);
79 break;
80
81 case Expression:
82 getAsExpr()->Profile(ID, Context, true);
83 break;
84
85 case Pack:
86 ID.AddInteger(Args.NumArgs);
87 for (unsigned I = 0; I != Args.NumArgs; ++I)
88 Args.Args[I].Profile(ID, Context);
89 }
90}
John McCall833ca992009-10-29 08:12:44 +000091
92//===----------------------------------------------------------------------===//
93// TemplateArgumentLoc Implementation
94//===----------------------------------------------------------------------===//
95
John McCall828bff22009-10-29 18:45:58 +000096SourceRange TemplateArgumentLoc::getSourceRange() const {
John McCall833ca992009-10-29 08:12:44 +000097 switch (Argument.getKind()) {
98 case TemplateArgument::Expression:
John McCall828bff22009-10-29 18:45:58 +000099 return getSourceExpression()->getSourceRange();
Douglas Gregor788cd062009-11-11 01:00:40 +0000100
John McCall833ca992009-10-29 08:12:44 +0000101 case TemplateArgument::Declaration:
John McCall828bff22009-10-29 18:45:58 +0000102 return getSourceDeclExpression()->getSourceRange();
Douglas Gregor788cd062009-11-11 01:00:40 +0000103
John McCall828bff22009-10-29 18:45:58 +0000104 case TemplateArgument::Type:
105 return getSourceDeclaratorInfo()->getTypeLoc().getFullSourceRange();
Douglas Gregor788cd062009-11-11 01:00:40 +0000106
107 case TemplateArgument::Template:
108 if (getTemplateQualifierRange().isValid())
109 return SourceRange(getTemplateQualifierRange().getBegin(),
110 getTemplateNameLoc());
111 return SourceRange(getTemplateNameLoc());
112
John McCall833ca992009-10-29 08:12:44 +0000113 case TemplateArgument::Integral:
114 case TemplateArgument::Pack:
115 case TemplateArgument::Null:
John McCall828bff22009-10-29 18:45:58 +0000116 return SourceRange();
John McCall833ca992009-10-29 08:12:44 +0000117 }
118
119 // Silence bonus gcc warning.
John McCall828bff22009-10-29 18:45:58 +0000120 return SourceRange();
John McCall833ca992009-10-29 08:12:44 +0000121}