DeclTemplate.cpp revision cc636688c4fd10b1732ce3e33b2b106024d545ca
1aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===--- DeclCXX.cpp - C++ Declaration AST Node Implementation ------------===//
2aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//
3aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//                     The LLVM Compiler Infrastructure
4aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//
5aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// This file is distributed under the University of Illinois Open Source
6aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// License. See LICENSE.TXT for details.
7aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//
8aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
9aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//
10aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// This file implements the C++ related Decl classes for templates.
11aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//
12aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
13aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
14aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclCXX.h"
15aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h"
1655f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor#include "clang/AST/Expr.h"
17aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/ASTContext.h"
18aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/Basic/IdentifierTable.h"
19aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "llvm/ADT/STLExtras.h"
20aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregorusing namespace clang;
21aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
22aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
23aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateParameterList Implementation
24aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
25aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
26ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas GregorTemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc,
27ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                             SourceLocation LAngleLoc,
28ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                             Decl **Params, unsigned NumParams,
29ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                             SourceLocation RAngleLoc)
30ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor  : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc),
31ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor    NumParams(NumParams) {
32aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  for (unsigned Idx = 0; Idx < NumParams; ++Idx)
33aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor    begin()[Idx] = Params[Idx];
34aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
35aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
36aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateParameterList *
37ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas GregorTemplateParameterList::Create(ASTContext &C, SourceLocation TemplateLoc,
38ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                              SourceLocation LAngleLoc, Decl **Params,
39ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                              unsigned NumParams, SourceLocation RAngleLoc) {
40aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  unsigned Size = sizeof(TemplateParameterList) + sizeof(Decl *) * NumParams;
41aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  unsigned Align = llvm::AlignOf<TemplateParameterList>::Alignment;
42aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  void *Mem = C.Allocate(Size, Align);
43ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor  return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params,
44ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                         NumParams, RAngleLoc);
45aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
46aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
4762cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregorunsigned TemplateParameterList::getMinRequiredArguments() const {
4862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  unsigned NumRequiredArgs = size();
4962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  iterator Param = const_cast<TemplateParameterList *>(this)->end(),
5062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor      ParamBegin = const_cast<TemplateParameterList *>(this)->begin();
5162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  while (Param != ParamBegin) {
5262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor    --Param;
5362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor    if (!(isa<TemplateTypeParmDecl>(*Param) &&
5462cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor          cast<TemplateTypeParmDecl>(*Param)->hasDefaultArgument()) &&
5562cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor        !(isa<NonTypeTemplateParmDecl>(*Param) &&
5662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor          cast<NonTypeTemplateParmDecl>(*Param)->hasDefaultArgument()) &&
5762cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor        !(isa<TemplateTemplateParmDecl>(*Param) &&
5862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor          cast<TemplateTemplateParmDecl>(*Param)->hasDefaultArgument()))
5962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor      break;
6062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor
6162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor    --NumRequiredArgs;
6262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  }
6362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor
6462cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  return NumRequiredArgs;
6562cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor}
6662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor
67aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
68aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateDecl Implementation
69aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
70aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
71aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateDecl::~TemplateDecl() {
72aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
73aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
74aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
75aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation
76aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
77aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
78aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C,
79aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclContext *DC,
80aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   SourceLocation L,
81aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclarationName Name,
82aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   TemplateParameterList *Params,
83aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   NamedDecl *Decl) {
84aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl);
85aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
86aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
87aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
88aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation
89aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
90aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
91aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C,
92aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             DeclContext *DC,
93aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             SourceLocation L,
94aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             DeclarationName Name,
95aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             TemplateParameterList *Params,
96aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             NamedDecl *Decl) {
97aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) ClassTemplateDecl(DC, L, Name, Params, Decl);
98aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
99aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
100aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
101aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations
102aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
103aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
104aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl *
105aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl::Create(ASTContext &C, DeclContext *DC,
106aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                             SourceLocation L, unsigned D, unsigned P,
107aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                             IdentifierInfo *Id, bool Typename) {
108fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  QualType Type = C.getTemplateTypeParmType(D, P, Id);
109fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  return new (C) TemplateTypeParmDecl(DC, L, Id, Typename, Type);
110aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
111aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
112aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
113aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations
114aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
115aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
116aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl *
117aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl::Create(ASTContext &C, DeclContext *DC,
118aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                SourceLocation L, unsigned D, unsigned P,
119aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                IdentifierInfo *Id, QualType T,
120aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                SourceLocation TypeSpecStartLoc) {
121aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) NonTypeTemplateParmDecl(DC, L, D, P, Id, T,
122aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                         TypeSpecStartLoc);
123aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
124aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
125d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
126d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor  return DefaultArgument? DefaultArgument->getSourceRange().getBegin()
127d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor                        : SourceLocation();
128d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor}
129d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor
130aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
131aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations
132aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
133aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
134aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl *
135aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl::Create(ASTContext &C, DeclContext *DC,
136aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 SourceLocation L, unsigned D, unsigned P,
137aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 IdentifierInfo *Id,
138aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 TemplateParameterList *Params) {
139aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) TemplateTemplateParmDecl(DC, L, D, P, Id, Params);
140aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
141aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
142d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation TemplateTemplateParmDecl::getDefaultArgumentLoc() const {
143d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor  return DefaultArgument? DefaultArgument->getSourceRange().getBegin()
144d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor                        : SourceLocation();
145d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor}
1463e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor
1473e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
1483e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation
1493e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
1503e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::
1513e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl(DeclContext *DC, SourceLocation L,
1523e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                ClassTemplateDecl *SpecializedTemplate,
1533e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                TemplateArgument *TemplateArgs,
1543e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                unsigned NumTemplateArgs)
1553e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor  : CXXRecordDecl(ClassTemplateSpecialization,
1563e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                  SpecializedTemplate->getTemplatedDecl()->getTagKind(),
1573e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                  DC, L,
1583e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                  // FIXME: Should we use DeclarationName for the name of
1593e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                  // class template specializations?
1603e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                  SpecializedTemplate->getIdentifier()),
1613e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor    SpecializedTemplate(SpecializedTemplate),
162cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor    NumTemplateArgs(NumTemplateArgs), SpecializationKind(TSK_Undeclared) {
1633e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor  TemplateArgument *Arg = reinterpret_cast<TemplateArgument *>(this + 1);
1643e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor  for (unsigned ArgIdx = 0; ArgIdx < NumTemplateArgs; ++ArgIdx, ++Arg)
1653e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor    *Arg = TemplateArgs[ArgIdx];
1663e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
1673e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor
1683e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl *
1693e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context,
1703e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        DeclContext *DC, SourceLocation L,
1713e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        ClassTemplateDecl *SpecializedTemplate,
1723e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        TemplateArgument *TemplateArgs,
173cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor                                        unsigned NumTemplateArgs,
174cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor                                   ClassTemplateSpecializationDecl *PrevDecl) {
1753e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor  unsigned Size = sizeof(ClassTemplateSpecializationDecl) +
1763e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                  sizeof(TemplateArgument) * NumTemplateArgs;
1773e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor  unsigned Align = llvm::AlignOf<ClassTemplateSpecializationDecl>::Alignment;
1783e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor  void *Mem = Context.Allocate(Size, Align);
179cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  ClassTemplateSpecializationDecl *Result
180cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor    = new (Mem) ClassTemplateSpecializationDecl(DC, L, SpecializedTemplate,
181cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor                                                TemplateArgs, NumTemplateArgs);
182cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  // FIXME: Do we want a prettier type here?
183cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  Context.getTypeDeclType(Result, PrevDecl);
184cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  return Result;
1853e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
186