blob: 844bdd1fa0783afad77b5e6f42e55954fee0baa6 [file] [log] [blame]
Douglas Gregord7e7a512009-03-17 21:15:40 +00001//===--- SemaTemplateInstantiateDecl.cpp - C++ Template Decl Instantiation ===/
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// This file implements C++ template instantiation for declarations.
10//
11//===----------------------------------------------------------------------===/
John McCall83024632010-08-25 22:03:47 +000012#include "clang/Sema/SemaInternal.h"
Douglas Gregor28ad4b52009-05-26 20:50:29 +000013#include "clang/AST/ASTConsumer.h"
Douglas Gregord7e7a512009-03-17 21:15:40 +000014#include "clang/AST/ASTContext.h"
Richard Smithd28ac5b2014-03-22 23:33:22 +000015#include "clang/AST/ASTMutationListener.h"
Douglas Gregord7e7a512009-03-17 21:15:40 +000016#include "clang/AST/DeclTemplate.h"
17#include "clang/AST/DeclVisitor.h"
John McCallc62bb642010-03-24 05:22:00 +000018#include "clang/AST/DependentDiagnostic.h"
Douglas Gregord7e7a512009-03-17 21:15:40 +000019#include "clang/AST/Expr.h"
Douglas Gregor6131b442009-12-12 18:16:41 +000020#include "clang/AST/ExprCXX.h"
John McCall58f10c32010-03-11 09:03:00 +000021#include "clang/AST/TypeLoc.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000022#include "clang/Sema/Lookup.h"
23#include "clang/Sema/PrettyDeclStackTrace.h"
24#include "clang/Sema/Template.h"
Douglas Gregord7e7a512009-03-17 21:15:40 +000025
26using namespace clang;
27
David Majnemer192d1792013-11-27 08:20:38 +000028static bool isDeclWithinFunction(const Decl *D) {
29 const DeclContext *DC = D->getDeclContext();
30 if (DC->isFunctionOrMethod())
31 return true;
32
33 if (DC->isRecord())
34 return cast<CXXRecordDecl>(DC)->isLocalClass();
35
36 return false;
37}
38
Richard Smithcc928662014-10-17 20:37:29 +000039template<typename DeclT>
40static bool SubstQualifier(Sema &SemaRef, const DeclT *OldDecl, DeclT *NewDecl,
41 const MultiLevelTemplateArgumentList &TemplateArgs) {
Douglas Gregor14454802011-02-25 02:25:35 +000042 if (!OldDecl->getQualifierLoc())
43 return false;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +000044
Richard Smithcc928662014-10-17 20:37:29 +000045 assert((NewDecl->getFriendObjectKind() ||
46 !OldDecl->getLexicalDeclContext()->isDependentContext()) &&
47 "non-friend with qualified name defined in dependent context");
48 Sema::ContextRAII SavedContext(
49 SemaRef,
50 const_cast<DeclContext *>(NewDecl->getFriendObjectKind()
51 ? NewDecl->getLexicalDeclContext()
52 : OldDecl->getLexicalDeclContext()));
53
Douglas Gregor14454802011-02-25 02:25:35 +000054 NestedNameSpecifierLoc NewQualifierLoc
Richard Smithcc928662014-10-17 20:37:29 +000055 = SemaRef.SubstNestedNameSpecifierLoc(OldDecl->getQualifierLoc(),
56 TemplateArgs);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +000057
Douglas Gregor14454802011-02-25 02:25:35 +000058 if (!NewQualifierLoc)
John McCall3e11ebe2010-03-15 10:12:16 +000059 return true;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +000060
Douglas Gregor14454802011-02-25 02:25:35 +000061 NewDecl->setQualifierInfo(NewQualifierLoc);
John McCall3e11ebe2010-03-15 10:12:16 +000062 return false;
63}
64
Richard Smithcc928662014-10-17 20:37:29 +000065bool TemplateDeclInstantiator::SubstQualifier(const DeclaratorDecl *OldDecl,
66 DeclaratorDecl *NewDecl) {
67 return ::SubstQualifier(SemaRef, OldDecl, NewDecl, TemplateArgs);
68}
69
John McCall3e11ebe2010-03-15 10:12:16 +000070bool TemplateDeclInstantiator::SubstQualifier(const TagDecl *OldDecl,
71 TagDecl *NewDecl) {
Richard Smithcc928662014-10-17 20:37:29 +000072 return ::SubstQualifier(SemaRef, OldDecl, NewDecl, TemplateArgs);
John McCall3e11ebe2010-03-15 10:12:16 +000073}
74
DeLesley Hutchinsceec3062012-01-20 22:37:06 +000075// Include attribute instantiation code.
76#include "clang/Sema/AttrTemplateInstantiate.inc"
77
Richard Smith44c247f2013-02-22 08:32:16 +000078static void instantiateDependentAlignedAttr(
79 Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs,
80 const AlignedAttr *Aligned, Decl *New, bool IsPackExpansion) {
81 if (Aligned->isAlignmentExpr()) {
82 // The alignment expression is a constant expression.
83 EnterExpressionEvaluationContext Unevaluated(S, Sema::ConstantEvaluated);
84 ExprResult Result = S.SubstExpr(Aligned->getAlignmentExpr(), TemplateArgs);
85 if (!Result.isInvalid())
Nikola Smiljanic01a75982014-05-29 10:55:11 +000086 S.AddAlignedAttr(Aligned->getLocation(), New, Result.getAs<Expr>(),
Richard Smith44c247f2013-02-22 08:32:16 +000087 Aligned->getSpellingListIndex(), IsPackExpansion);
88 } else {
89 TypeSourceInfo *Result = S.SubstType(Aligned->getAlignmentType(),
90 TemplateArgs, Aligned->getLocation(),
91 DeclarationName());
92 if (Result)
93 S.AddAlignedAttr(Aligned->getLocation(), New, Result,
94 Aligned->getSpellingListIndex(), IsPackExpansion);
95 }
96}
97
98static void instantiateDependentAlignedAttr(
99 Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs,
100 const AlignedAttr *Aligned, Decl *New) {
101 if (!Aligned->isPackExpansion()) {
102 instantiateDependentAlignedAttr(S, TemplateArgs, Aligned, New, false);
103 return;
104 }
105
106 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
107 if (Aligned->isAlignmentExpr())
108 S.collectUnexpandedParameterPacks(Aligned->getAlignmentExpr(),
109 Unexpanded);
110 else
111 S.collectUnexpandedParameterPacks(Aligned->getAlignmentType()->getTypeLoc(),
112 Unexpanded);
113 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
114
115 // Determine whether we can expand this attribute pack yet.
116 bool Expand = true, RetainExpansion = false;
117 Optional<unsigned> NumExpansions;
118 // FIXME: Use the actual location of the ellipsis.
119 SourceLocation EllipsisLoc = Aligned->getLocation();
120 if (S.CheckParameterPacksForExpansion(EllipsisLoc, Aligned->getRange(),
121 Unexpanded, TemplateArgs, Expand,
122 RetainExpansion, NumExpansions))
123 return;
124
125 if (!Expand) {
126 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(S, -1);
127 instantiateDependentAlignedAttr(S, TemplateArgs, Aligned, New, true);
128 } else {
129 for (unsigned I = 0; I != *NumExpansions; ++I) {
130 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(S, I);
131 instantiateDependentAlignedAttr(S, TemplateArgs, Aligned, New, false);
132 }
133 }
134}
135
Hal Finkelee90a222014-09-26 05:04:30 +0000136static void instantiateDependentAssumeAlignedAttr(
137 Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs,
138 const AssumeAlignedAttr *Aligned, Decl *New) {
139 // The alignment expression is a constant expression.
140 EnterExpressionEvaluationContext Unevaluated(S, Sema::ConstantEvaluated);
141
142 Expr *E, *OE = nullptr;
143 ExprResult Result = S.SubstExpr(Aligned->getAlignment(), TemplateArgs);
144 if (Result.isInvalid())
145 return;
146 E = Result.getAs<Expr>();
147
148 if (Aligned->getOffset()) {
149 Result = S.SubstExpr(Aligned->getOffset(), TemplateArgs);
150 if (Result.isInvalid())
151 return;
152 OE = Result.getAs<Expr>();
153 }
154
155 S.AddAssumeAlignedAttr(Aligned->getLocation(), New, E, OE,
156 Aligned->getSpellingListIndex());
157}
158
Hal Finkel1b0d24e2014-10-02 21:21:25 +0000159static void instantiateDependentAlignValueAttr(
160 Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs,
161 const AlignValueAttr *Aligned, Decl *New) {
162 // The alignment expression is a constant expression.
163 EnterExpressionEvaluationContext Unevaluated(S, Sema::ConstantEvaluated);
164 ExprResult Result = S.SubstExpr(Aligned->getAlignment(), TemplateArgs);
165 if (!Result.isInvalid())
166 S.AddAlignValueAttr(Aligned->getLocation(), New, Result.getAs<Expr>(),
167 Aligned->getSpellingListIndex());
168}
169
Nick Lewycky35a6ef42014-01-11 02:50:57 +0000170static void instantiateDependentEnableIfAttr(
171 Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs,
172 const EnableIfAttr *A, const Decl *Tmpl, Decl *New) {
Craig Topperc3ec1492014-05-26 06:22:03 +0000173 Expr *Cond = nullptr;
Nick Lewycky35a6ef42014-01-11 02:50:57 +0000174 {
175 EnterExpressionEvaluationContext Unevaluated(S, Sema::Unevaluated);
176 ExprResult Result = S.SubstExpr(A->getCond(), TemplateArgs);
177 if (Result.isInvalid())
178 return;
Nikola Smiljanic01a75982014-05-29 10:55:11 +0000179 Cond = Result.getAs<Expr>();
Nick Lewycky35a6ef42014-01-11 02:50:57 +0000180 }
181 if (A->getCond()->isTypeDependent() && !Cond->isTypeDependent()) {
182 ExprResult Converted = S.PerformContextuallyConvertToBool(Cond);
183 if (Converted.isInvalid())
184 return;
Nikola Smiljanic01a75982014-05-29 10:55:11 +0000185 Cond = Converted.get();
Nick Lewycky35a6ef42014-01-11 02:50:57 +0000186 }
187
188 SmallVector<PartialDiagnosticAt, 8> Diags;
189 if (A->getCond()->isValueDependent() && !Cond->isValueDependent() &&
190 !Expr::isPotentialConstantExprUnevaluated(Cond, cast<FunctionDecl>(Tmpl),
191 Diags)) {
192 S.Diag(A->getLocation(), diag::err_enable_if_never_constant_expr);
193 for (int I = 0, N = Diags.size(); I != N; ++I)
194 S.Diag(Diags[I].first, Diags[I].second);
195 return;
196 }
197
Aaron Ballman36a53502014-01-16 13:03:14 +0000198 EnableIfAttr *EIA = new (S.getASTContext())
199 EnableIfAttr(A->getLocation(), S.getASTContext(), Cond,
200 A->getMessage(),
201 A->getSpellingListIndex());
Nick Lewycky35a6ef42014-01-11 02:50:57 +0000202 New->addAttr(EIA);
203}
204
Artem Belevich7093e402015-04-21 22:55:54 +0000205// Constructs and adds to New a new instance of CUDALaunchBoundsAttr using
206// template A as the base and arguments from TemplateArgs.
207static void instantiateDependentCUDALaunchBoundsAttr(
208 Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs,
209 const CUDALaunchBoundsAttr &Attr, Decl *New) {
210 // The alignment expression is a constant expression.
211 EnterExpressionEvaluationContext Unevaluated(S, Sema::ConstantEvaluated);
212
213 ExprResult Result = S.SubstExpr(Attr.getMaxThreads(), TemplateArgs);
214 if (Result.isInvalid())
215 return;
216 Expr *MaxThreads = Result.getAs<Expr>();
217
218 Expr *MinBlocks = nullptr;
219 if (Attr.getMinBlocks()) {
220 Result = S.SubstExpr(Attr.getMinBlocks(), TemplateArgs);
221 if (Result.isInvalid())
222 return;
223 MinBlocks = Result.getAs<Expr>();
224 }
225
226 S.AddLaunchBoundsAttr(Attr.getLocation(), New, MaxThreads, MinBlocks,
227 Attr.getSpellingListIndex());
228}
229
Denis Zobnind9e2dcd2016-02-02 13:50:39 +0000230static void
231instantiateDependentModeAttr(Sema &S,
232 const MultiLevelTemplateArgumentList &TemplateArgs,
233 const ModeAttr &Attr, Decl *New) {
234 S.AddModeAttr(Attr.getRange(), New, Attr.getMode(),
235 Attr.getSpellingListIndex(), /*InInstantiation=*/true);
236}
237
John McCall6602bb12010-08-01 02:01:53 +0000238void Sema::InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
DeLesley Hutchins30398dd2012-01-20 22:50:54 +0000239 const Decl *Tmpl, Decl *New,
240 LateInstantiatedAttrVec *LateAttrs,
241 LocalInstantiationScope *OuterMostScope) {
Aaron Ballmanb97112e2014-03-08 22:19:01 +0000242 for (const auto *TmplAttr : Tmpl->attrs()) {
Chandler Carruthf40c42f2010-06-25 03:22:07 +0000243 // FIXME: This should be generalized to more than just the AlignedAttr.
Richard Smith44c247f2013-02-22 08:32:16 +0000244 const AlignedAttr *Aligned = dyn_cast<AlignedAttr>(TmplAttr);
245 if (Aligned && Aligned->isAlignmentDependent()) {
246 instantiateDependentAlignedAttr(*this, TemplateArgs, Aligned, New);
247 continue;
Chandler Carruthf40c42f2010-06-25 03:22:07 +0000248 }
249
Hal Finkelee90a222014-09-26 05:04:30 +0000250 const AssumeAlignedAttr *AssumeAligned = dyn_cast<AssumeAlignedAttr>(TmplAttr);
251 if (AssumeAligned) {
252 instantiateDependentAssumeAlignedAttr(*this, TemplateArgs, AssumeAligned, New);
253 continue;
254 }
255
Hal Finkel1b0d24e2014-10-02 21:21:25 +0000256 const AlignValueAttr *AlignValue = dyn_cast<AlignValueAttr>(TmplAttr);
257 if (AlignValue) {
258 instantiateDependentAlignValueAttr(*this, TemplateArgs, AlignValue, New);
259 continue;
260 }
261
Nick Lewycky35a6ef42014-01-11 02:50:57 +0000262 const EnableIfAttr *EnableIf = dyn_cast<EnableIfAttr>(TmplAttr);
263 if (EnableIf && EnableIf->getCond()->isValueDependent()) {
264 instantiateDependentEnableIfAttr(*this, TemplateArgs, EnableIf, Tmpl,
265 New);
266 continue;
267 }
268
Artem Belevich7093e402015-04-21 22:55:54 +0000269 if (const CUDALaunchBoundsAttr *CUDALaunchBounds =
270 dyn_cast<CUDALaunchBoundsAttr>(TmplAttr)) {
271 instantiateDependentCUDALaunchBoundsAttr(*this, TemplateArgs,
272 *CUDALaunchBounds, New);
273 continue;
274 }
275
Denis Zobnind9e2dcd2016-02-02 13:50:39 +0000276 if (const ModeAttr *Mode = dyn_cast<ModeAttr>(TmplAttr)) {
277 instantiateDependentModeAttr(*this, TemplateArgs, *Mode, New);
278 continue;
279 }
280
Hans Wennborgc2b7f7a2014-08-24 00:12:36 +0000281 // Existing DLL attribute on the instantiation takes precedence.
282 if (TmplAttr->getKind() == attr::DLLExport ||
283 TmplAttr->getKind() == attr::DLLImport) {
284 if (New->hasAttr<DLLExportAttr>() || New->hasAttr<DLLImportAttr>()) {
285 continue;
286 }
287 }
288
Richard Smith44c247f2013-02-22 08:32:16 +0000289 assert(!TmplAttr->isPackExpansion());
DeLesley Hutchins30398dd2012-01-20 22:50:54 +0000290 if (TmplAttr->isLateParsed() && LateAttrs) {
291 // Late parsed attributes must be instantiated and attached after the
292 // enclosing class has been instantiated. See Sema::InstantiateClass.
Craig Topperc3ec1492014-05-26 06:22:03 +0000293 LocalInstantiationScope *Saved = nullptr;
DeLesley Hutchins30398dd2012-01-20 22:50:54 +0000294 if (CurrentInstantiationScope)
295 Saved = CurrentInstantiationScope->cloneScopes(OuterMostScope);
296 LateAttrs->push_back(LateInstantiatedAttribute(TmplAttr, Saved, New));
297 } else {
Richard Smithc3d2ebb2013-06-07 02:33:37 +0000298 // Allow 'this' within late-parsed attributes.
299 NamedDecl *ND = dyn_cast<NamedDecl>(New);
300 CXXRecordDecl *ThisContext =
301 dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext());
302 CXXThisScopeRAII ThisScope(*this, ThisContext, /*TypeQuals*/0,
303 ND && ND->isCXXInstanceMember());
304
Benjamin Kramerbf8da9d2012-02-06 11:13:08 +0000305 Attr *NewAttr = sema::instantiateTemplateAttribute(TmplAttr, Context,
306 *this, TemplateArgs);
Rafael Espindola7f90b7d2012-05-15 14:09:55 +0000307 if (NewAttr)
308 New->addAttr(NewAttr);
DeLesley Hutchins30398dd2012-01-20 22:50:54 +0000309 }
Anders Carlsson3d709752009-11-07 06:07:58 +0000310 }
311}
312
Richard Smith41c79d92014-10-11 00:37:16 +0000313/// Get the previous declaration of a declaration for the purposes of template
314/// instantiation. If this finds a previous declaration, then the previous
315/// declaration of the instantiation of D should be an instantiation of the
316/// result of this function.
317template<typename DeclT>
318static DeclT *getPreviousDeclForInstantiation(DeclT *D) {
319 DeclT *Result = D->getPreviousDecl();
320
321 // If the declaration is within a class, and the previous declaration was
322 // merged from a different definition of that class, then we don't have a
323 // previous declaration for the purpose of template instantiation.
324 if (Result && isa<CXXRecordDecl>(D->getDeclContext()) &&
325 D->getLexicalDeclContext() != Result->getLexicalDeclContext())
326 return nullptr;
327
328 return Result;
329}
330
Douglas Gregor8a655532009-03-25 15:45:12 +0000331Decl *
332TemplateDeclInstantiator::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
David Blaikie83d382b2011-09-23 05:06:16 +0000333 llvm_unreachable("Translation units cannot be instantiated");
Douglas Gregor8a655532009-03-25 15:45:12 +0000334}
335
336Decl *
Nico Weber66220292016-03-02 17:28:48 +0000337TemplateDeclInstantiator::VisitPragmaCommentDecl(PragmaCommentDecl *D) {
338 llvm_unreachable("pragma comment cannot be instantiated");
339}
340
341Decl *
Richard Smithf19e1272015-03-07 00:04:49 +0000342TemplateDeclInstantiator::VisitExternCContextDecl(ExternCContextDecl *D) {
343 llvm_unreachable("extern \"C\" context cannot be instantiated");
344}
345
346Decl *
Chris Lattnercab02a62011-02-17 20:34:02 +0000347TemplateDeclInstantiator::VisitLabelDecl(LabelDecl *D) {
348 LabelDecl *Inst = LabelDecl::Create(SemaRef.Context, Owner, D->getLocation(),
349 D->getIdentifier());
350 Owner->addDecl(Inst);
351 return Inst;
352}
353
354Decl *
Douglas Gregor8a655532009-03-25 15:45:12 +0000355TemplateDeclInstantiator::VisitNamespaceDecl(NamespaceDecl *D) {
David Blaikie83d382b2011-09-23 05:06:16 +0000356 llvm_unreachable("Namespaces cannot be instantiated");
Douglas Gregor8a655532009-03-25 15:45:12 +0000357}
358
John McCalld8d0d432010-02-16 06:53:13 +0000359Decl *
360TemplateDeclInstantiator::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
361 NamespaceAliasDecl *Inst
362 = NamespaceAliasDecl::Create(SemaRef.Context, Owner,
363 D->getNamespaceLoc(),
364 D->getAliasLoc(),
Douglas Gregorc05ba2e2011-02-25 17:08:07 +0000365 D->getIdentifier(),
366 D->getQualifierLoc(),
John McCalld8d0d432010-02-16 06:53:13 +0000367 D->getTargetNameLoc(),
368 D->getNamespace());
369 Owner->addDecl(Inst);
370 return Inst;
371}
372
Richard Smith3f1b5d02011-05-05 21:57:07 +0000373Decl *TemplateDeclInstantiator::InstantiateTypedefNameDecl(TypedefNameDecl *D,
374 bool IsTypeAlias) {
Douglas Gregord7e7a512009-03-17 21:15:40 +0000375 bool Invalid = false;
John McCallbcd03502009-12-07 02:54:59 +0000376 TypeSourceInfo *DI = D->getTypeSourceInfo();
Douglas Gregor678d76c2011-07-01 01:22:09 +0000377 if (DI->getType()->isInstantiationDependentType() ||
Douglas Gregor5a5073e2010-05-24 17:22:01 +0000378 DI->getType()->isVariablyModifiedType()) {
John McCall703a3f82009-10-24 08:00:42 +0000379 DI = SemaRef.SubstType(DI, TemplateArgs,
380 D->getLocation(), D->getDeclName());
381 if (!DI) {
Douglas Gregord7e7a512009-03-17 21:15:40 +0000382 Invalid = true;
John McCallbcd03502009-12-07 02:54:59 +0000383 DI = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.Context.IntTy);
Douglas Gregord7e7a512009-03-17 21:15:40 +0000384 }
Douglas Gregor5597ab42010-05-07 23:12:07 +0000385 } else {
386 SemaRef.MarkDeclarationsReferencedInType(D->getLocation(), DI->getType());
Douglas Gregord7e7a512009-03-17 21:15:40 +0000387 }
Mike Stump11289f42009-09-09 15:08:12 +0000388
Richard Smith2ddcbab2012-10-23 00:32:41 +0000389 // HACK: g++ has a bug where it gets the value kind of ?: wrong.
390 // libstdc++ relies upon this bug in its implementation of common_type.
391 // If we happen to be processing that implementation, fake up the g++ ?:
392 // semantics. See LWG issue 2141 for more information on the bug.
393 const DecltypeType *DT = DI->getType()->getAs<DecltypeType>();
394 CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D->getDeclContext());
395 if (DT && RD && isa<ConditionalOperator>(DT->getUnderlyingExpr()) &&
396 DT->isReferenceType() &&
397 RD->getEnclosingNamespaceContext() == SemaRef.getStdNamespace() &&
398 RD->getIdentifier() && RD->getIdentifier()->isStr("common_type") &&
399 D->getIdentifier() && D->getIdentifier()->isStr("type") &&
400 SemaRef.getSourceManager().isInSystemHeader(D->getLocStart()))
401 // Fold it to the (non-reference) type which g++ would have produced.
402 DI = SemaRef.Context.getTrivialTypeSourceInfo(
403 DI->getType().getNonReferenceType());
404
Douglas Gregord7e7a512009-03-17 21:15:40 +0000405 // Create the new typedef
Richard Smithdda56e42011-04-15 14:24:37 +0000406 TypedefNameDecl *Typedef;
407 if (IsTypeAlias)
408 Typedef = TypeAliasDecl::Create(SemaRef.Context, Owner, D->getLocStart(),
409 D->getLocation(), D->getIdentifier(), DI);
410 else
411 Typedef = TypedefDecl::Create(SemaRef.Context, Owner, D->getLocStart(),
412 D->getLocation(), D->getIdentifier(), DI);
Douglas Gregord7e7a512009-03-17 21:15:40 +0000413 if (Invalid)
414 Typedef->setInvalidDecl();
415
John McCall04fcd0d2011-02-01 08:20:08 +0000416 // If the old typedef was the name for linkage purposes of an anonymous
417 // tag decl, re-establish that relationship for the new typedef.
418 if (const TagType *oldTagType = D->getUnderlyingType()->getAs<TagType>()) {
419 TagDecl *oldTag = oldTagType->getDecl();
Douglas Gregord831d952013-03-08 22:15:15 +0000420 if (oldTag->getTypedefNameForAnonDecl() == D && !Invalid) {
John McCall04fcd0d2011-02-01 08:20:08 +0000421 TagDecl *newTag = DI->getType()->castAs<TagType>()->getDecl();
John McCall5ea95772013-03-09 00:54:27 +0000422 assert(!newTag->hasNameForLinkage());
Richard Smithdda56e42011-04-15 14:24:37 +0000423 newTag->setTypedefNameForAnonDecl(Typedef);
John McCall04fcd0d2011-02-01 08:20:08 +0000424 }
Douglas Gregor83eb5032010-04-23 16:25:07 +0000425 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +0000426
Richard Smith41c79d92014-10-11 00:37:16 +0000427 if (TypedefNameDecl *Prev = getPreviousDeclForInstantiation(D)) {
Douglas Gregora04f2ca2010-03-01 15:56:25 +0000428 NamedDecl *InstPrev = SemaRef.FindInstantiatedDecl(D->getLocation(), Prev,
429 TemplateArgs);
Douglas Gregor55e6b312011-03-04 19:46:35 +0000430 if (!InstPrev)
Craig Topperc3ec1492014-05-26 06:22:03 +0000431 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +0000432
Rafael Espindolacde2c8f2011-12-26 22:42:47 +0000433 TypedefNameDecl *InstPrevTypedef = cast<TypedefNameDecl>(InstPrev);
434
435 // If the typedef types are not identical, reject them.
436 SemaRef.isIncompatibleTypedef(InstPrevTypedef, Typedef);
437
Rafael Espindola8db352d2013-10-17 15:37:26 +0000438 Typedef->setPreviousDecl(InstPrevTypedef);
John McCall91f1a022009-12-30 00:31:22 +0000439 }
440
John McCall6602bb12010-08-01 02:01:53 +0000441 SemaRef.InstantiateAttrs(TemplateArgs, D, Typedef);
Douglas Gregor83eb5032010-04-23 16:25:07 +0000442
John McCall401982f2010-01-20 21:53:11 +0000443 Typedef->setAccess(D->getAccess());
Mike Stump11289f42009-09-09 15:08:12 +0000444
Douglas Gregord7e7a512009-03-17 21:15:40 +0000445 return Typedef;
446}
447
Richard Smithdda56e42011-04-15 14:24:37 +0000448Decl *TemplateDeclInstantiator::VisitTypedefDecl(TypedefDecl *D) {
Richard Smith3f1b5d02011-05-05 21:57:07 +0000449 Decl *Typedef = InstantiateTypedefNameDecl(D, /*IsTypeAlias=*/false);
Richard Smith41c79d92014-10-11 00:37:16 +0000450 if (Typedef)
451 Owner->addDecl(Typedef);
Richard Smith3f1b5d02011-05-05 21:57:07 +0000452 return Typedef;
Richard Smithdda56e42011-04-15 14:24:37 +0000453}
454
455Decl *TemplateDeclInstantiator::VisitTypeAliasDecl(TypeAliasDecl *D) {
Richard Smith3f1b5d02011-05-05 21:57:07 +0000456 Decl *Typedef = InstantiateTypedefNameDecl(D, /*IsTypeAlias=*/true);
Richard Smith41c79d92014-10-11 00:37:16 +0000457 if (Typedef)
458 Owner->addDecl(Typedef);
Richard Smith3f1b5d02011-05-05 21:57:07 +0000459 return Typedef;
460}
461
462Decl *
463TemplateDeclInstantiator::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
464 // Create a local instantiation scope for this type alias template, which
465 // will contain the instantiations of the template parameters.
466 LocalInstantiationScope Scope(SemaRef);
467
468 TemplateParameterList *TempParams = D->getTemplateParameters();
469 TemplateParameterList *InstParams = SubstTemplateParams(TempParams);
470 if (!InstParams)
Craig Topperc3ec1492014-05-26 06:22:03 +0000471 return nullptr;
Richard Smith3f1b5d02011-05-05 21:57:07 +0000472
473 TypeAliasDecl *Pattern = D->getTemplatedDecl();
474
Craig Topperc3ec1492014-05-26 06:22:03 +0000475 TypeAliasTemplateDecl *PrevAliasTemplate = nullptr;
Richard Smith41c79d92014-10-11 00:37:16 +0000476 if (getPreviousDeclForInstantiation<TypedefNameDecl>(Pattern)) {
Richard Smith3f1b5d02011-05-05 21:57:07 +0000477 DeclContext::lookup_result Found = Owner->lookup(Pattern->getDeclName());
David Blaikieff7d47a2012-12-19 00:45:41 +0000478 if (!Found.empty()) {
479 PrevAliasTemplate = dyn_cast<TypeAliasTemplateDecl>(Found.front());
Richard Smith3f1b5d02011-05-05 21:57:07 +0000480 }
481 }
482
483 TypeAliasDecl *AliasInst = cast_or_null<TypeAliasDecl>(
484 InstantiateTypedefNameDecl(Pattern, /*IsTypeAlias=*/true));
485 if (!AliasInst)
Craig Topperc3ec1492014-05-26 06:22:03 +0000486 return nullptr;
Richard Smith3f1b5d02011-05-05 21:57:07 +0000487
488 TypeAliasTemplateDecl *Inst
489 = TypeAliasTemplateDecl::Create(SemaRef.Context, Owner, D->getLocation(),
490 D->getDeclName(), InstParams, AliasInst);
Richard Smith43ccec8e2014-08-26 03:52:16 +0000491 AliasInst->setDescribedAliasTemplate(Inst);
Richard Smith3f1b5d02011-05-05 21:57:07 +0000492 if (PrevAliasTemplate)
Rafael Espindola8db352d2013-10-17 15:37:26 +0000493 Inst->setPreviousDecl(PrevAliasTemplate);
Richard Smith3f1b5d02011-05-05 21:57:07 +0000494
495 Inst->setAccess(D->getAccess());
496
497 if (!PrevAliasTemplate)
498 Inst->setInstantiatedFromMemberTemplate(D);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +0000499
Richard Smith3f1b5d02011-05-05 21:57:07 +0000500 Owner->addDecl(Inst);
501
502 return Inst;
Richard Smithdda56e42011-04-15 14:24:37 +0000503}
504
Douglas Gregoref1a09a2009-03-25 23:32:15 +0000505Decl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D) {
Larisse Voufo72caf2b2013-08-22 00:59:14 +0000506 return VisitVarDecl(D, /*InstantiatingVarTemplate=*/false);
Larisse Voufo39a1e502013-08-06 01:03:05 +0000507}
508
Larisse Voufo72caf2b2013-08-22 00:59:14 +0000509Decl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D,
510 bool InstantiatingVarTemplate) {
Larisse Voufo39a1e502013-08-06 01:03:05 +0000511
John McCall76d824f2009-08-25 22:02:44 +0000512 // Do substitution on the type of the declaration
John McCallbcd03502009-12-07 02:54:59 +0000513 TypeSourceInfo *DI = SemaRef.SubstType(D->getTypeSourceInfo(),
John McCallf1abcdc2009-10-21 02:39:02 +0000514 TemplateArgs,
515 D->getTypeSpecStartLoc(),
516 D->getDeclName());
517 if (!DI)
Craig Topperc3ec1492014-05-26 06:22:03 +0000518 return nullptr;
Douglas Gregoref1a09a2009-03-25 23:32:15 +0000519
Douglas Gregor61623342010-09-12 07:37:24 +0000520 if (DI->getType()->isFunctionType()) {
521 SemaRef.Diag(D->getLocation(), diag::err_variable_instantiates_to_function)
522 << D->isStaticDataMember() << DI->getType();
Craig Topperc3ec1492014-05-26 06:22:03 +0000523 return nullptr;
Douglas Gregor61623342010-09-12 07:37:24 +0000524 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +0000525
Richard Smith541b38b2013-09-20 01:15:31 +0000526 DeclContext *DC = Owner;
527 if (D->isLocalExternDecl())
528 SemaRef.adjustContextForLocalExternDecl(DC);
529
Larisse Voufo39a1e502013-08-06 01:03:05 +0000530 // Build the instantiated declaration.
Richard Smith541b38b2013-09-20 01:15:31 +0000531 VarDecl *Var = VarDecl::Create(SemaRef.Context, DC, D->getInnerLocStart(),
Douglas Gregoref1a09a2009-03-25 23:32:15 +0000532 D->getLocation(), D->getIdentifier(),
Larisse Voufo39a1e502013-08-06 01:03:05 +0000533 DI->getType(), DI, D->getStorageClass());
Mike Stump11289f42009-09-09 15:08:12 +0000534
Douglas Gregor8ca0c642011-12-10 01:22:52 +0000535 // In ARC, infer 'retaining' for variables of retainable type.
David Blaikiebbafb8a2012-03-11 07:00:24 +0000536 if (SemaRef.getLangOpts().ObjCAutoRefCount &&
Douglas Gregor8ca0c642011-12-10 01:22:52 +0000537 SemaRef.inferObjCARCLifetime(Var))
538 Var->setInvalidDecl();
539
Larisse Voufo39a1e502013-08-06 01:03:05 +0000540 // Substitute the nested name specifier, if any.
541 if (SubstQualifier(D, Var))
Craig Topperc3ec1492014-05-26 06:22:03 +0000542 return nullptr;
Mike Stump11289f42009-09-09 15:08:12 +0000543
Richard Smith541b38b2013-09-20 01:15:31 +0000544 SemaRef.BuildVariableInstantiation(Var, D, TemplateArgs, LateAttrs, Owner,
Larisse Voufo72caf2b2013-08-22 00:59:14 +0000545 StartingScope, InstantiatingVarTemplate);
Nick Lewyckyd78f92f2014-05-03 00:41:18 +0000546
547 if (D->isNRVOVariable()) {
548 QualType ReturnType = cast<FunctionDecl>(DC)->getReturnType();
549 if (SemaRef.isCopyElisionCandidate(ReturnType, Var, false))
550 Var->setNRVOVariable(true);
551 }
552
Alexander Kornienko83a4e182014-05-27 21:29:22 +0000553 Var->setImplicit(D->isImplicit());
554
Douglas Gregoref1a09a2009-03-25 23:32:15 +0000555 return Var;
556}
557
Abramo Bagnarad7340582010-06-05 05:09:32 +0000558Decl *TemplateDeclInstantiator::VisitAccessSpecDecl(AccessSpecDecl *D) {
559 AccessSpecDecl* AD
560 = AccessSpecDecl::Create(SemaRef.Context, D->getAccess(), Owner,
561 D->getAccessSpecifierLoc(), D->getColonLoc());
562 Owner->addHiddenDecl(AD);
563 return AD;
564}
565
Douglas Gregord7e7a512009-03-17 21:15:40 +0000566Decl *TemplateDeclInstantiator::VisitFieldDecl(FieldDecl *D) {
567 bool Invalid = false;
John McCallbcd03502009-12-07 02:54:59 +0000568 TypeSourceInfo *DI = D->getTypeSourceInfo();
Douglas Gregor678d76c2011-07-01 01:22:09 +0000569 if (DI->getType()->isInstantiationDependentType() ||
Douglas Gregor5a5073e2010-05-24 17:22:01 +0000570 DI->getType()->isVariablyModifiedType()) {
John McCall90459c52009-10-22 23:33:21 +0000571 DI = SemaRef.SubstType(DI, TemplateArgs,
572 D->getLocation(), D->getDeclName());
573 if (!DI) {
John McCallbcd03502009-12-07 02:54:59 +0000574 DI = D->getTypeSourceInfo();
John McCall90459c52009-10-22 23:33:21 +0000575 Invalid = true;
576 } else if (DI->getType()->isFunctionType()) {
Douglas Gregord7e7a512009-03-17 21:15:40 +0000577 // C++ [temp.arg.type]p3:
578 // If a declaration acquires a function type through a type
579 // dependent on a template-parameter and this causes a
580 // declaration that does not use the syntactic form of a
581 // function declarator to have function type, the program is
582 // ill-formed.
583 SemaRef.Diag(D->getLocation(), diag::err_field_instantiates_to_function)
John McCall90459c52009-10-22 23:33:21 +0000584 << DI->getType();
Douglas Gregord7e7a512009-03-17 21:15:40 +0000585 Invalid = true;
586 }
Douglas Gregor5597ab42010-05-07 23:12:07 +0000587 } else {
588 SemaRef.MarkDeclarationsReferencedInType(D->getLocation(), DI->getType());
Douglas Gregord7e7a512009-03-17 21:15:40 +0000589 }
590
591 Expr *BitWidth = D->getBitWidth();
592 if (Invalid)
Craig Topperc3ec1492014-05-26 06:22:03 +0000593 BitWidth = nullptr;
Douglas Gregord7e7a512009-03-17 21:15:40 +0000594 else if (BitWidth) {
Richard Smith764d2fe2011-12-20 02:08:33 +0000595 // The bit-width expression is a constant expression.
596 EnterExpressionEvaluationContext Unevaluated(SemaRef,
597 Sema::ConstantEvaluated);
Mike Stump11289f42009-09-09 15:08:12 +0000598
John McCalldadc5752010-08-24 06:29:42 +0000599 ExprResult InstantiatedBitWidth
John McCall76d824f2009-08-25 22:02:44 +0000600 = SemaRef.SubstExpr(BitWidth, TemplateArgs);
Douglas Gregord7e7a512009-03-17 21:15:40 +0000601 if (InstantiatedBitWidth.isInvalid()) {
602 Invalid = true;
Craig Topperc3ec1492014-05-26 06:22:03 +0000603 BitWidth = nullptr;
Douglas Gregord7e7a512009-03-17 21:15:40 +0000604 } else
Nikola Smiljanic01a75982014-05-29 10:55:11 +0000605 BitWidth = InstantiatedBitWidth.getAs<Expr>();
Douglas Gregord7e7a512009-03-17 21:15:40 +0000606 }
607
John McCall90459c52009-10-22 23:33:21 +0000608 FieldDecl *Field = SemaRef.CheckFieldDecl(D->getDeclName(),
609 DI->getType(), DI,
Mike Stump11289f42009-09-09 15:08:12 +0000610 cast<RecordDecl>(Owner),
Douglas Gregord7e7a512009-03-17 21:15:40 +0000611 D->getLocation(),
612 D->isMutable(),
613 BitWidth,
Richard Smith2b013182012-06-10 03:12:00 +0000614 D->getInClassInitStyle(),
Richard Smith47ad0172012-05-23 04:22:22 +0000615 D->getInnerLocStart(),
Douglas Gregord7e7a512009-03-17 21:15:40 +0000616 D->getAccess(),
Craig Topperc3ec1492014-05-26 06:22:03 +0000617 nullptr);
Douglas Gregor3c74d412009-10-14 20:14:33 +0000618 if (!Field) {
619 cast<Decl>(Owner)->setInvalidDecl();
Craig Topperc3ec1492014-05-26 06:22:03 +0000620 return nullptr;
Douglas Gregor3c74d412009-10-14 20:14:33 +0000621 }
Mike Stump11289f42009-09-09 15:08:12 +0000622
DeLesley Hutchins30398dd2012-01-20 22:50:54 +0000623 SemaRef.InstantiateAttrs(TemplateArgs, D, Field, LateAttrs, StartingScope);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +0000624
Richard Smith848e1f12013-02-01 08:12:08 +0000625 if (Field->hasAttrs())
626 SemaRef.CheckAlignasUnderalignment(Field);
627
Anders Carlsson2e56cc62009-09-02 19:17:55 +0000628 if (Invalid)
629 Field->setInvalidDecl();
Mike Stump11289f42009-09-09 15:08:12 +0000630
Anders Carlsson2e56cc62009-09-02 19:17:55 +0000631 if (!Field->getDeclName()) {
632 // Keep track of where this decl came from.
633 SemaRef.Context.setInstantiatedFromUnnamedFieldDecl(Field, D);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +0000634 }
Douglas Gregor04163182010-05-21 00:31:19 +0000635 if (CXXRecordDecl *Parent= dyn_cast<CXXRecordDecl>(Field->getDeclContext())) {
636 if (Parent->isAnonymousStructOrUnion() &&
Sebastian Redl50c68252010-08-31 00:36:30 +0000637 Parent->getRedeclContext()->isFunctionOrMethod())
Douglas Gregor04163182010-05-21 00:31:19 +0000638 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Field);
Douglas Gregord7e7a512009-03-17 21:15:40 +0000639 }
Mike Stump11289f42009-09-09 15:08:12 +0000640
Anders Carlsson2e56cc62009-09-02 19:17:55 +0000641 Field->setImplicit(D->isImplicit());
John McCall401982f2010-01-20 21:53:11 +0000642 Field->setAccess(D->getAccess());
Anders Carlsson2e56cc62009-09-02 19:17:55 +0000643 Owner->addDecl(Field);
Douglas Gregord7e7a512009-03-17 21:15:40 +0000644
645 return Field;
646}
647
John McCall5e77d762013-04-16 07:28:30 +0000648Decl *TemplateDeclInstantiator::VisitMSPropertyDecl(MSPropertyDecl *D) {
649 bool Invalid = false;
650 TypeSourceInfo *DI = D->getTypeSourceInfo();
651
652 if (DI->getType()->isVariablyModifiedType()) {
653 SemaRef.Diag(D->getLocation(), diag::err_property_is_variably_modified)
Aaron Ballman1bda4592014-01-03 01:09:27 +0000654 << D;
John McCall5e77d762013-04-16 07:28:30 +0000655 Invalid = true;
656 } else if (DI->getType()->isInstantiationDependentType()) {
657 DI = SemaRef.SubstType(DI, TemplateArgs,
658 D->getLocation(), D->getDeclName());
659 if (!DI) {
660 DI = D->getTypeSourceInfo();
661 Invalid = true;
662 } else if (DI->getType()->isFunctionType()) {
663 // C++ [temp.arg.type]p3:
664 // If a declaration acquires a function type through a type
665 // dependent on a template-parameter and this causes a
666 // declaration that does not use the syntactic form of a
667 // function declarator to have function type, the program is
668 // ill-formed.
669 SemaRef.Diag(D->getLocation(), diag::err_field_instantiates_to_function)
670 << DI->getType();
671 Invalid = true;
672 }
673 } else {
674 SemaRef.MarkDeclarationsReferencedInType(D->getLocation(), DI->getType());
675 }
676
Richard Smithf7981722013-11-22 09:01:48 +0000677 MSPropertyDecl *Property = MSPropertyDecl::Create(
678 SemaRef.Context, Owner, D->getLocation(), D->getDeclName(), DI->getType(),
679 DI, D->getLocStart(), D->getGetterId(), D->getSetterId());
John McCall5e77d762013-04-16 07:28:30 +0000680
681 SemaRef.InstantiateAttrs(TemplateArgs, D, Property, LateAttrs,
682 StartingScope);
683
684 if (Invalid)
685 Property->setInvalidDecl();
686
687 Property->setAccess(D->getAccess());
688 Owner->addDecl(Property);
689
690 return Property;
691}
692
Francois Pichet783dd6e2010-11-21 06:08:52 +0000693Decl *TemplateDeclInstantiator::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
694 NamedDecl **NamedChain =
695 new (SemaRef.Context)NamedDecl*[D->getChainingSize()];
696
697 int i = 0;
Aaron Ballman29c94602014-03-07 18:36:15 +0000698 for (auto *PI : D->chain()) {
Aaron Ballman13916082014-03-07 18:11:58 +0000699 NamedDecl *Next = SemaRef.FindInstantiatedDecl(D->getLocation(), PI,
Douglas Gregor55e6b312011-03-04 19:46:35 +0000700 TemplateArgs);
701 if (!Next)
Craig Topperc3ec1492014-05-26 06:22:03 +0000702 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +0000703
Douglas Gregor55e6b312011-03-04 19:46:35 +0000704 NamedChain[i++] = Next;
705 }
Francois Pichet783dd6e2010-11-21 06:08:52 +0000706
Francois Pichetdbafc192010-12-09 10:07:54 +0000707 QualType T = cast<FieldDecl>(NamedChain[i-1])->getType();
Aaron Ballman260995b2014-10-15 16:58:18 +0000708 IndirectFieldDecl *IndirectField = IndirectFieldDecl::Create(
709 SemaRef.Context, Owner, D->getLocation(), D->getIdentifier(), T,
710 NamedChain, D->getChainingSize());
Francois Pichet783dd6e2010-11-21 06:08:52 +0000711
NAKAMURA Takumi729be142014-10-27 12:37:26 +0000712 for (const auto *Attr : D->attrs())
713 IndirectField->addAttr(Attr->clone(SemaRef.Context));
Francois Pichet783dd6e2010-11-21 06:08:52 +0000714
715 IndirectField->setImplicit(D->isImplicit());
716 IndirectField->setAccess(D->getAccess());
717 Owner->addDecl(IndirectField);
718 return IndirectField;
719}
720
John McCallaa74a0c2009-08-28 07:59:38 +0000721Decl *TemplateDeclInstantiator::VisitFriendDecl(FriendDecl *D) {
John McCallaa74a0c2009-08-28 07:59:38 +0000722 // Handle friend type expressions by simply substituting template
Douglas Gregor3b4abb62010-04-07 17:57:12 +0000723 // parameters into the pattern type and checking the result.
John McCall15ad0962010-03-25 18:04:51 +0000724 if (TypeSourceInfo *Ty = D->getFriendType()) {
Chandler Carruth08836322011-05-01 00:51:33 +0000725 TypeSourceInfo *InstTy;
726 // If this is an unsupported friend, don't bother substituting template
727 // arguments into it. The actual type referred to won't be used by any
728 // parts of Clang, and may not be valid for instantiating. Just use the
729 // same info for the instantiated friend.
730 if (D->isUnsupportedFriend()) {
731 InstTy = Ty;
732 } else {
733 InstTy = SemaRef.SubstType(Ty, TemplateArgs,
734 D->getLocation(), DeclarationName());
735 }
736 if (!InstTy)
Craig Topperc3ec1492014-05-26 06:22:03 +0000737 return nullptr;
John McCallaa74a0c2009-08-28 07:59:38 +0000738
Richard Smitha31a89a2012-09-20 01:31:00 +0000739 FriendDecl *FD = SemaRef.CheckFriendTypeDecl(D->getLocStart(),
Abramo Bagnara254b6302011-10-29 20:52:52 +0000740 D->getFriendLoc(), InstTy);
Douglas Gregor3b4abb62010-04-07 17:57:12 +0000741 if (!FD)
Craig Topperc3ec1492014-05-26 06:22:03 +0000742 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +0000743
Douglas Gregor3b4abb62010-04-07 17:57:12 +0000744 FD->setAccess(AS_public);
John McCallace48cd2010-10-19 01:40:49 +0000745 FD->setUnsupportedFriend(D->isUnsupportedFriend());
Douglas Gregor3b4abb62010-04-07 17:57:12 +0000746 Owner->addDecl(FD);
747 return FD;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +0000748 }
749
Douglas Gregor3b4abb62010-04-07 17:57:12 +0000750 NamedDecl *ND = D->getFriendDecl();
751 assert(ND && "friend decl must be a decl or a type!");
752
John McCallb9c78482010-04-08 09:05:18 +0000753 // All of the Visit implementations for the various potential friend
754 // declarations have to be carefully written to work for friend
755 // objects, with the most important detail being that the target
756 // decl should almost certainly not be placed in Owner.
757 Decl *NewND = Visit(ND);
Craig Topperc3ec1492014-05-26 06:22:03 +0000758 if (!NewND) return nullptr;
Mike Stump11289f42009-09-09 15:08:12 +0000759
John McCallaa74a0c2009-08-28 07:59:38 +0000760 FriendDecl *FD =
NAKAMURA Takumi82a35112011-10-08 11:31:46 +0000761 FriendDecl::Create(SemaRef.Context, Owner, D->getLocation(),
Douglas Gregor3b4abb62010-04-07 17:57:12 +0000762 cast<NamedDecl>(NewND), D->getFriendLoc());
John McCall75c03bb2009-08-29 03:50:18 +0000763 FD->setAccess(AS_public);
John McCallace48cd2010-10-19 01:40:49 +0000764 FD->setUnsupportedFriend(D->isUnsupportedFriend());
John McCallaa74a0c2009-08-28 07:59:38 +0000765 Owner->addDecl(FD);
766 return FD;
John McCall58de3582009-08-14 02:03:10 +0000767}
768
Douglas Gregord7e7a512009-03-17 21:15:40 +0000769Decl *TemplateDeclInstantiator::VisitStaticAssertDecl(StaticAssertDecl *D) {
770 Expr *AssertExpr = D->getAssertExpr();
Mike Stump11289f42009-09-09 15:08:12 +0000771
Richard Smith764d2fe2011-12-20 02:08:33 +0000772 // The expression in a static assertion is a constant expression.
773 EnterExpressionEvaluationContext Unevaluated(SemaRef,
774 Sema::ConstantEvaluated);
Mike Stump11289f42009-09-09 15:08:12 +0000775
John McCalldadc5752010-08-24 06:29:42 +0000776 ExprResult InstantiatedAssertExpr
John McCall76d824f2009-08-25 22:02:44 +0000777 = SemaRef.SubstExpr(AssertExpr, TemplateArgs);
Douglas Gregord7e7a512009-03-17 21:15:40 +0000778 if (InstantiatedAssertExpr.isInvalid())
Craig Topperc3ec1492014-05-26 06:22:03 +0000779 return nullptr;
Douglas Gregord7e7a512009-03-17 21:15:40 +0000780
Richard Smithded9c2e2012-07-11 22:37:56 +0000781 return SemaRef.BuildStaticAssertDeclaration(D->getLocation(),
John McCallb268a282010-08-23 23:25:46 +0000782 InstantiatedAssertExpr.get(),
Richard Smithded9c2e2012-07-11 22:37:56 +0000783 D->getMessage(),
784 D->getRParenLoc(),
785 D->isFailed());
Douglas Gregord7e7a512009-03-17 21:15:40 +0000786}
787
788Decl *TemplateDeclInstantiator::VisitEnumDecl(EnumDecl *D) {
Craig Topperc3ec1492014-05-26 06:22:03 +0000789 EnumDecl *PrevDecl = nullptr;
Richard Smith41c79d92014-10-11 00:37:16 +0000790 if (EnumDecl *PatternPrev = getPreviousDeclForInstantiation(D)) {
Richard Smith2e6610a2012-03-26 04:58:10 +0000791 NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->getLocation(),
Richard Smith41c79d92014-10-11 00:37:16 +0000792 PatternPrev,
Richard Smith2e6610a2012-03-26 04:58:10 +0000793 TemplateArgs);
Craig Topperc3ec1492014-05-26 06:22:03 +0000794 if (!Prev) return nullptr;
Richard Smith2e6610a2012-03-26 04:58:10 +0000795 PrevDecl = cast<EnumDecl>(Prev);
796 }
797
Abramo Bagnara29c2d462011-03-09 14:09:51 +0000798 EnumDecl *Enum = EnumDecl::Create(SemaRef.Context, Owner, D->getLocStart(),
Douglas Gregord7e7a512009-03-17 21:15:40 +0000799 D->getLocation(), D->getIdentifier(),
Richard Smith2e6610a2012-03-26 04:58:10 +0000800 PrevDecl, D->isScoped(),
Abramo Bagnara0e05e242010-12-03 18:54:17 +0000801 D->isScopedUsingClassTag(), D->isFixed());
Douglas Gregor0bf31402010-10-08 23:50:27 +0000802 if (D->isFixed()) {
Richard Smith4b38ded2012-03-14 23:13:10 +0000803 if (TypeSourceInfo *TI = D->getIntegerTypeSourceInfo()) {
Douglas Gregor0bf31402010-10-08 23:50:27 +0000804 // If we have type source information for the underlying type, it means it
805 // has been explicitly set by the user. Perform substitution on it before
806 // moving on.
807 SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc();
Richard Smith4b38ded2012-03-14 23:13:10 +0000808 TypeSourceInfo *NewTI = SemaRef.SubstType(TI, TemplateArgs, UnderlyingLoc,
809 DeclarationName());
810 if (!NewTI || SemaRef.CheckEnumUnderlyingType(NewTI))
Douglas Gregor0bf31402010-10-08 23:50:27 +0000811 Enum->setIntegerType(SemaRef.Context.IntTy);
Richard Smith4b38ded2012-03-14 23:13:10 +0000812 else
813 Enum->setIntegerTypeSourceInfo(NewTI);
814 } else {
Douglas Gregor0bf31402010-10-08 23:50:27 +0000815 assert(!D->getIntegerType()->isDependentType()
816 && "Dependent type without type source info");
817 Enum->setIntegerType(D->getIntegerType());
818 }
819 }
820
John McCall811a0f52010-10-22 23:36:17 +0000821 SemaRef.InstantiateAttrs(TemplateArgs, D, Enum);
822
Richard Smith4b38ded2012-03-14 23:13:10 +0000823 Enum->setInstantiationOfMemberEnum(D, TSK_ImplicitInstantiation);
Douglas Gregor6c2adff2009-03-25 22:00:53 +0000824 Enum->setAccess(D->getAccess());
David Majnemerdbc0c8f2013-12-04 09:01:55 +0000825 // Forward the mangling number from the template to the instantiated decl.
826 SemaRef.Context.setManglingNumber(Enum, SemaRef.Context.getManglingNumber(D));
David Majnemer00350522015-08-31 18:48:39 +0000827 // See if the old tag was defined along with a declarator.
828 // If it did, mark the new tag as being associated with that declarator.
829 if (DeclaratorDecl *DD = SemaRef.Context.getDeclaratorForUnnamedTagDecl(D))
830 SemaRef.Context.addDeclaratorForUnnamedTagDecl(Enum, DD);
831 // See if the old tag was defined along with a typedef.
832 // If it did, mark the new tag as being associated with that typedef.
833 if (TypedefNameDecl *TND = SemaRef.Context.getTypedefNameForUnnamedTagDecl(D))
834 SemaRef.Context.addTypedefNameForUnnamedTagDecl(Enum, TND);
Craig Topperc3ec1492014-05-26 06:22:03 +0000835 if (SubstQualifier(D, Enum)) return nullptr;
Argyrios Kyrtzidiscfbfe782009-06-30 02:36:12 +0000836 Owner->addDecl(Enum);
Richard Smith4b38ded2012-03-14 23:13:10 +0000837
Richard Smith258a7442012-03-26 04:08:46 +0000838 EnumDecl *Def = D->getDefinition();
839 if (Def && Def != D) {
840 // If this is an out-of-line definition of an enum member template, check
841 // that the underlying types match in the instantiation of both
842 // declarations.
843 if (TypeSourceInfo *TI = Def->getIntegerTypeSourceInfo()) {
844 SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc();
845 QualType DefnUnderlying =
846 SemaRef.SubstType(TI->getType(), TemplateArgs,
847 UnderlyingLoc, DeclarationName());
848 SemaRef.CheckEnumRedeclaration(Def->getLocation(), Def->isScoped(),
David Majnemerdc9be212015-10-08 10:04:46 +0000849 DefnUnderlying,
850 /*EnumUnderlyingIsImplicit=*/false, Enum);
Richard Smith258a7442012-03-26 04:08:46 +0000851 }
852 }
Douglas Gregord7e7a512009-03-17 21:15:40 +0000853
Richard Smith4b38ded2012-03-14 23:13:10 +0000854 // C++11 [temp.inst]p1: The implicit instantiation of a class template
855 // specialization causes the implicit instantiation of the declarations, but
856 // not the definitions of scoped member enumerations.
David Majnemer192d1792013-11-27 08:20:38 +0000857 //
858 // DR1484 clarifies that enumeration definitions inside of a template
859 // declaration aren't considered entities that can be separately instantiated
860 // from the rest of the entity they are declared inside of.
861 if (isDeclWithinFunction(D) ? D == Def : Def && !Enum->isScoped()) {
862 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Enum);
Richard Smith258a7442012-03-26 04:08:46 +0000863 InstantiateEnumDefinition(Enum, Def);
David Majnemer192d1792013-11-27 08:20:38 +0000864 }
Richard Smith4b38ded2012-03-14 23:13:10 +0000865
866 return Enum;
867}
868
869void TemplateDeclInstantiator::InstantiateEnumDefinition(
870 EnumDecl *Enum, EnumDecl *Pattern) {
871 Enum->startDefinition();
872
Richard Smith7d137e32012-03-23 03:33:32 +0000873 // Update the location to refer to the definition.
874 Enum->setLocation(Pattern->getLocation());
875
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000876 SmallVector<Decl*, 4> Enumerators;
Douglas Gregord7e7a512009-03-17 21:15:40 +0000877
Craig Topperc3ec1492014-05-26 06:22:03 +0000878 EnumConstantDecl *LastEnumConst = nullptr;
Aaron Ballman23a6dcb2014-03-08 18:45:14 +0000879 for (auto *EC : Pattern->enumerators()) {
Douglas Gregord7e7a512009-03-17 21:15:40 +0000880 // The specified value for the enumerator.
Nikola Smiljanic03ff2592014-05-29 14:05:12 +0000881 ExprResult Value((Expr *)nullptr);
Douglas Gregor0b6a6242009-06-22 20:57:11 +0000882 if (Expr *UninstValue = EC->getInitExpr()) {
Richard Smith764d2fe2011-12-20 02:08:33 +0000883 // The enumerator's value expression is a constant expression.
Mike Stump11289f42009-09-09 15:08:12 +0000884 EnterExpressionEvaluationContext Unevaluated(SemaRef,
Richard Smith764d2fe2011-12-20 02:08:33 +0000885 Sema::ConstantEvaluated);
Mike Stump11289f42009-09-09 15:08:12 +0000886
John McCall76d824f2009-08-25 22:02:44 +0000887 Value = SemaRef.SubstExpr(UninstValue, TemplateArgs);
Douglas Gregor0b6a6242009-06-22 20:57:11 +0000888 }
Douglas Gregord7e7a512009-03-17 21:15:40 +0000889
890 // Drop the initial value and continue.
891 bool isInvalid = false;
892 if (Value.isInvalid()) {
Nikola Smiljanic03ff2592014-05-29 14:05:12 +0000893 Value = nullptr;
Douglas Gregord7e7a512009-03-17 21:15:40 +0000894 isInvalid = true;
895 }
896
Mike Stump11289f42009-09-09 15:08:12 +0000897 EnumConstantDecl *EnumConst
Douglas Gregord7e7a512009-03-17 21:15:40 +0000898 = SemaRef.CheckEnumConstant(Enum, LastEnumConst,
899 EC->getLocation(), EC->getIdentifier(),
John McCallb268a282010-08-23 23:25:46 +0000900 Value.get());
Douglas Gregord7e7a512009-03-17 21:15:40 +0000901
902 if (isInvalid) {
903 if (EnumConst)
904 EnumConst->setInvalidDecl();
905 Enum->setInvalidDecl();
906 }
907
908 if (EnumConst) {
Aaron Ballman23a6dcb2014-03-08 18:45:14 +0000909 SemaRef.InstantiateAttrs(TemplateArgs, EC, EnumConst);
John McCall811a0f52010-10-22 23:36:17 +0000910
John McCallf9b528c2010-01-23 22:37:59 +0000911 EnumConst->setAccess(Enum->getAccess());
Argyrios Kyrtzidiscfbfe782009-06-30 02:36:12 +0000912 Enum->addDecl(EnumConst);
John McCall48871652010-08-21 09:40:31 +0000913 Enumerators.push_back(EnumConst);
Douglas Gregord7e7a512009-03-17 21:15:40 +0000914 LastEnumConst = EnumConst;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +0000915
Richard Smith4b38ded2012-03-14 23:13:10 +0000916 if (Pattern->getDeclContext()->isFunctionOrMethod() &&
917 !Enum->isScoped()) {
Douglas Gregoraff9c1a2010-03-01 19:00:07 +0000918 // If the enumeration is within a function or method, record the enum
919 // constant as a local.
Aaron Ballman23a6dcb2014-03-08 18:45:14 +0000920 SemaRef.CurrentInstantiationScope->InstantiatedLocal(EC, EnumConst);
Douglas Gregoraff9c1a2010-03-01 19:00:07 +0000921 }
Douglas Gregord7e7a512009-03-17 21:15:40 +0000922 }
923 }
Mike Stump11289f42009-09-09 15:08:12 +0000924
Richard Smith4b38ded2012-03-14 23:13:10 +0000925 // FIXME: Fixup LBraceLoc
926 SemaRef.ActOnEnumBody(Enum->getLocation(), SourceLocation(),
927 Enum->getRBraceLoc(), Enum,
Dmitri Gribenkoe5fde992013-04-27 20:23:52 +0000928 Enumerators,
Craig Topperc3ec1492014-05-26 06:22:03 +0000929 nullptr, nullptr);
Douglas Gregord7e7a512009-03-17 21:15:40 +0000930}
931
Douglas Gregor9106b822009-03-25 15:04:13 +0000932Decl *TemplateDeclInstantiator::VisitEnumConstantDecl(EnumConstantDecl *D) {
David Blaikie83d382b2011-09-23 05:06:16 +0000933 llvm_unreachable("EnumConstantDecls can only occur within EnumDecls.");
Douglas Gregor9106b822009-03-25 15:04:13 +0000934}
935
David Majnemerd9b1a4f2015-11-04 03:40:30 +0000936Decl *
937TemplateDeclInstantiator::VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D) {
938 llvm_unreachable("BuiltinTemplateDecls cannot be instantiated.");
939}
940
John McCall87a44eb2009-08-20 01:44:21 +0000941Decl *TemplateDeclInstantiator::VisitClassTemplateDecl(ClassTemplateDecl *D) {
John McCall598b4402010-03-25 06:39:04 +0000942 bool isFriend = (D->getFriendObjectKind() != Decl::FOK_None);
943
Douglas Gregor954de172009-10-31 17:21:17 +0000944 // Create a local instantiation scope for this class template, which
945 // will contain the instantiations of the template parameters.
John McCall19c1bfd2010-08-25 05:32:35 +0000946 LocalInstantiationScope Scope(SemaRef);
John McCall87a44eb2009-08-20 01:44:21 +0000947 TemplateParameterList *TempParams = D->getTemplateParameters();
John McCall76d824f2009-08-25 22:02:44 +0000948 TemplateParameterList *InstParams = SubstTemplateParams(TempParams);
Mike Stump11289f42009-09-09 15:08:12 +0000949 if (!InstParams)
Craig Topperc3ec1492014-05-26 06:22:03 +0000950 return nullptr;
John McCall87a44eb2009-08-20 01:44:21 +0000951
952 CXXRecordDecl *Pattern = D->getTemplatedDecl();
John McCall598b4402010-03-25 06:39:04 +0000953
954 // Instantiate the qualifier. We have to do this first in case
955 // we're a friend declaration, because if we are then we need to put
956 // the new declaration in the appropriate context.
Douglas Gregor14454802011-02-25 02:25:35 +0000957 NestedNameSpecifierLoc QualifierLoc = Pattern->getQualifierLoc();
958 if (QualifierLoc) {
959 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
960 TemplateArgs);
961 if (!QualifierLoc)
Craig Topperc3ec1492014-05-26 06:22:03 +0000962 return nullptr;
John McCall598b4402010-03-25 06:39:04 +0000963 }
964
Craig Topperc3ec1492014-05-26 06:22:03 +0000965 CXXRecordDecl *PrevDecl = nullptr;
966 ClassTemplateDecl *PrevClassTemplate = nullptr;
John McCall598b4402010-03-25 06:39:04 +0000967
Richard Smith41c79d92014-10-11 00:37:16 +0000968 if (!isFriend && getPreviousDeclForInstantiation(Pattern)) {
Nick Lewycky61478912010-11-08 23:29:42 +0000969 DeclContext::lookup_result Found = Owner->lookup(Pattern->getDeclName());
David Blaikieff7d47a2012-12-19 00:45:41 +0000970 if (!Found.empty()) {
971 PrevClassTemplate = dyn_cast<ClassTemplateDecl>(Found.front());
Nick Lewycky61478912010-11-08 23:29:42 +0000972 if (PrevClassTemplate)
973 PrevDecl = PrevClassTemplate->getTemplatedDecl();
974 }
975 }
976
John McCall598b4402010-03-25 06:39:04 +0000977 // If this isn't a friend, then it's a member template, in which
978 // case we just want to build the instantiation in the
979 // specialization. If it is a friend, we want to build it in
980 // the appropriate context.
981 DeclContext *DC = Owner;
982 if (isFriend) {
Douglas Gregor14454802011-02-25 02:25:35 +0000983 if (QualifierLoc) {
John McCall598b4402010-03-25 06:39:04 +0000984 CXXScopeSpec SS;
Douglas Gregor14454802011-02-25 02:25:35 +0000985 SS.Adopt(QualifierLoc);
John McCall598b4402010-03-25 06:39:04 +0000986 DC = SemaRef.computeDeclContext(SS);
Craig Topperc3ec1492014-05-26 06:22:03 +0000987 if (!DC) return nullptr;
John McCall598b4402010-03-25 06:39:04 +0000988 } else {
989 DC = SemaRef.FindInstantiatedContext(Pattern->getLocation(),
990 Pattern->getDeclContext(),
991 TemplateArgs);
992 }
993
994 // Look for a previous declaration of the template in the owning
995 // context.
996 LookupResult R(SemaRef, Pattern->getDeclName(), Pattern->getLocation(),
997 Sema::LookupOrdinaryName, Sema::ForRedeclaration);
998 SemaRef.LookupQualifiedName(R, DC);
999
1000 if (R.isSingleResult()) {
1001 PrevClassTemplate = R.getAsSingle<ClassTemplateDecl>();
1002 if (PrevClassTemplate)
1003 PrevDecl = PrevClassTemplate->getTemplatedDecl();
1004 }
1005
Douglas Gregor14454802011-02-25 02:25:35 +00001006 if (!PrevClassTemplate && QualifierLoc) {
John McCall598b4402010-03-25 06:39:04 +00001007 SemaRef.Diag(Pattern->getLocation(), diag::err_not_tag_in_scope)
Douglas Gregorf5af3582010-03-31 23:17:41 +00001008 << D->getTemplatedDecl()->getTagKind() << Pattern->getDeclName() << DC
Douglas Gregor14454802011-02-25 02:25:35 +00001009 << QualifierLoc.getSourceRange();
Craig Topperc3ec1492014-05-26 06:22:03 +00001010 return nullptr;
John McCall598b4402010-03-25 06:39:04 +00001011 }
1012
Douglas Gregor01e09d92010-04-08 18:16:15 +00001013 bool AdoptedPreviousTemplateParams = false;
John McCall598b4402010-03-25 06:39:04 +00001014 if (PrevClassTemplate) {
Douglas Gregor01e09d92010-04-08 18:16:15 +00001015 bool Complain = true;
1016
1017 // HACK: libstdc++ 4.2.1 contains an ill-formed friend class
1018 // template for struct std::tr1::__detail::_Map_base, where the
1019 // template parameters of the friend declaration don't match the
1020 // template parameters of the original declaration. In this one
1021 // case, we don't complain about the ill-formed friend
1022 // declaration.
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001023 if (isFriend && Pattern->getIdentifier() &&
Douglas Gregor01e09d92010-04-08 18:16:15 +00001024 Pattern->getIdentifier()->isStr("_Map_base") &&
1025 DC->isNamespace() &&
1026 cast<NamespaceDecl>(DC)->getIdentifier() &&
1027 cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__detail")) {
1028 DeclContext *DCParent = DC->getParent();
1029 if (DCParent->isNamespace() &&
1030 cast<NamespaceDecl>(DCParent)->getIdentifier() &&
1031 cast<NamespaceDecl>(DCParent)->getIdentifier()->isStr("tr1")) {
Richard Trieuc771d5d2014-05-28 02:16:01 +00001032 if (cast<Decl>(DCParent)->isInStdNamespace())
Douglas Gregor01e09d92010-04-08 18:16:15 +00001033 Complain = false;
1034 }
1035 }
1036
John McCall598b4402010-03-25 06:39:04 +00001037 TemplateParameterList *PrevParams
1038 = PrevClassTemplate->getTemplateParameters();
1039
1040 // Make sure the parameter lists match.
1041 if (!SemaRef.TemplateParameterListsAreEqual(InstParams, PrevParams,
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001042 Complain,
Douglas Gregor01e09d92010-04-08 18:16:15 +00001043 Sema::TPL_TemplateMatch)) {
1044 if (Complain)
Craig Topperc3ec1492014-05-26 06:22:03 +00001045 return nullptr;
Douglas Gregor01e09d92010-04-08 18:16:15 +00001046
1047 AdoptedPreviousTemplateParams = true;
1048 InstParams = PrevParams;
1049 }
John McCall598b4402010-03-25 06:39:04 +00001050
1051 // Do some additional validation, then merge default arguments
1052 // from the existing declarations.
Douglas Gregor01e09d92010-04-08 18:16:15 +00001053 if (!AdoptedPreviousTemplateParams &&
1054 SemaRef.CheckTemplateParameterList(InstParams, PrevParams,
John McCall598b4402010-03-25 06:39:04 +00001055 Sema::TPC_ClassTemplate))
Craig Topperc3ec1492014-05-26 06:22:03 +00001056 return nullptr;
John McCall598b4402010-03-25 06:39:04 +00001057 }
1058 }
1059
John McCall87a44eb2009-08-20 01:44:21 +00001060 CXXRecordDecl *RecordInst
John McCall598b4402010-03-25 06:39:04 +00001061 = CXXRecordDecl::Create(SemaRef.Context, Pattern->getTagKind(), DC,
Abramo Bagnara29c2d462011-03-09 14:09:51 +00001062 Pattern->getLocStart(), Pattern->getLocation(),
1063 Pattern->getIdentifier(), PrevDecl,
Douglas Gregoref06ccf2009-10-12 23:11:44 +00001064 /*DelayTypeCreation=*/true);
John McCall87a44eb2009-08-20 01:44:21 +00001065
Douglas Gregor14454802011-02-25 02:25:35 +00001066 if (QualifierLoc)
1067 RecordInst->setQualifierInfo(QualifierLoc);
John McCall3e11ebe2010-03-15 10:12:16 +00001068
John McCall87a44eb2009-08-20 01:44:21 +00001069 ClassTemplateDecl *Inst
John McCall598b4402010-03-25 06:39:04 +00001070 = ClassTemplateDecl::Create(SemaRef.Context, DC, D->getLocation(),
1071 D->getIdentifier(), InstParams, RecordInst,
1072 PrevClassTemplate);
John McCall87a44eb2009-08-20 01:44:21 +00001073 RecordInst->setDescribedClassTemplate(Inst);
John McCall17762b82010-04-08 20:25:50 +00001074
John McCall598b4402010-03-25 06:39:04 +00001075 if (isFriend) {
John McCall17762b82010-04-08 20:25:50 +00001076 if (PrevClassTemplate)
1077 Inst->setAccess(PrevClassTemplate->getAccess());
1078 else
1079 Inst->setAccess(D->getAccess());
1080
Richard Smith64017682013-07-17 23:53:16 +00001081 Inst->setObjectOfFriendDecl();
John McCall598b4402010-03-25 06:39:04 +00001082 // TODO: do we want to track the instantiation progeny of this
1083 // friend target decl?
1084 } else {
Douglas Gregor412e8bc2009-10-30 21:07:27 +00001085 Inst->setAccess(D->getAccess());
Nick Lewycky61478912010-11-08 23:29:42 +00001086 if (!PrevClassTemplate)
1087 Inst->setInstantiatedFromMemberTemplate(D);
John McCall598b4402010-03-25 06:39:04 +00001088 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001089
Douglas Gregoref06ccf2009-10-12 23:11:44 +00001090 // Trigger creation of the type for the instantiation.
John McCalle78aac42010-03-10 03:28:59 +00001091 SemaRef.Context.getInjectedClassNameType(RecordInst,
Douglas Gregor9961ce92010-07-08 18:37:38 +00001092 Inst->getInjectedClassNameSpecialization());
John McCall17762b82010-04-08 20:25:50 +00001093
Douglas Gregorbb3b46e2009-10-30 22:42:42 +00001094 // Finish handling of friends.
John McCall598b4402010-03-25 06:39:04 +00001095 if (isFriend) {
Richard Smith05afe5e2012-03-13 03:12:56 +00001096 DC->makeDeclVisibleInContext(Inst);
Abramo Bagnaraedf99ff2011-11-26 13:33:46 +00001097 Inst->setLexicalDeclContext(Owner);
1098 RecordInst->setLexicalDeclContext(Owner);
Douglas Gregor412e8bc2009-10-30 21:07:27 +00001099 return Inst;
Douglas Gregorbb3b46e2009-10-30 22:42:42 +00001100 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001101
Abramo Bagnaraedf99ff2011-11-26 13:33:46 +00001102 if (D->isOutOfLine()) {
1103 Inst->setLexicalDeclContext(D->getLexicalDeclContext());
1104 RecordInst->setLexicalDeclContext(D->getLexicalDeclContext());
1105 }
1106
John McCall87a44eb2009-08-20 01:44:21 +00001107 Owner->addDecl(Inst);
Douglas Gregor869853e2010-11-10 19:44:59 +00001108
1109 if (!PrevClassTemplate) {
1110 // Queue up any out-of-line partial specializations of this member
1111 // class template; the client will force their instantiation once
1112 // the enclosing class has been instantiated.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001113 SmallVector<ClassTemplatePartialSpecializationDecl *, 4> PartialSpecs;
Douglas Gregor869853e2010-11-10 19:44:59 +00001114 D->getPartialSpecializations(PartialSpecs);
1115 for (unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
Rafael Espindola8db352d2013-10-17 15:37:26 +00001116 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
Douglas Gregor869853e2010-11-10 19:44:59 +00001117 OutOfLinePartialSpecs.push_back(std::make_pair(Inst, PartialSpecs[I]));
1118 }
1119
John McCall87a44eb2009-08-20 01:44:21 +00001120 return Inst;
1121}
1122
Douglas Gregore704c9d2009-08-27 16:57:43 +00001123Decl *
Douglas Gregore4b05162009-10-07 17:21:34 +00001124TemplateDeclInstantiator::VisitClassTemplatePartialSpecializationDecl(
1125 ClassTemplatePartialSpecializationDecl *D) {
Douglas Gregor21610382009-10-29 00:04:11 +00001126 ClassTemplateDecl *ClassTemplate = D->getSpecializedTemplate();
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001127
Douglas Gregor21610382009-10-29 00:04:11 +00001128 // Lookup the already-instantiated declaration in the instantiation
1129 // of the class template and return that.
1130 DeclContext::lookup_result Found
1131 = Owner->lookup(ClassTemplate->getDeclName());
David Blaikieff7d47a2012-12-19 00:45:41 +00001132 if (Found.empty())
Craig Topperc3ec1492014-05-26 06:22:03 +00001133 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001134
Douglas Gregor21610382009-10-29 00:04:11 +00001135 ClassTemplateDecl *InstClassTemplate
David Blaikieff7d47a2012-12-19 00:45:41 +00001136 = dyn_cast<ClassTemplateDecl>(Found.front());
Douglas Gregor21610382009-10-29 00:04:11 +00001137 if (!InstClassTemplate)
Craig Topperc3ec1492014-05-26 06:22:03 +00001138 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001139
Douglas Gregor869853e2010-11-10 19:44:59 +00001140 if (ClassTemplatePartialSpecializationDecl *Result
1141 = InstClassTemplate->findPartialSpecInstantiatedFromMember(D))
1142 return Result;
1143
1144 return InstantiateClassTemplatePartialSpecialization(InstClassTemplate, D);
Douglas Gregore4b05162009-10-07 17:21:34 +00001145}
1146
Larisse Voufo39a1e502013-08-06 01:03:05 +00001147Decl *TemplateDeclInstantiator::VisitVarTemplateDecl(VarTemplateDecl *D) {
1148 assert(D->getTemplatedDecl()->isStaticDataMember() &&
1149 "Only static data member templates are allowed.");
Larisse Voufo39a1e502013-08-06 01:03:05 +00001150
1151 // Create a local instantiation scope for this variable template, which
1152 // will contain the instantiations of the template parameters.
1153 LocalInstantiationScope Scope(SemaRef);
1154 TemplateParameterList *TempParams = D->getTemplateParameters();
1155 TemplateParameterList *InstParams = SubstTemplateParams(TempParams);
1156 if (!InstParams)
Craig Topperc3ec1492014-05-26 06:22:03 +00001157 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00001158
1159 VarDecl *Pattern = D->getTemplatedDecl();
Craig Topperc3ec1492014-05-26 06:22:03 +00001160 VarTemplateDecl *PrevVarTemplate = nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00001161
Richard Smith41c79d92014-10-11 00:37:16 +00001162 if (getPreviousDeclForInstantiation(Pattern)) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00001163 DeclContext::lookup_result Found = Owner->lookup(Pattern->getDeclName());
1164 if (!Found.empty())
1165 PrevVarTemplate = dyn_cast<VarTemplateDecl>(Found.front());
1166 }
1167
Richard Smith1c34fb72013-08-13 18:18:50 +00001168 VarDecl *VarInst =
Larisse Voufo72caf2b2013-08-22 00:59:14 +00001169 cast_or_null<VarDecl>(VisitVarDecl(Pattern,
1170 /*InstantiatingVarTemplate=*/true));
Nick Lewycky6ca07ca2015-08-10 21:54:08 +00001171 if (!VarInst) return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00001172
1173 DeclContext *DC = Owner;
1174
Larisse Voufo39a1e502013-08-06 01:03:05 +00001175 VarTemplateDecl *Inst = VarTemplateDecl::Create(
1176 SemaRef.Context, DC, D->getLocation(), D->getIdentifier(), InstParams,
Richard Smithbeef3452014-01-16 23:39:20 +00001177 VarInst);
Larisse Voufo39a1e502013-08-06 01:03:05 +00001178 VarInst->setDescribedVarTemplate(Inst);
Richard Smithbeef3452014-01-16 23:39:20 +00001179 Inst->setPreviousDecl(PrevVarTemplate);
Larisse Voufo39a1e502013-08-06 01:03:05 +00001180
1181 Inst->setAccess(D->getAccess());
1182 if (!PrevVarTemplate)
1183 Inst->setInstantiatedFromMemberTemplate(D);
1184
1185 if (D->isOutOfLine()) {
1186 Inst->setLexicalDeclContext(D->getLexicalDeclContext());
1187 VarInst->setLexicalDeclContext(D->getLexicalDeclContext());
1188 }
1189
1190 Owner->addDecl(Inst);
1191
1192 if (!PrevVarTemplate) {
1193 // Queue up any out-of-line partial specializations of this member
1194 // variable template; the client will force their instantiation once
1195 // the enclosing class has been instantiated.
1196 SmallVector<VarTemplatePartialSpecializationDecl *, 4> PartialSpecs;
1197 D->getPartialSpecializations(PartialSpecs);
1198 for (unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
Rafael Espindola8db352d2013-10-17 15:37:26 +00001199 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
Larisse Voufo39a1e502013-08-06 01:03:05 +00001200 OutOfLineVarPartialSpecs.push_back(
1201 std::make_pair(Inst, PartialSpecs[I]));
1202 }
1203
1204 return Inst;
1205}
1206
1207Decl *TemplateDeclInstantiator::VisitVarTemplatePartialSpecializationDecl(
1208 VarTemplatePartialSpecializationDecl *D) {
1209 assert(D->isStaticDataMember() &&
1210 "Only static data member templates are allowed.");
Larisse Voufo39a1e502013-08-06 01:03:05 +00001211
1212 VarTemplateDecl *VarTemplate = D->getSpecializedTemplate();
1213
1214 // Lookup the already-instantiated declaration and return that.
1215 DeclContext::lookup_result Found = Owner->lookup(VarTemplate->getDeclName());
1216 assert(!Found.empty() && "Instantiation found nothing?");
1217
1218 VarTemplateDecl *InstVarTemplate = dyn_cast<VarTemplateDecl>(Found.front());
1219 assert(InstVarTemplate && "Instantiation did not find a variable template?");
1220
1221 if (VarTemplatePartialSpecializationDecl *Result =
1222 InstVarTemplate->findPartialSpecInstantiatedFromMember(D))
1223 return Result;
1224
1225 return InstantiateVarTemplatePartialSpecialization(InstVarTemplate, D);
1226}
1227
Douglas Gregore4b05162009-10-07 17:21:34 +00001228Decl *
Douglas Gregore704c9d2009-08-27 16:57:43 +00001229TemplateDeclInstantiator::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
Douglas Gregor954de172009-10-31 17:21:17 +00001230 // Create a local instantiation scope for this function template, which
1231 // will contain the instantiations of the template parameters and then get
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001232 // merged with the local instantiation scope for the function template
Douglas Gregor954de172009-10-31 17:21:17 +00001233 // itself.
John McCall19c1bfd2010-08-25 05:32:35 +00001234 LocalInstantiationScope Scope(SemaRef);
Douglas Gregor14cf7522010-04-30 18:55:50 +00001235
Douglas Gregore704c9d2009-08-27 16:57:43 +00001236 TemplateParameterList *TempParams = D->getTemplateParameters();
1237 TemplateParameterList *InstParams = SubstTemplateParams(TempParams);
Mike Stump11289f42009-09-09 15:08:12 +00001238 if (!InstParams)
Craig Topperc3ec1492014-05-26 06:22:03 +00001239 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001240
Craig Topperc3ec1492014-05-26 06:22:03 +00001241 FunctionDecl *Instantiated = nullptr;
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001242 if (CXXMethodDecl *DMethod = dyn_cast<CXXMethodDecl>(D->getTemplatedDecl()))
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001243 Instantiated = cast_or_null<FunctionDecl>(VisitCXXMethodDecl(DMethod,
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001244 InstParams));
1245 else
1246 Instantiated = cast_or_null<FunctionDecl>(VisitFunctionDecl(
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001247 D->getTemplatedDecl(),
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001248 InstParams));
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001249
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001250 if (!Instantiated)
Craig Topperc3ec1492014-05-26 06:22:03 +00001251 return nullptr;
Douglas Gregore704c9d2009-08-27 16:57:43 +00001252
Mike Stump11289f42009-09-09 15:08:12 +00001253 // Link the instantiated function template declaration to the function
Douglas Gregore704c9d2009-08-27 16:57:43 +00001254 // template from which it was instantiated.
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001255 FunctionTemplateDecl *InstTemplate
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001256 = Instantiated->getDescribedFunctionTemplate();
Douglas Gregorca027af2009-10-12 22:27:17 +00001257 InstTemplate->setAccess(D->getAccess());
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001258 assert(InstTemplate &&
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001259 "VisitFunctionDecl/CXXMethodDecl didn't create a template!");
John McCall2079d0b2009-12-14 23:19:40 +00001260
John McCall30837102010-03-26 23:10:15 +00001261 bool isFriend = (InstTemplate->getFriendObjectKind() != Decl::FOK_None);
1262
John McCall2079d0b2009-12-14 23:19:40 +00001263 // Link the instantiation back to the pattern *unless* this is a
1264 // non-definition friend declaration.
1265 if (!InstTemplate->getInstantiatedFromMemberTemplate() &&
John McCall30837102010-03-26 23:10:15 +00001266 !(isFriend && !D->getTemplatedDecl()->isThisDeclarationADefinition()))
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001267 InstTemplate->setInstantiatedFromMemberTemplate(D);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001268
John McCall30837102010-03-26 23:10:15 +00001269 // Make declarations visible in the appropriate context.
John McCalla0a96892012-08-10 03:15:35 +00001270 if (!isFriend) {
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001271 Owner->addDecl(InstTemplate);
John McCalla0a96892012-08-10 03:15:35 +00001272 } else if (InstTemplate->getDeclContext()->isRecord() &&
Richard Smith41c79d92014-10-11 00:37:16 +00001273 !getPreviousDeclForInstantiation(D)) {
John McCalla0a96892012-08-10 03:15:35 +00001274 SemaRef.CheckFriendAccess(InstTemplate);
1275 }
John McCall30837102010-03-26 23:10:15 +00001276
Douglas Gregore704c9d2009-08-27 16:57:43 +00001277 return InstTemplate;
1278}
1279
Douglas Gregor8ea8fd42009-03-25 21:17:03 +00001280Decl *TemplateDeclInstantiator::VisitCXXRecordDecl(CXXRecordDecl *D) {
Craig Topperc3ec1492014-05-26 06:22:03 +00001281 CXXRecordDecl *PrevDecl = nullptr;
Douglas Gregor8ea8fd42009-03-25 21:17:03 +00001282 if (D->isInjectedClassName())
1283 PrevDecl = cast<CXXRecordDecl>(Owner);
Richard Smith41c79d92014-10-11 00:37:16 +00001284 else if (CXXRecordDecl *PatternPrev = getPreviousDeclForInstantiation(D)) {
Douglas Gregora04f2ca2010-03-01 15:56:25 +00001285 NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->getLocation(),
Richard Smith41c79d92014-10-11 00:37:16 +00001286 PatternPrev,
John McCalle9f92a02009-12-15 22:29:06 +00001287 TemplateArgs);
Craig Topperc3ec1492014-05-26 06:22:03 +00001288 if (!Prev) return nullptr;
John McCalle9f92a02009-12-15 22:29:06 +00001289 PrevDecl = cast<CXXRecordDecl>(Prev);
1290 }
Douglas Gregor8ea8fd42009-03-25 21:17:03 +00001291
1292 CXXRecordDecl *Record
Mike Stump11289f42009-09-09 15:08:12 +00001293 = CXXRecordDecl::Create(SemaRef.Context, D->getTagKind(), Owner,
Abramo Bagnara29c2d462011-03-09 14:09:51 +00001294 D->getLocStart(), D->getLocation(),
1295 D->getIdentifier(), PrevDecl);
John McCall3e11ebe2010-03-15 10:12:16 +00001296
1297 // Substitute the nested name specifier, if any.
1298 if (SubstQualifier(D, Record))
Craig Topperc3ec1492014-05-26 06:22:03 +00001299 return nullptr;
John McCall3e11ebe2010-03-15 10:12:16 +00001300
Douglas Gregor8ea8fd42009-03-25 21:17:03 +00001301 Record->setImplicit(D->isImplicit());
Eli Friedmanbda4ef12009-08-27 19:11:42 +00001302 // FIXME: Check against AS_none is an ugly hack to work around the issue that
1303 // the tag decls introduced by friend class declarations don't have an access
1304 // specifier. Remove once this area of the code gets sorted out.
1305 if (D->getAccess() != AS_none)
1306 Record->setAccess(D->getAccess());
Douglas Gregor8ea8fd42009-03-25 21:17:03 +00001307 if (!D->isInjectedClassName())
Douglas Gregorbbe8f462009-10-08 15:14:33 +00001308 Record->setInstantiationOfMemberClass(D, TSK_ImplicitInstantiation);
Douglas Gregor8ea8fd42009-03-25 21:17:03 +00001309
John McCallaa74a0c2009-08-28 07:59:38 +00001310 // If the original function was part of a friend declaration,
1311 // inherit its namespace state.
Richard Smith64017682013-07-17 23:53:16 +00001312 if (D->getFriendObjectKind())
1313 Record->setObjectOfFriendDecl();
John McCallaa74a0c2009-08-28 07:59:38 +00001314
Douglas Gregor04163182010-05-21 00:31:19 +00001315 // Make sure that anonymous structs and unions are recorded.
David Majnemer192d1792013-11-27 08:20:38 +00001316 if (D->isAnonymousStructOrUnion())
Douglas Gregor04163182010-05-21 00:31:19 +00001317 Record->setAnonymousStructOrUnion(true);
David Majnemer192d1792013-11-27 08:20:38 +00001318
1319 if (D->isLocalClass())
1320 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Record);
Anders Carlsson5da84842009-09-01 04:26:58 +00001321
David Majnemerdbc0c8f2013-12-04 09:01:55 +00001322 // Forward the mangling number from the template to the instantiated decl.
1323 SemaRef.Context.setManglingNumber(Record,
1324 SemaRef.Context.getManglingNumber(D));
1325
David Majnemer00350522015-08-31 18:48:39 +00001326 // See if the old tag was defined along with a declarator.
1327 // If it did, mark the new tag as being associated with that declarator.
1328 if (DeclaratorDecl *DD = SemaRef.Context.getDeclaratorForUnnamedTagDecl(D))
1329 SemaRef.Context.addDeclaratorForUnnamedTagDecl(Record, DD);
1330
1331 // See if the old tag was defined along with a typedef.
1332 // If it did, mark the new tag as being associated with that typedef.
1333 if (TypedefNameDecl *TND = SemaRef.Context.getTypedefNameForUnnamedTagDecl(D))
1334 SemaRef.Context.addTypedefNameForUnnamedTagDecl(Record, TND);
1335
Argyrios Kyrtzidiscfbfe782009-06-30 02:36:12 +00001336 Owner->addDecl(Record);
David Majnemer192d1792013-11-27 08:20:38 +00001337
1338 // DR1484 clarifies that the members of a local class are instantiated as part
1339 // of the instantiation of their enclosing entity.
1340 if (D->isCompleteDefinition() && D->isLocalClass()) {
Richard Smithb0b68012015-05-11 23:09:06 +00001341 Sema::SavePendingLocalImplicitInstantiationsRAII
1342 SavedPendingLocalImplicitInstantiations(SemaRef);
1343
David Majnemera64cb5a2014-02-22 00:17:46 +00001344 SemaRef.InstantiateClass(D->getLocation(), Record, D, TemplateArgs,
1345 TSK_ImplicitInstantiation,
1346 /*Complain=*/true);
Richard Smithb0b68012015-05-11 23:09:06 +00001347
David Majnemera64cb5a2014-02-22 00:17:46 +00001348 SemaRef.InstantiateClassMembers(D->getLocation(), Record, TemplateArgs,
1349 TSK_ImplicitInstantiation);
Richard Smithb0b68012015-05-11 23:09:06 +00001350
1351 // This class may have local implicit instantiations that need to be
1352 // performed within this scope.
1353 SemaRef.PerformPendingInstantiations(/*LocalOnly=*/true);
David Majnemer192d1792013-11-27 08:20:38 +00001354 }
Nico Weber72889432014-09-06 01:25:55 +00001355
1356 SemaRef.DiagnoseUnusedNestedTypedefs(Record);
1357
Douglas Gregor8ea8fd42009-03-25 21:17:03 +00001358 return Record;
1359}
1360
Douglas Gregor89f593a2012-09-13 21:56:43 +00001361/// \brief Adjust the given function type for an instantiation of the
1362/// given declaration, to cope with modifications to the function's type that
1363/// aren't reflected in the type-source information.
1364///
1365/// \param D The declaration we're instantiating.
1366/// \param TInfo The already-instantiated type.
1367static QualType adjustFunctionTypeForInstantiation(ASTContext &Context,
1368 FunctionDecl *D,
1369 TypeSourceInfo *TInfo) {
Douglas Gregor1af8ad42012-09-13 22:01:49 +00001370 const FunctionProtoType *OrigFunc
1371 = D->getType()->castAs<FunctionProtoType>();
1372 const FunctionProtoType *NewFunc
1373 = TInfo->getType()->castAs<FunctionProtoType>();
1374 if (OrigFunc->getExtInfo() == NewFunc->getExtInfo())
1375 return TInfo->getType();
1376
1377 FunctionProtoType::ExtProtoInfo NewEPI = NewFunc->getExtProtoInfo();
1378 NewEPI.ExtInfo = OrigFunc->getExtInfo();
Alp Toker314cc812014-01-25 16:55:45 +00001379 return Context.getFunctionType(NewFunc->getReturnType(),
Alp Toker9cacbab2014-01-20 20:26:09 +00001380 NewFunc->getParamTypes(), NewEPI);
Douglas Gregor89f593a2012-09-13 21:56:43 +00001381}
1382
John McCallaa74a0c2009-08-28 07:59:38 +00001383/// Normal class members are of more specific types and therefore
1384/// don't make it here. This function serves two purposes:
1385/// 1) instantiating function templates
1386/// 2) substituting friend declarations
Douglas Gregor33636e62009-12-24 20:56:24 +00001387Decl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D,
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001388 TemplateParameterList *TemplateParams) {
Douglas Gregor8f5d4422009-06-29 20:59:39 +00001389 // Check whether there is already a function template specialization for
1390 // this declaration.
1391 FunctionTemplateDecl *FunctionTemplate = D->getDescribedFunctionTemplate();
John McCall2f88d7d2010-03-27 05:57:59 +00001392 if (FunctionTemplate && !TemplateParams) {
Richard Smith47752e42013-05-03 23:46:09 +00001393 ArrayRef<TemplateArgument> Innermost = TemplateArgs.getInnermost();
Mike Stump11289f42009-09-09 15:08:12 +00001394
Craig Topperc3ec1492014-05-26 06:22:03 +00001395 void *InsertPos = nullptr;
Argyrios Kyrtzidisdde57902010-07-20 13:59:58 +00001396 FunctionDecl *SpecFunc
Craig Topper7e0daca2014-06-26 04:58:53 +00001397 = FunctionTemplate->findSpecialization(Innermost, InsertPos);
Mike Stump11289f42009-09-09 15:08:12 +00001398
Douglas Gregor8f5d4422009-06-29 20:59:39 +00001399 // If we already have a function template specialization, return it.
Argyrios Kyrtzidisdde57902010-07-20 13:59:58 +00001400 if (SpecFunc)
1401 return SpecFunc;
Douglas Gregor8f5d4422009-06-29 20:59:39 +00001402 }
Mike Stump11289f42009-09-09 15:08:12 +00001403
John McCall2f88d7d2010-03-27 05:57:59 +00001404 bool isFriend;
1405 if (FunctionTemplate)
1406 isFriend = (FunctionTemplate->getFriendObjectKind() != Decl::FOK_None);
1407 else
1408 isFriend = (D->getFriendObjectKind() != Decl::FOK_None);
1409
Craig Topperc3ec1492014-05-26 06:22:03 +00001410 bool MergeWithParentScope = (TemplateParams != nullptr) ||
Douglas Gregor9f44d142010-05-21 21:25:08 +00001411 Owner->isFunctionOrMethod() ||
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001412 !(isa<Decl>(Owner) &&
Douglas Gregorf5974fa2010-01-16 20:21:20 +00001413 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
John McCall19c1bfd2010-08-25 05:32:35 +00001414 LocalInstantiationScope Scope(SemaRef, MergeWithParentScope);
Mike Stump11289f42009-09-09 15:08:12 +00001415
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001416 SmallVector<ParmVarDecl *, 4> Params;
David Blaikie4d142962011-11-10 05:42:04 +00001417 TypeSourceInfo *TInfo = SubstFunctionType(D, Params);
John McCall58f10c32010-03-11 09:03:00 +00001418 if (!TInfo)
Craig Topperc3ec1492014-05-26 06:22:03 +00001419 return nullptr;
Douglas Gregor89f593a2012-09-13 21:56:43 +00001420 QualType T = adjustFunctionTypeForInstantiation(SemaRef.Context, D, TInfo);
John McCall58de3582009-08-14 02:03:10 +00001421
Douglas Gregor14454802011-02-25 02:25:35 +00001422 NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc();
1423 if (QualifierLoc) {
1424 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
1425 TemplateArgs);
1426 if (!QualifierLoc)
Craig Topperc3ec1492014-05-26 06:22:03 +00001427 return nullptr;
John McCalle0b2ddb2010-03-26 04:53:08 +00001428 }
1429
John McCallce410662010-02-06 01:50:47 +00001430 // If we're instantiating a local function declaration, put the result
Richard Smith541b38b2013-09-20 01:15:31 +00001431 // in the enclosing namespace; otherwise we need to find the instantiated
1432 // context.
John McCallce410662010-02-06 01:50:47 +00001433 DeclContext *DC;
Richard Smith541b38b2013-09-20 01:15:31 +00001434 if (D->isLocalExternDecl()) {
John McCallce410662010-02-06 01:50:47 +00001435 DC = Owner;
Richard Smith541b38b2013-09-20 01:15:31 +00001436 SemaRef.adjustContextForLocalExternDecl(DC);
1437 } else if (isFriend && QualifierLoc) {
John McCalle0b2ddb2010-03-26 04:53:08 +00001438 CXXScopeSpec SS;
Douglas Gregor14454802011-02-25 02:25:35 +00001439 SS.Adopt(QualifierLoc);
John McCalle0b2ddb2010-03-26 04:53:08 +00001440 DC = SemaRef.computeDeclContext(SS);
Craig Topperc3ec1492014-05-26 06:22:03 +00001441 if (!DC) return nullptr;
John McCalle0b2ddb2010-03-26 04:53:08 +00001442 } else {
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001443 DC = SemaRef.FindInstantiatedContext(D->getLocation(), D->getDeclContext(),
Douglas Gregora04f2ca2010-03-01 15:56:25 +00001444 TemplateArgs);
John McCalle0b2ddb2010-03-26 04:53:08 +00001445 }
John McCallce410662010-02-06 01:50:47 +00001446
John McCallaa74a0c2009-08-28 07:59:38 +00001447 FunctionDecl *Function =
Abramo Bagnaradff19302011-03-08 08:55:46 +00001448 FunctionDecl::Create(SemaRef.Context, DC, D->getInnerLocStart(),
Abramo Bagnara0d4fce12012-10-04 21:40:42 +00001449 D->getNameInfo(), T, TInfo,
Rafael Espindola9dd86de2013-04-16 02:29:15 +00001450 D->getCanonicalDecl()->getStorageClass(),
Reid Kleckner0f764e52015-04-07 20:46:51 +00001451 D->isInlineSpecified(), D->hasWrittenPrototype(),
Richard Smith3607ffe2012-02-13 03:54:03 +00001452 D->isConstexpr());
Enea Zaffanella25723ce2013-07-19 18:02:36 +00001453 Function->setRangeEnd(D->getSourceRange().getEnd());
John McCall3e11ebe2010-03-15 10:12:16 +00001454
Richard Smithf3814ad2013-01-25 00:08:28 +00001455 if (D->isInlined())
1456 Function->setImplicitlyInline();
1457
Douglas Gregor14454802011-02-25 02:25:35 +00001458 if (QualifierLoc)
1459 Function->setQualifierInfo(QualifierLoc);
John McCall3e11ebe2010-03-15 10:12:16 +00001460
Richard Smith541b38b2013-09-20 01:15:31 +00001461 if (D->isLocalExternDecl())
1462 Function->setLocalExternDecl();
1463
John McCall30837102010-03-26 23:10:15 +00001464 DeclContext *LexicalDC = Owner;
Richard Smith541b38b2013-09-20 01:15:31 +00001465 if (!isFriend && D->isOutOfLine() && !D->isLocalExternDecl()) {
John McCall30837102010-03-26 23:10:15 +00001466 assert(D->getDeclContext()->isFileContext());
1467 LexicalDC = D->getDeclContext();
1468 }
1469
1470 Function->setLexicalDeclContext(LexicalDC);
Mike Stump11289f42009-09-09 15:08:12 +00001471
Douglas Gregorad3f2fc2009-06-25 22:08:12 +00001472 // Attach the parameters
Reid Klecknera09e44c2013-07-31 21:00:18 +00001473 for (unsigned P = 0; P < Params.size(); ++P)
1474 if (Params[P])
1475 Params[P]->setOwningFunction(Function);
David Blaikie9c70e042011-09-21 18:16:56 +00001476 Function->setParams(Params);
John McCallaa74a0c2009-08-28 07:59:38 +00001477
Douglas Gregor1cd6ea02010-05-17 16:38:00 +00001478 SourceLocation InstantiateAtPOI;
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001479 if (TemplateParams) {
1480 // Our resulting instantiation is actually a function template, since we
1481 // are substituting only the outer template parameters. For example, given
1482 //
1483 // template<typename T>
1484 // struct X {
1485 // template<typename U> friend void f(T, U);
1486 // };
1487 //
1488 // X<int> x;
1489 //
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001490 // We are instantiating the friend function template "f" within X<int>,
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001491 // which means substituting int for T, but leaving "f" as a friend function
1492 // template.
1493 // Build the function template itself.
John McCalle0b2ddb2010-03-26 04:53:08 +00001494 FunctionTemplate = FunctionTemplateDecl::Create(SemaRef.Context, DC,
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001495 Function->getLocation(),
1496 Function->getDeclName(),
1497 TemplateParams, Function);
1498 Function->setDescribedFunctionTemplate(FunctionTemplate);
John McCall30837102010-03-26 23:10:15 +00001499
1500 FunctionTemplate->setLexicalDeclContext(LexicalDC);
John McCalle0b2ddb2010-03-26 04:53:08 +00001501
1502 if (isFriend && D->isThisDeclarationADefinition()) {
1503 // TODO: should we remember this connection regardless of whether
1504 // the friend declaration provided a body?
1505 FunctionTemplate->setInstantiatedFromMemberTemplate(
1506 D->getDescribedFunctionTemplate());
1507 }
Douglas Gregorffe14e32009-11-14 01:20:54 +00001508 } else if (FunctionTemplate) {
1509 // Record this function template specialization.
Richard Smith47752e42013-05-03 23:46:09 +00001510 ArrayRef<TemplateArgument> Innermost = TemplateArgs.getInnermost();
Douglas Gregord5058122010-02-11 01:19:42 +00001511 Function->setFunctionTemplateSpecialization(FunctionTemplate,
Douglas Gregor1ccc8412010-11-07 23:05:16 +00001512 TemplateArgumentList::CreateCopy(SemaRef.Context,
Richard Smith47752e42013-05-03 23:46:09 +00001513 Innermost.begin(),
1514 Innermost.size()),
Craig Topperc3ec1492014-05-26 06:22:03 +00001515 /*InsertPos=*/nullptr);
Chandler Carruth48b28312011-08-18 09:09:59 +00001516 } else if (isFriend) {
1517 // Note, we need this connection even if the friend doesn't have a body.
1518 // Its body may exist but not have been attached yet due to deferred
1519 // parsing.
1520 // FIXME: It might be cleaner to set this when attaching the body to the
1521 // friend function declaration, however that would require finding all the
1522 // instantiations and modifying them.
John McCalle0b2ddb2010-03-26 04:53:08 +00001523 Function->setInstantiationOfMemberFunction(D, TSK_ImplicitInstantiation);
John McCallaa74a0c2009-08-28 07:59:38 +00001524 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001525
Douglas Gregorad3f2fc2009-06-25 22:08:12 +00001526 if (InitFunctionInstantiation(Function, D))
1527 Function->setInvalidDecl();
Mike Stump11289f42009-09-09 15:08:12 +00001528
John McCallb9c78482010-04-08 09:05:18 +00001529 bool isExplicitSpecialization = false;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001530
Richard Smith541b38b2013-09-20 01:15:31 +00001531 LookupResult Previous(
1532 SemaRef, Function->getDeclName(), SourceLocation(),
1533 D->isLocalExternDecl() ? Sema::LookupRedeclarationWithLinkage
1534 : Sema::LookupOrdinaryName,
1535 Sema::ForRedeclaration);
John McCall1f82f242009-11-18 22:49:29 +00001536
John McCallb9c78482010-04-08 09:05:18 +00001537 if (DependentFunctionTemplateSpecializationInfo *Info
1538 = D->getDependentSpecializationInfo()) {
1539 assert(isFriend && "non-friend has dependent specialization info?");
1540
1541 // This needs to be set now for future sanity.
Richard Smith64017682013-07-17 23:53:16 +00001542 Function->setObjectOfFriendDecl();
John McCallb9c78482010-04-08 09:05:18 +00001543
1544 // Instantiate the explicit template arguments.
1545 TemplateArgumentListInfo ExplicitArgs(Info->getLAngleLoc(),
1546 Info->getRAngleLoc());
Douglas Gregor0f3feb42010-12-22 21:19:48 +00001547 if (SemaRef.Subst(Info->getTemplateArgs(), Info->getNumTemplateArgs(),
1548 ExplicitArgs, TemplateArgs))
Craig Topperc3ec1492014-05-26 06:22:03 +00001549 return nullptr;
John McCallb9c78482010-04-08 09:05:18 +00001550
1551 // Map the candidate templates to their instantiations.
1552 for (unsigned I = 0, E = Info->getNumTemplates(); I != E; ++I) {
1553 Decl *Temp = SemaRef.FindInstantiatedDecl(D->getLocation(),
1554 Info->getTemplate(I),
1555 TemplateArgs);
Craig Topperc3ec1492014-05-26 06:22:03 +00001556 if (!Temp) return nullptr;
John McCallb9c78482010-04-08 09:05:18 +00001557
1558 Previous.addDecl(cast<FunctionTemplateDecl>(Temp));
1559 }
1560
1561 if (SemaRef.CheckFunctionTemplateSpecialization(Function,
1562 &ExplicitArgs,
1563 Previous))
1564 Function->setInvalidDecl();
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001565
John McCallb9c78482010-04-08 09:05:18 +00001566 isExplicitSpecialization = true;
1567
1568 } else if (TemplateParams || !FunctionTemplate) {
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001569 // Look only into the namespace where the friend would be declared to
1570 // find a previous declaration. This is the innermost enclosing namespace,
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001571 // as described in ActOnFriendFunctionDecl.
John McCall1f82f242009-11-18 22:49:29 +00001572 SemaRef.LookupQualifiedName(Previous, DC);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001573
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001574 // In C++, the previous declaration we find might be a tag type
1575 // (class or enum). In this case, the new declaration will hide the
1576 // tag type. Note that this does does not apply if we're declaring a
1577 // typedef (C++ [dcl.typedef]p4).
John McCall1f82f242009-11-18 22:49:29 +00001578 if (Previous.isSingleTagDecl())
1579 Previous.clear();
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001580 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001581
Craig Topperc3ec1492014-05-26 06:22:03 +00001582 SemaRef.CheckFunctionDeclaration(/*Scope*/ nullptr, Function, Previous,
Kaelyn Uhrain4dc695d2011-10-11 00:28:45 +00001583 isExplicitSpecialization);
Douglas Gregorf4f296d2009-03-23 23:06:20 +00001584
John McCallb9467b62010-04-24 01:30:58 +00001585 NamedDecl *PrincipalDecl = (TemplateParams
1586 ? cast<NamedDecl>(FunctionTemplate)
1587 : Function);
1588
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001589 // If the original function was part of a friend declaration,
1590 // inherit its namespace state and add it to the owner.
John McCalle0b2ddb2010-03-26 04:53:08 +00001591 if (isFriend) {
Richard Smith64017682013-07-17 23:53:16 +00001592 PrincipalDecl->setObjectOfFriendDecl();
Richard Smith05afe5e2012-03-13 03:12:56 +00001593 DC->makeDeclVisibleInContext(PrincipalDecl);
Gabor Greif718d5152010-08-30 21:10:05 +00001594
Richard Smith91dfaac2014-02-03 02:37:59 +00001595 bool QueuedInstantiation = false;
Gabor Greif718d5152010-08-30 21:10:05 +00001596
Richard Smith91dfaac2014-02-03 02:37:59 +00001597 // C++11 [temp.friend]p4 (DR329):
1598 // When a function is defined in a friend function declaration in a class
1599 // template, the function is instantiated when the function is odr-used.
1600 // The same restrictions on multiple declarations and definitions that
1601 // apply to non-template function declarations and definitions also apply
1602 // to these implicit definitions.
1603 if (D->isThisDeclarationADefinition()) {
Douglas Gregorb92ea592010-05-18 05:45:02 +00001604 // Check for a function body.
Craig Topperc3ec1492014-05-26 06:22:03 +00001605 const FunctionDecl *Definition = nullptr;
Alexis Hunt4a8ea102011-05-06 20:44:56 +00001606 if (Function->isDefined(Definition) &&
Douglas Gregorb92ea592010-05-18 05:45:02 +00001607 Definition->getTemplateSpecializationKind() == TSK_Undeclared) {
Richard Smith91dfaac2014-02-03 02:37:59 +00001608 SemaRef.Diag(Function->getLocation(), diag::err_redefinition)
1609 << Function->getDeclName();
Douglas Gregorb92ea592010-05-18 05:45:02 +00001610 SemaRef.Diag(Definition->getLocation(), diag::note_previous_definition);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001611 }
Douglas Gregorb92ea592010-05-18 05:45:02 +00001612 // Check for redefinitions due to other instantiations of this or
1613 // a similar friend function.
Aaron Ballman86c93902014-03-06 23:45:36 +00001614 else for (auto R : Function->redecls()) {
1615 if (R == Function)
Gabor Greif122f1eb2010-08-28 15:42:30 +00001616 continue;
Richard Smith91dfaac2014-02-03 02:37:59 +00001617
1618 // If some prior declaration of this function has been used, we need
1619 // to instantiate its definition.
1620 if (!QueuedInstantiation && R->isUsed(false)) {
1621 if (MemberSpecializationInfo *MSInfo =
1622 Function->getMemberSpecializationInfo()) {
1623 if (MSInfo->getPointOfInstantiation().isInvalid()) {
1624 SourceLocation Loc = R->getLocation(); // FIXME
1625 MSInfo->setPointOfInstantiation(Loc);
1626 SemaRef.PendingLocalImplicitInstantiations.push_back(
1627 std::make_pair(Function, Loc));
1628 QueuedInstantiation = true;
Gabor Greif718d5152010-08-30 21:10:05 +00001629 }
1630 }
Richard Smith91dfaac2014-02-03 02:37:59 +00001631 }
1632
1633 // If some prior declaration of this function was a friend with an
1634 // uninstantiated definition, reject it.
1635 if (R->getFriendObjectKind()) {
1636 if (const FunctionDecl *RPattern =
1637 R->getTemplateInstantiationPattern()) {
Alexis Hunt4a8ea102011-05-06 20:44:56 +00001638 if (RPattern->isDefined(RPattern)) {
Richard Smith91dfaac2014-02-03 02:37:59 +00001639 SemaRef.Diag(Function->getLocation(), diag::err_redefinition)
Douglas Gregorb92ea592010-05-18 05:45:02 +00001640 << Function->getDeclName();
Gabor Greifae849e42010-08-28 15:46:56 +00001641 SemaRef.Diag(R->getLocation(), diag::note_previous_definition);
Douglas Gregorb92ea592010-05-18 05:45:02 +00001642 break;
1643 }
Richard Smith91dfaac2014-02-03 02:37:59 +00001644 }
Douglas Gregorb92ea592010-05-18 05:45:02 +00001645 }
1646 }
1647 }
Douglas Gregor3a88c1d2009-10-13 14:39:41 +00001648 }
1649
Richard Smith541b38b2013-09-20 01:15:31 +00001650 if (Function->isLocalExternDecl() && !Function->getPreviousDecl())
1651 DC->makeDeclVisibleInContext(PrincipalDecl);
1652
John McCallb9467b62010-04-24 01:30:58 +00001653 if (Function->isOverloadedOperator() && !DC->isRecord() &&
1654 PrincipalDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))
1655 PrincipalDecl->setNonMemberOperator();
1656
Alexis Hunt1fb4e762011-05-23 21:07:59 +00001657 assert(!D->isDefaulted() && "only methods should be defaulted");
Douglas Gregorad3f2fc2009-06-25 22:08:12 +00001658 return Function;
1659}
1660
Douglas Gregore704c9d2009-08-27 16:57:43 +00001661Decl *
1662TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D,
Francois Pichet00c7e6c2011-08-14 03:52:19 +00001663 TemplateParameterList *TemplateParams,
1664 bool IsClassScopeSpecialization) {
Douglas Gregor97628d62009-08-21 00:16:32 +00001665 FunctionTemplateDecl *FunctionTemplate = D->getDescribedFunctionTemplate();
Douglas Gregore704c9d2009-08-27 16:57:43 +00001666 if (FunctionTemplate && !TemplateParams) {
Mike Stump11289f42009-09-09 15:08:12 +00001667 // We are creating a function template specialization from a function
1668 // template. Check whether there is already a function template
Douglas Gregore704c9d2009-08-27 16:57:43 +00001669 // specialization for this particular set of template arguments.
Richard Smith47752e42013-05-03 23:46:09 +00001670 ArrayRef<TemplateArgument> Innermost = TemplateArgs.getInnermost();
Mike Stump11289f42009-09-09 15:08:12 +00001671
Craig Topperc3ec1492014-05-26 06:22:03 +00001672 void *InsertPos = nullptr;
Argyrios Kyrtzidisdde57902010-07-20 13:59:58 +00001673 FunctionDecl *SpecFunc
Craig Topper7e0daca2014-06-26 04:58:53 +00001674 = FunctionTemplate->findSpecialization(Innermost, InsertPos);
Mike Stump11289f42009-09-09 15:08:12 +00001675
Douglas Gregor97628d62009-08-21 00:16:32 +00001676 // If we already have a function template specialization, return it.
Argyrios Kyrtzidisdde57902010-07-20 13:59:58 +00001677 if (SpecFunc)
1678 return SpecFunc;
Douglas Gregor97628d62009-08-21 00:16:32 +00001679 }
1680
John McCall2f88d7d2010-03-27 05:57:59 +00001681 bool isFriend;
1682 if (FunctionTemplate)
1683 isFriend = (FunctionTemplate->getFriendObjectKind() != Decl::FOK_None);
1684 else
1685 isFriend = (D->getFriendObjectKind() != Decl::FOK_None);
1686
Craig Topperc3ec1492014-05-26 06:22:03 +00001687 bool MergeWithParentScope = (TemplateParams != nullptr) ||
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001688 !(isa<Decl>(Owner) &&
Douglas Gregorf5974fa2010-01-16 20:21:20 +00001689 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
John McCall19c1bfd2010-08-25 05:32:35 +00001690 LocalInstantiationScope Scope(SemaRef, MergeWithParentScope);
Douglas Gregor37256522009-05-14 21:44:34 +00001691
John McCalld0e23ec2010-10-19 02:26:41 +00001692 // Instantiate enclosing template arguments for friends.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001693 SmallVector<TemplateParameterList *, 4> TempParamLists;
John McCalld0e23ec2010-10-19 02:26:41 +00001694 unsigned NumTempParamLists = 0;
1695 if (isFriend && (NumTempParamLists = D->getNumTemplateParameterLists())) {
Benjamin Kramer9dc549b2015-08-04 14:46:06 +00001696 TempParamLists.resize(NumTempParamLists);
John McCalld0e23ec2010-10-19 02:26:41 +00001697 for (unsigned I = 0; I != NumTempParamLists; ++I) {
1698 TemplateParameterList *TempParams = D->getTemplateParameterList(I);
1699 TemplateParameterList *InstParams = SubstTemplateParams(TempParams);
1700 if (!InstParams)
Craig Topperc3ec1492014-05-26 06:22:03 +00001701 return nullptr;
John McCalld0e23ec2010-10-19 02:26:41 +00001702 TempParamLists[I] = InstParams;
1703 }
1704 }
1705
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001706 SmallVector<ParmVarDecl *, 4> Params;
Benjamin Kramer1dd48bc2012-01-20 14:42:32 +00001707 TypeSourceInfo *TInfo = SubstFunctionType(D, Params);
John McCall58f10c32010-03-11 09:03:00 +00001708 if (!TInfo)
Craig Topperc3ec1492014-05-26 06:22:03 +00001709 return nullptr;
Douglas Gregor89f593a2012-09-13 21:56:43 +00001710 QualType T = adjustFunctionTypeForInstantiation(SemaRef.Context, D, TInfo);
Douglas Gregorf4f296d2009-03-23 23:06:20 +00001711
Douglas Gregor14454802011-02-25 02:25:35 +00001712 NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc();
1713 if (QualifierLoc) {
1714 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
John McCall2f88d7d2010-03-27 05:57:59 +00001715 TemplateArgs);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001716 if (!QualifierLoc)
Craig Topperc3ec1492014-05-26 06:22:03 +00001717 return nullptr;
John McCall2f88d7d2010-03-27 05:57:59 +00001718 }
1719
1720 DeclContext *DC = Owner;
1721 if (isFriend) {
Douglas Gregor14454802011-02-25 02:25:35 +00001722 if (QualifierLoc) {
John McCall2f88d7d2010-03-27 05:57:59 +00001723 CXXScopeSpec SS;
Douglas Gregor14454802011-02-25 02:25:35 +00001724 SS.Adopt(QualifierLoc);
John McCall2f88d7d2010-03-27 05:57:59 +00001725 DC = SemaRef.computeDeclContext(SS);
John McCall1a1b53e2010-10-19 05:01:53 +00001726
1727 if (DC && SemaRef.RequireCompleteDeclContext(SS, DC))
Craig Topperc3ec1492014-05-26 06:22:03 +00001728 return nullptr;
John McCall2f88d7d2010-03-27 05:57:59 +00001729 } else {
1730 DC = SemaRef.FindInstantiatedContext(D->getLocation(),
1731 D->getDeclContext(),
1732 TemplateArgs);
1733 }
Craig Topperc3ec1492014-05-26 06:22:03 +00001734 if (!DC) return nullptr;
John McCall2f88d7d2010-03-27 05:57:59 +00001735 }
1736
Douglas Gregorf4f296d2009-03-23 23:06:20 +00001737 // Build the instantiated method declaration.
John McCall2f88d7d2010-03-27 05:57:59 +00001738 CXXRecordDecl *Record = cast<CXXRecordDecl>(DC);
Craig Topperc3ec1492014-05-26 06:22:03 +00001739 CXXMethodDecl *Method = nullptr;
Mike Stump11289f42009-09-09 15:08:12 +00001740
Abramo Bagnaradff19302011-03-08 08:55:46 +00001741 SourceLocation StartLoc = D->getInnerLocStart();
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001742 DeclarationNameInfo NameInfo
1743 = SemaRef.SubstDeclarationNameInfo(D->getNameInfo(), TemplateArgs);
Douglas Gregore8394862009-08-21 22:43:28 +00001744 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
Mike Stump11289f42009-09-09 15:08:12 +00001745 Method = CXXConstructorDecl::Create(SemaRef.Context, Record,
Abramo Bagnaradff19302011-03-08 08:55:46 +00001746 StartLoc, NameInfo, T, TInfo,
Mike Stump11289f42009-09-09 15:08:12 +00001747 Constructor->isExplicit(),
Reid Kleckner0f764e52015-04-07 20:46:51 +00001748 Constructor->isInlineSpecified(),
Richard Smith3607ffe2012-02-13 03:54:03 +00001749 false, Constructor->isConstexpr());
Richard Smith4c163a02013-05-17 02:19:35 +00001750
Richard Smith185be182013-04-10 05:48:59 +00001751 // Claim that the instantiation of a constructor or constructor template
1752 // inherits the same constructor that the template does.
Richard Smith4c163a02013-05-17 02:19:35 +00001753 if (CXXConstructorDecl *Inh = const_cast<CXXConstructorDecl *>(
1754 Constructor->getInheritedConstructor())) {
1755 // If we're instantiating a specialization of a function template, our
1756 // "inherited constructor" will actually itself be a function template.
1757 // Instantiate a declaration of it, too.
1758 if (FunctionTemplate) {
1759 assert(!TemplateParams && Inh->getDescribedFunctionTemplate() &&
1760 !Inh->getParent()->isDependentContext() &&
1761 "inheriting constructor template in dependent context?");
1762 Sema::InstantiatingTemplate Inst(SemaRef, Constructor->getLocation(),
1763 Inh);
Alp Tokerd4a72d52013-10-08 08:09:04 +00001764 if (Inst.isInvalid())
Craig Topperc3ec1492014-05-26 06:22:03 +00001765 return nullptr;
Richard Smith4c163a02013-05-17 02:19:35 +00001766 Sema::ContextRAII SavedContext(SemaRef, Inh->getDeclContext());
1767 LocalInstantiationScope LocalScope(SemaRef);
1768
1769 // Use the same template arguments that we deduced for the inheriting
1770 // constructor. There's no way they could be deduced differently.
1771 MultiLevelTemplateArgumentList InheritedArgs;
1772 InheritedArgs.addOuterTemplateArguments(TemplateArgs.getInnermost());
1773 Inh = cast_or_null<CXXConstructorDecl>(
1774 SemaRef.SubstDecl(Inh, Inh->getDeclContext(), InheritedArgs));
1775 if (!Inh)
Craig Topperc3ec1492014-05-26 06:22:03 +00001776 return nullptr;
Richard Smith4c163a02013-05-17 02:19:35 +00001777 }
Richard Smith185be182013-04-10 05:48:59 +00001778 cast<CXXConstructorDecl>(Method)->setInheritedConstructor(Inh);
Richard Smith4c163a02013-05-17 02:19:35 +00001779 }
Douglas Gregore8394862009-08-21 22:43:28 +00001780 } else if (CXXDestructorDecl *Destructor = dyn_cast<CXXDestructorDecl>(D)) {
Douglas Gregore8394862009-08-21 22:43:28 +00001781 Method = CXXDestructorDecl::Create(SemaRef.Context, Record,
Abramo Bagnaradff19302011-03-08 08:55:46 +00001782 StartLoc, NameInfo, T, TInfo,
Reid Kleckner0f764e52015-04-07 20:46:51 +00001783 Destructor->isInlineSpecified(),
Douglas Gregorc4df4072010-04-19 22:54:31 +00001784 false);
Douglas Gregor05155d82009-08-21 23:19:43 +00001785 } else if (CXXConversionDecl *Conversion = dyn_cast<CXXConversionDecl>(D)) {
Douglas Gregor05155d82009-08-21 23:19:43 +00001786 Method = CXXConversionDecl::Create(SemaRef.Context, Record,
Abramo Bagnaradff19302011-03-08 08:55:46 +00001787 StartLoc, NameInfo, T, TInfo,
Reid Kleckner0f764e52015-04-07 20:46:51 +00001788 Conversion->isInlineSpecified(),
Douglas Gregorf2f08062011-03-08 17:10:18 +00001789 Conversion->isExplicit(),
Richard Smith3607ffe2012-02-13 03:54:03 +00001790 Conversion->isConstexpr(),
Richard Smitheb3c10c2011-10-01 02:31:28 +00001791 Conversion->getLocEnd());
Douglas Gregor5ed5ae42009-08-21 18:42:58 +00001792 } else {
Rafael Espindola29cda592013-04-15 12:38:20 +00001793 StorageClass SC = D->isStatic() ? SC_Static : SC_None;
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001794 Method = CXXMethodDecl::Create(SemaRef.Context, Record,
Abramo Bagnaradff19302011-03-08 08:55:46 +00001795 StartLoc, NameInfo, T, TInfo,
Reid Kleckner0f764e52015-04-07 20:46:51 +00001796 SC, D->isInlineSpecified(),
Richard Smith3607ffe2012-02-13 03:54:03 +00001797 D->isConstexpr(), D->getLocEnd());
Douglas Gregor5ed5ae42009-08-21 18:42:58 +00001798 }
Douglas Gregor97628d62009-08-21 00:16:32 +00001799
Richard Smithf3814ad2013-01-25 00:08:28 +00001800 if (D->isInlined())
1801 Method->setImplicitlyInline();
1802
Douglas Gregor14454802011-02-25 02:25:35 +00001803 if (QualifierLoc)
1804 Method->setQualifierInfo(QualifierLoc);
John McCall3e11ebe2010-03-15 10:12:16 +00001805
Douglas Gregore704c9d2009-08-27 16:57:43 +00001806 if (TemplateParams) {
1807 // Our resulting instantiation is actually a function template, since we
1808 // are substituting only the outer template parameters. For example, given
Mike Stump11289f42009-09-09 15:08:12 +00001809 //
Douglas Gregore704c9d2009-08-27 16:57:43 +00001810 // template<typename T>
1811 // struct X {
1812 // template<typename U> void f(T, U);
1813 // };
1814 //
1815 // X<int> x;
1816 //
1817 // We are instantiating the member template "f" within X<int>, which means
1818 // substituting int for T, but leaving "f" as a member function template.
1819 // Build the function template itself.
1820 FunctionTemplate = FunctionTemplateDecl::Create(SemaRef.Context, Record,
1821 Method->getLocation(),
Mike Stump11289f42009-09-09 15:08:12 +00001822 Method->getDeclName(),
Douglas Gregore704c9d2009-08-27 16:57:43 +00001823 TemplateParams, Method);
John McCall2f88d7d2010-03-27 05:57:59 +00001824 if (isFriend) {
1825 FunctionTemplate->setLexicalDeclContext(Owner);
Richard Smith64017682013-07-17 23:53:16 +00001826 FunctionTemplate->setObjectOfFriendDecl();
John McCall2f88d7d2010-03-27 05:57:59 +00001827 } else if (D->isOutOfLine())
Mike Stump11289f42009-09-09 15:08:12 +00001828 FunctionTemplate->setLexicalDeclContext(D->getLexicalDeclContext());
Douglas Gregore704c9d2009-08-27 16:57:43 +00001829 Method->setDescribedFunctionTemplate(FunctionTemplate);
Douglas Gregorffe14e32009-11-14 01:20:54 +00001830 } else if (FunctionTemplate) {
1831 // Record this function template specialization.
Richard Smith47752e42013-05-03 23:46:09 +00001832 ArrayRef<TemplateArgument> Innermost = TemplateArgs.getInnermost();
Douglas Gregord5058122010-02-11 01:19:42 +00001833 Method->setFunctionTemplateSpecialization(FunctionTemplate,
Douglas Gregor1ccc8412010-11-07 23:05:16 +00001834 TemplateArgumentList::CreateCopy(SemaRef.Context,
Richard Smith47752e42013-05-03 23:46:09 +00001835 Innermost.begin(),
1836 Innermost.size()),
Craig Topperc3ec1492014-05-26 06:22:03 +00001837 /*InsertPos=*/nullptr);
John McCall2f88d7d2010-03-27 05:57:59 +00001838 } else if (!isFriend) {
Douglas Gregorffe14e32009-11-14 01:20:54 +00001839 // Record that this is an instantiation of a member function.
Douglas Gregord801b062009-10-07 23:56:10 +00001840 Method->setInstantiationOfMemberFunction(D, TSK_ImplicitInstantiation);
Douglas Gregorffe14e32009-11-14 01:20:54 +00001841 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001842
Mike Stump11289f42009-09-09 15:08:12 +00001843 // If we are instantiating a member function defined
Douglas Gregora6ef8f02009-07-24 20:34:43 +00001844 // out-of-line, the instantiation will have the same lexical
1845 // context (which will be a namespace scope) as the template.
John McCall2f88d7d2010-03-27 05:57:59 +00001846 if (isFriend) {
John McCalld0e23ec2010-10-19 02:26:41 +00001847 if (NumTempParamLists)
Benjamin Kramer9cc210652015-08-05 09:40:49 +00001848 Method->setTemplateParameterListsInfo(
1849 SemaRef.Context,
1850 llvm::makeArrayRef(TempParamLists.data(), NumTempParamLists));
John McCalld0e23ec2010-10-19 02:26:41 +00001851
John McCall2f88d7d2010-03-27 05:57:59 +00001852 Method->setLexicalDeclContext(Owner);
Richard Smith64017682013-07-17 23:53:16 +00001853 Method->setObjectOfFriendDecl();
John McCall2f88d7d2010-03-27 05:57:59 +00001854 } else if (D->isOutOfLine())
Douglas Gregora6ef8f02009-07-24 20:34:43 +00001855 Method->setLexicalDeclContext(D->getLexicalDeclContext());
Mike Stump11289f42009-09-09 15:08:12 +00001856
Douglas Gregor21342092009-03-24 00:38:23 +00001857 // Attach the parameters
1858 for (unsigned P = 0; P < Params.size(); ++P)
1859 Params[P]->setOwningFunction(Method);
David Blaikie9c70e042011-09-21 18:16:56 +00001860 Method->setParams(Params);
Douglas Gregor21342092009-03-24 00:38:23 +00001861
1862 if (InitMethodInstantiation(Method, D))
1863 Method->setInvalidDecl();
Douglas Gregorf4f296d2009-03-23 23:06:20 +00001864
Abramo Bagnarad6d2f182010-08-11 22:01:17 +00001865 LookupResult Previous(SemaRef, NameInfo, Sema::LookupOrdinaryName,
1866 Sema::ForRedeclaration);
Mike Stump11289f42009-09-09 15:08:12 +00001867
John McCall2f88d7d2010-03-27 05:57:59 +00001868 if (!FunctionTemplate || TemplateParams || isFriend) {
1869 SemaRef.LookupQualifiedName(Previous, Record);
Mike Stump11289f42009-09-09 15:08:12 +00001870
Douglas Gregor5ed5ae42009-08-21 18:42:58 +00001871 // In C++, the previous declaration we find might be a tag type
1872 // (class or enum). In this case, the new declaration will hide the
1873 // tag type. Note that this does does not apply if we're declaring a
1874 // typedef (C++ [dcl.typedef]p4).
John McCall1f82f242009-11-18 22:49:29 +00001875 if (Previous.isSingleTagDecl())
1876 Previous.clear();
Douglas Gregor5ed5ae42009-08-21 18:42:58 +00001877 }
Douglas Gregorf4f296d2009-03-23 23:06:20 +00001878
Francois Pichet00c7e6c2011-08-14 03:52:19 +00001879 if (!IsClassScopeSpecialization)
Craig Topperc3ec1492014-05-26 06:22:03 +00001880 SemaRef.CheckFunctionDeclaration(nullptr, Method, Previous, false);
Douglas Gregor05155d82009-08-21 23:19:43 +00001881
Douglas Gregor21920e372009-12-01 17:24:26 +00001882 if (D->isPure())
1883 SemaRef.CheckPureMethod(Method, SourceRange());
1884
John McCalla0a96892012-08-10 03:15:35 +00001885 // Propagate access. For a non-friend declaration, the access is
1886 // whatever we're propagating from. For a friend, it should be the
1887 // previous declaration we just found.
1888 if (isFriend && Method->getPreviousDecl())
1889 Method->setAccess(Method->getPreviousDecl()->getAccess());
1890 else
1891 Method->setAccess(D->getAccess());
1892 if (FunctionTemplate)
1893 FunctionTemplate->setAccess(Method->getAccess());
John McCall401982f2010-01-20 21:53:11 +00001894
Anders Carlsson7c812f52011-01-20 06:52:44 +00001895 SemaRef.CheckOverrideControl(Method);
1896
Eli Friedman41340732011-11-15 22:39:08 +00001897 // If a function is defined as defaulted or deleted, mark it as such now.
Richard Smith92f241f2012-12-08 02:53:02 +00001898 if (D->isExplicitlyDefaulted())
1899 SemaRef.SetDeclDefaulted(Method, Method->getLocation());
Eli Friedman41340732011-11-15 22:39:08 +00001900 if (D->isDeletedAsWritten())
Richard Smith92f241f2012-12-08 02:53:02 +00001901 SemaRef.SetDeclDeleted(Method, Method->getLocation());
Eli Friedman41340732011-11-15 22:39:08 +00001902
John McCalla0a96892012-08-10 03:15:35 +00001903 // If there's a function template, let our caller handle it.
John McCall2f88d7d2010-03-27 05:57:59 +00001904 if (FunctionTemplate) {
John McCalla0a96892012-08-10 03:15:35 +00001905 // do nothing
1906
1907 // Don't hide a (potentially) valid declaration with an invalid one.
John McCall2f88d7d2010-03-27 05:57:59 +00001908 } else if (Method->isInvalidDecl() && !Previous.empty()) {
John McCalla0a96892012-08-10 03:15:35 +00001909 // do nothing
1910
1911 // Otherwise, check access to friends and make them visible.
1912 } else if (isFriend) {
1913 // We only need to re-check access for methods which we didn't
1914 // manage to match during parsing.
1915 if (!D->getPreviousDecl())
1916 SemaRef.CheckFriendAccess(Method);
1917
1918 Record->makeDeclVisibleInContext(Method);
1919
1920 // Otherwise, add the declaration. We don't need to do this for
1921 // class-scope specializations because we'll have matched them with
1922 // the appropriate template.
1923 } else if (!IsClassScopeSpecialization) {
1924 Owner->addDecl(Method);
John McCall2f88d7d2010-03-27 05:57:59 +00001925 }
Alexis Hunt1fb4e762011-05-23 21:07:59 +00001926
Douglas Gregorf4f296d2009-03-23 23:06:20 +00001927 return Method;
1928}
1929
Douglas Gregor4044d992009-03-24 16:43:20 +00001930Decl *TemplateDeclInstantiator::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
Douglas Gregor5ed5ae42009-08-21 18:42:58 +00001931 return VisitCXXMethodDecl(D);
Douglas Gregor4044d992009-03-24 16:43:20 +00001932}
1933
Douglas Gregor654b07e2009-03-24 00:15:49 +00001934Decl *TemplateDeclInstantiator::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
Douglas Gregore8394862009-08-21 22:43:28 +00001935 return VisitCXXMethodDecl(D);
Douglas Gregor654b07e2009-03-24 00:15:49 +00001936}
1937
Douglas Gregor1880ba52009-03-25 00:34:44 +00001938Decl *TemplateDeclInstantiator::VisitCXXConversionDecl(CXXConversionDecl *D) {
Douglas Gregor05155d82009-08-21 23:19:43 +00001939 return VisitCXXMethodDecl(D);
Douglas Gregor1880ba52009-03-25 00:34:44 +00001940}
1941
Eli Friedmancb9cd6c2013-06-27 23:21:55 +00001942Decl *TemplateDeclInstantiator::VisitParmVarDecl(ParmVarDecl *D) {
David Blaikie7a30dc52013-02-21 01:47:18 +00001943 return SemaRef.SubstParmVarDecl(D, TemplateArgs, /*indexAdjustment*/ 0, None,
1944 /*ExpectParameterPack=*/ false);
Douglas Gregorf4f296d2009-03-23 23:06:20 +00001945}
1946
John McCall87a44eb2009-08-20 01:44:21 +00001947Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl(
1948 TemplateTypeParmDecl *D) {
1949 // TODO: don't always clone when decls are refcounted.
Chandler Carruth08836322011-05-01 00:51:33 +00001950 assert(D->getTypeForDecl()->isTemplateTypeParmType());
Mike Stump11289f42009-09-09 15:08:12 +00001951
John McCall87a44eb2009-08-20 01:44:21 +00001952 TemplateTypeParmDecl *Inst =
Abramo Bagnarab3185b02011-03-06 15:48:19 +00001953 TemplateTypeParmDecl::Create(SemaRef.Context, Owner,
1954 D->getLocStart(), D->getLocation(),
Chandler Carruth08836322011-05-01 00:51:33 +00001955 D->getDepth() - TemplateArgs.getNumLevels(),
1956 D->getIndex(), D->getIdentifier(),
John McCall87a44eb2009-08-20 01:44:21 +00001957 D->wasDeclaredWithTypename(),
1958 D->isParameterPack());
Douglas Gregorfd7c2252011-03-04 17:52:15 +00001959 Inst->setAccess(AS_public);
John McCall87a44eb2009-08-20 01:44:21 +00001960
Richard Smith52933792015-06-16 21:57:05 +00001961 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) {
David Majnemer89189202013-08-28 23:48:32 +00001962 TypeSourceInfo *InstantiatedDefaultArg =
1963 SemaRef.SubstType(D->getDefaultArgumentInfo(), TemplateArgs,
1964 D->getDefaultArgumentLoc(), D->getDeclName());
1965 if (InstantiatedDefaultArg)
Richard Smith1469b912015-06-10 00:29:03 +00001966 Inst->setDefaultArgument(InstantiatedDefaultArg);
David Majnemer89189202013-08-28 23:48:32 +00001967 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001968
1969 // Introduce this template parameter's instantiation into the instantiation
Douglas Gregor954de172009-10-31 17:21:17 +00001970 // scope.
1971 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Inst);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001972
John McCall87a44eb2009-08-20 01:44:21 +00001973 return Inst;
1974}
1975
Douglas Gregor6b815c82009-10-23 23:25:44 +00001976Decl *TemplateDeclInstantiator::VisitNonTypeTemplateParmDecl(
1977 NonTypeTemplateParmDecl *D) {
1978 // Substitute into the type of the non-type template parameter.
Douglas Gregor0231d8d2011-01-19 20:10:05 +00001979 TypeLoc TL = D->getTypeSourceInfo()->getTypeLoc();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001980 SmallVector<TypeSourceInfo *, 4> ExpandedParameterPackTypesAsWritten;
1981 SmallVector<QualType, 4> ExpandedParameterPackTypes;
Douglas Gregor0231d8d2011-01-19 20:10:05 +00001982 bool IsExpandedParameterPack = false;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001983 TypeSourceInfo *DI;
Douglas Gregor6b815c82009-10-23 23:25:44 +00001984 QualType T;
Douglas Gregor6b815c82009-10-23 23:25:44 +00001985 bool Invalid = false;
Douglas Gregor0231d8d2011-01-19 20:10:05 +00001986
1987 if (D->isExpandedParameterPack()) {
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001988 // The non-type template parameter pack is an already-expanded pack
Douglas Gregor0231d8d2011-01-19 20:10:05 +00001989 // expansion of types. Substitute into each of the expanded types.
1990 ExpandedParameterPackTypes.reserve(D->getNumExpansionTypes());
1991 ExpandedParameterPackTypesAsWritten.reserve(D->getNumExpansionTypes());
1992 for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) {
1993 TypeSourceInfo *NewDI =SemaRef.SubstType(D->getExpansionTypeSourceInfo(I),
1994 TemplateArgs,
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001995 D->getLocation(),
Douglas Gregor0231d8d2011-01-19 20:10:05 +00001996 D->getDeclName());
1997 if (!NewDI)
Craig Topperc3ec1492014-05-26 06:22:03 +00001998 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00001999
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002000 ExpandedParameterPackTypesAsWritten.push_back(NewDI);
2001 QualType NewT =SemaRef.CheckNonTypeTemplateParameterType(NewDI->getType(),
2002 D->getLocation());
2003 if (NewT.isNull())
Craig Topperc3ec1492014-05-26 06:22:03 +00002004 return nullptr;
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002005 ExpandedParameterPackTypes.push_back(NewT);
2006 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002007
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002008 IsExpandedParameterPack = true;
2009 DI = D->getTypeSourceInfo();
2010 T = DI->getType();
Richard Smith1fde8ec2012-09-07 02:06:42 +00002011 } else if (D->isPackExpansion()) {
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002012 // The non-type template parameter pack's type is a pack expansion of types.
2013 // Determine whether we need to expand this parameter pack into separate
2014 // types.
David Blaikie6adc78e2013-02-18 22:06:02 +00002015 PackExpansionTypeLoc Expansion = TL.castAs<PackExpansionTypeLoc>();
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002016 TypeLoc Pattern = Expansion.getPatternLoc();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002017 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002018 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002019
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002020 // Determine whether the set of unexpanded parameter packs can and should
2021 // be expanded.
2022 bool Expand = true;
2023 bool RetainExpansion = false;
David Blaikie05785d12013-02-20 22:23:23 +00002024 Optional<unsigned> OrigNumExpansions
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002025 = Expansion.getTypePtr()->getNumExpansions();
David Blaikie05785d12013-02-20 22:23:23 +00002026 Optional<unsigned> NumExpansions = OrigNumExpansions;
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002027 if (SemaRef.CheckParameterPacksForExpansion(Expansion.getEllipsisLoc(),
2028 Pattern.getSourceRange(),
David Blaikieb9c168a2011-09-22 02:34:54 +00002029 Unexpanded,
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002030 TemplateArgs,
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002031 Expand, RetainExpansion,
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002032 NumExpansions))
Craig Topperc3ec1492014-05-26 06:22:03 +00002033 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002034
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002035 if (Expand) {
2036 for (unsigned I = 0; I != *NumExpansions; ++I) {
2037 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
2038 TypeSourceInfo *NewDI = SemaRef.SubstType(Pattern, TemplateArgs,
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002039 D->getLocation(),
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002040 D->getDeclName());
2041 if (!NewDI)
Craig Topperc3ec1492014-05-26 06:22:03 +00002042 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002043
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002044 ExpandedParameterPackTypesAsWritten.push_back(NewDI);
2045 QualType NewT = SemaRef.CheckNonTypeTemplateParameterType(
2046 NewDI->getType(),
2047 D->getLocation());
2048 if (NewT.isNull())
Craig Topperc3ec1492014-05-26 06:22:03 +00002049 return nullptr;
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002050 ExpandedParameterPackTypes.push_back(NewT);
2051 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002052
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002053 // Note that we have an expanded parameter pack. The "type" of this
2054 // expanded parameter pack is the original expansion type, but callers
2055 // will end up using the expanded parameter pack types for type-checking.
2056 IsExpandedParameterPack = true;
2057 DI = D->getTypeSourceInfo();
2058 T = DI->getType();
2059 } else {
2060 // We cannot fully expand the pack expansion now, so substitute into the
2061 // pattern and create a new pack expansion type.
2062 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, -1);
2063 TypeSourceInfo *NewPattern = SemaRef.SubstType(Pattern, TemplateArgs,
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002064 D->getLocation(),
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002065 D->getDeclName());
2066 if (!NewPattern)
Craig Topperc3ec1492014-05-26 06:22:03 +00002067 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002068
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002069 DI = SemaRef.CheckPackExpansion(NewPattern, Expansion.getEllipsisLoc(),
2070 NumExpansions);
2071 if (!DI)
Craig Topperc3ec1492014-05-26 06:22:03 +00002072 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002073
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002074 T = DI->getType();
2075 }
2076 } else {
2077 // Simple case: substitution into a parameter that is not a parameter pack.
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002078 DI = SemaRef.SubstType(D->getTypeSourceInfo(), TemplateArgs,
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002079 D->getLocation(), D->getDeclName());
2080 if (!DI)
Craig Topperc3ec1492014-05-26 06:22:03 +00002081 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002082
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002083 // Check that this type is acceptable for a non-type template parameter.
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002084 T = SemaRef.CheckNonTypeTemplateParameterType(DI->getType(),
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002085 D->getLocation());
2086 if (T.isNull()) {
2087 T = SemaRef.Context.IntTy;
2088 Invalid = true;
2089 }
Douglas Gregor6b815c82009-10-23 23:25:44 +00002090 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002091
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002092 NonTypeTemplateParmDecl *Param;
2093 if (IsExpandedParameterPack)
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002094 Param = NonTypeTemplateParmDecl::Create(SemaRef.Context, Owner,
Abramo Bagnaradff19302011-03-08 08:55:46 +00002095 D->getInnerLocStart(),
2096 D->getLocation(),
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002097 D->getDepth() - TemplateArgs.getNumLevels(),
2098 D->getPosition(),
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002099 D->getIdentifier(), T,
2100 DI,
2101 ExpandedParameterPackTypes.data(),
2102 ExpandedParameterPackTypes.size(),
2103 ExpandedParameterPackTypesAsWritten.data());
2104 else
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002105 Param = NonTypeTemplateParmDecl::Create(SemaRef.Context, Owner,
Abramo Bagnaradff19302011-03-08 08:55:46 +00002106 D->getInnerLocStart(),
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002107 D->getLocation(),
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002108 D->getDepth() - TemplateArgs.getNumLevels(),
2109 D->getPosition(),
2110 D->getIdentifier(), T,
Douglas Gregor0231d8d2011-01-19 20:10:05 +00002111 D->isParameterPack(), DI);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002112
Douglas Gregorfd7c2252011-03-04 17:52:15 +00002113 Param->setAccess(AS_public);
Douglas Gregor6b815c82009-10-23 23:25:44 +00002114 if (Invalid)
2115 Param->setInvalidDecl();
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002116
Richard Smith52933792015-06-16 21:57:05 +00002117 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) {
Manman Renc445d382016-02-24 23:05:43 +00002118 EnterExpressionEvaluationContext ConstantEvaluated(SemaRef,
2119 Sema::ConstantEvaluated);
David Majnemer89189202013-08-28 23:48:32 +00002120 ExprResult Value = SemaRef.SubstExpr(D->getDefaultArgument(), TemplateArgs);
2121 if (!Value.isInvalid())
Richard Smith1469b912015-06-10 00:29:03 +00002122 Param->setDefaultArgument(Value.get());
David Majnemer89189202013-08-28 23:48:32 +00002123 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002124
2125 // Introduce this template parameter's instantiation into the instantiation
Douglas Gregor954de172009-10-31 17:21:17 +00002126 // scope.
2127 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param);
Douglas Gregor6b815c82009-10-23 23:25:44 +00002128 return Param;
2129}
2130
Richard Smith1fde8ec2012-09-07 02:06:42 +00002131static void collectUnexpandedParameterPacks(
2132 Sema &S,
2133 TemplateParameterList *Params,
2134 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
Davide Italiano18960b92015-07-02 19:20:11 +00002135 for (const auto &P : *Params) {
2136 if (P->isTemplateParameterPack())
Richard Smith1fde8ec2012-09-07 02:06:42 +00002137 continue;
Davide Italiano18960b92015-07-02 19:20:11 +00002138 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P))
Richard Smith1fde8ec2012-09-07 02:06:42 +00002139 S.collectUnexpandedParameterPacks(NTTP->getTypeSourceInfo()->getTypeLoc(),
2140 Unexpanded);
Davide Italiano18960b92015-07-02 19:20:11 +00002141 if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(P))
Richard Smith1fde8ec2012-09-07 02:06:42 +00002142 collectUnexpandedParameterPacks(S, TTP->getTemplateParameters(),
2143 Unexpanded);
2144 }
2145}
2146
Anders Carlsson4bd78752009-08-28 15:18:15 +00002147Decl *
Douglas Gregor38fee962009-11-11 16:58:32 +00002148TemplateDeclInstantiator::VisitTemplateTemplateParmDecl(
2149 TemplateTemplateParmDecl *D) {
2150 // Instantiate the template parameter list of the template template parameter.
2151 TemplateParameterList *TempParams = D->getTemplateParameters();
2152 TemplateParameterList *InstParams;
Richard Smith1fde8ec2012-09-07 02:06:42 +00002153 SmallVector<TemplateParameterList*, 8> ExpandedParams;
2154
2155 bool IsExpandedParameterPack = false;
2156
2157 if (D->isExpandedParameterPack()) {
2158 // The template template parameter pack is an already-expanded pack
2159 // expansion of template parameters. Substitute into each of the expanded
2160 // parameters.
2161 ExpandedParams.reserve(D->getNumExpansionTemplateParameters());
2162 for (unsigned I = 0, N = D->getNumExpansionTemplateParameters();
2163 I != N; ++I) {
2164 LocalInstantiationScope Scope(SemaRef);
2165 TemplateParameterList *Expansion =
2166 SubstTemplateParams(D->getExpansionTemplateParameters(I));
2167 if (!Expansion)
Craig Topperc3ec1492014-05-26 06:22:03 +00002168 return nullptr;
Richard Smith1fde8ec2012-09-07 02:06:42 +00002169 ExpandedParams.push_back(Expansion);
2170 }
2171
2172 IsExpandedParameterPack = true;
2173 InstParams = TempParams;
2174 } else if (D->isPackExpansion()) {
2175 // The template template parameter pack expands to a pack of template
2176 // template parameters. Determine whether we need to expand this parameter
2177 // pack into separate parameters.
2178 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
2179 collectUnexpandedParameterPacks(SemaRef, D->getTemplateParameters(),
2180 Unexpanded);
2181
2182 // Determine whether the set of unexpanded parameter packs can and should
2183 // be expanded.
2184 bool Expand = true;
2185 bool RetainExpansion = false;
David Blaikie05785d12013-02-20 22:23:23 +00002186 Optional<unsigned> NumExpansions;
Richard Smith1fde8ec2012-09-07 02:06:42 +00002187 if (SemaRef.CheckParameterPacksForExpansion(D->getLocation(),
2188 TempParams->getSourceRange(),
2189 Unexpanded,
2190 TemplateArgs,
2191 Expand, RetainExpansion,
2192 NumExpansions))
Craig Topperc3ec1492014-05-26 06:22:03 +00002193 return nullptr;
Richard Smith1fde8ec2012-09-07 02:06:42 +00002194
2195 if (Expand) {
2196 for (unsigned I = 0; I != *NumExpansions; ++I) {
2197 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
2198 LocalInstantiationScope Scope(SemaRef);
2199 TemplateParameterList *Expansion = SubstTemplateParams(TempParams);
2200 if (!Expansion)
Craig Topperc3ec1492014-05-26 06:22:03 +00002201 return nullptr;
Richard Smith1fde8ec2012-09-07 02:06:42 +00002202 ExpandedParams.push_back(Expansion);
2203 }
2204
2205 // Note that we have an expanded parameter pack. The "type" of this
2206 // expanded parameter pack is the original expansion type, but callers
2207 // will end up using the expanded parameter pack types for type-checking.
2208 IsExpandedParameterPack = true;
2209 InstParams = TempParams;
2210 } else {
2211 // We cannot fully expand the pack expansion now, so just substitute
2212 // into the pattern.
2213 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, -1);
2214
2215 LocalInstantiationScope Scope(SemaRef);
2216 InstParams = SubstTemplateParams(TempParams);
2217 if (!InstParams)
Craig Topperc3ec1492014-05-26 06:22:03 +00002218 return nullptr;
Richard Smith1fde8ec2012-09-07 02:06:42 +00002219 }
2220 } else {
Douglas Gregor38fee962009-11-11 16:58:32 +00002221 // Perform the actual substitution of template parameters within a new,
2222 // local instantiation scope.
John McCall19c1bfd2010-08-25 05:32:35 +00002223 LocalInstantiationScope Scope(SemaRef);
Douglas Gregor38fee962009-11-11 16:58:32 +00002224 InstParams = SubstTemplateParams(TempParams);
2225 if (!InstParams)
Craig Topperc3ec1492014-05-26 06:22:03 +00002226 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002227 }
2228
Douglas Gregor38fee962009-11-11 16:58:32 +00002229 // Build the template template parameter.
Richard Smith1fde8ec2012-09-07 02:06:42 +00002230 TemplateTemplateParmDecl *Param;
2231 if (IsExpandedParameterPack)
2232 Param = TemplateTemplateParmDecl::Create(SemaRef.Context, Owner,
2233 D->getLocation(),
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002234 D->getDepth() - TemplateArgs.getNumLevels(),
Richard Smith1fde8ec2012-09-07 02:06:42 +00002235 D->getPosition(),
2236 D->getIdentifier(), InstParams,
2237 ExpandedParams);
2238 else
2239 Param = TemplateTemplateParmDecl::Create(SemaRef.Context, Owner,
2240 D->getLocation(),
2241 D->getDepth() - TemplateArgs.getNumLevels(),
2242 D->getPosition(),
2243 D->isParameterPack(),
2244 D->getIdentifier(), InstParams);
Richard Smith52933792015-06-16 21:57:05 +00002245 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) {
David Majnemer89189202013-08-28 23:48:32 +00002246 NestedNameSpecifierLoc QualifierLoc =
2247 D->getDefaultArgument().getTemplateQualifierLoc();
2248 QualifierLoc =
2249 SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc, TemplateArgs);
2250 TemplateName TName = SemaRef.SubstTemplateName(
2251 QualifierLoc, D->getDefaultArgument().getArgument().getAsTemplate(),
2252 D->getDefaultArgument().getTemplateNameLoc(), TemplateArgs);
2253 if (!TName.isNull())
2254 Param->setDefaultArgument(
Richard Smith1469b912015-06-10 00:29:03 +00002255 SemaRef.Context,
David Majnemer89189202013-08-28 23:48:32 +00002256 TemplateArgumentLoc(TemplateArgument(TName),
2257 D->getDefaultArgument().getTemplateQualifierLoc(),
Richard Smith1469b912015-06-10 00:29:03 +00002258 D->getDefaultArgument().getTemplateNameLoc()));
David Majnemer89189202013-08-28 23:48:32 +00002259 }
Douglas Gregorfd7c2252011-03-04 17:52:15 +00002260 Param->setAccess(AS_public);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002261
2262 // Introduce this template parameter's instantiation into the instantiation
Douglas Gregor38fee962009-11-11 16:58:32 +00002263 // scope.
2264 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002265
Douglas Gregor38fee962009-11-11 16:58:32 +00002266 return Param;
2267}
2268
Douglas Gregore0b28662009-11-17 06:07:40 +00002269Decl *TemplateDeclInstantiator::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
Douglas Gregor12441b32011-02-25 16:33:46 +00002270 // Using directives are never dependent (and never contain any types or
2271 // expressions), so they require no explicit instantiation work.
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002272
Douglas Gregore0b28662009-11-17 06:07:40 +00002273 UsingDirectiveDecl *Inst
2274 = UsingDirectiveDecl::Create(SemaRef.Context, Owner, D->getLocation(),
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002275 D->getNamespaceKeyLocation(),
Douglas Gregor12441b32011-02-25 16:33:46 +00002276 D->getQualifierLoc(),
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002277 D->getIdentLocation(),
2278 D->getNominatedNamespace(),
Douglas Gregore0b28662009-11-17 06:07:40 +00002279 D->getCommonAncestor());
Abramo Bagnara8843f9f2012-09-05 09:55:10 +00002280
2281 // Add the using directive to its declaration context
2282 // only if this is not a function or method.
2283 if (!Owner->isFunctionOrMethod())
2284 Owner->addDecl(Inst);
2285
Douglas Gregore0b28662009-11-17 06:07:40 +00002286 return Inst;
2287}
2288
John McCallb96ec562009-12-04 22:46:56 +00002289Decl *TemplateDeclInstantiator::VisitUsingDecl(UsingDecl *D) {
Douglas Gregorac2e4302010-09-29 17:58:28 +00002290
2291 // The nested name specifier may be dependent, for example
2292 // template <typename T> struct t {
2293 // struct s1 { T f1(); };
2294 // struct s2 : s1 { using s1::f1; };
2295 // };
2296 // template struct t<int>;
2297 // Here, in using s1::f1, s1 refers to t<T>::s1;
2298 // we need to substitute for t<int>::s1.
Douglas Gregor0499ab62011-02-25 15:54:31 +00002299 NestedNameSpecifierLoc QualifierLoc
2300 = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(),
2301 TemplateArgs);
2302 if (!QualifierLoc)
Craig Topperc3ec1492014-05-26 06:22:03 +00002303 return nullptr;
Douglas Gregorac2e4302010-09-29 17:58:28 +00002304
2305 // The name info is non-dependent, so no transformation
2306 // is required.
Abramo Bagnara8de74e92010-08-12 11:46:03 +00002307 DeclarationNameInfo NameInfo = D->getNameInfo();
John McCallb96ec562009-12-04 22:46:56 +00002308
John McCall84d87672009-12-10 09:41:52 +00002309 // We only need to do redeclaration lookups if we're in a class
2310 // scope (in fact, it's not really even possible in non-class
2311 // scopes).
2312 bool CheckRedeclaration = Owner->isRecord();
2313
Abramo Bagnara8de74e92010-08-12 11:46:03 +00002314 LookupResult Prev(SemaRef, NameInfo, Sema::LookupUsingDeclName,
2315 Sema::ForRedeclaration);
John McCall84d87672009-12-10 09:41:52 +00002316
John McCallb96ec562009-12-04 22:46:56 +00002317 UsingDecl *NewUD = UsingDecl::Create(SemaRef.Context, Owner,
Enea Zaffanellae05a3cf2013-07-22 10:54:09 +00002318 D->getUsingLoc(),
Douglas Gregor0499ab62011-02-25 15:54:31 +00002319 QualifierLoc,
Abramo Bagnara8de74e92010-08-12 11:46:03 +00002320 NameInfo,
Enea Zaffanellae05a3cf2013-07-22 10:54:09 +00002321 D->hasTypename());
John McCallb96ec562009-12-04 22:46:56 +00002322
Douglas Gregor0499ab62011-02-25 15:54:31 +00002323 CXXScopeSpec SS;
2324 SS.Adopt(QualifierLoc);
John McCall84d87672009-12-10 09:41:52 +00002325 if (CheckRedeclaration) {
2326 Prev.setHideTags(false);
2327 SemaRef.LookupQualifiedName(Prev, Owner);
2328
2329 // Check for invalid redeclarations.
Enea Zaffanellae05a3cf2013-07-22 10:54:09 +00002330 if (SemaRef.CheckUsingDeclRedeclaration(D->getUsingLoc(),
2331 D->hasTypename(), SS,
John McCall84d87672009-12-10 09:41:52 +00002332 D->getLocation(), Prev))
2333 NewUD->setInvalidDecl();
2334
2335 }
2336
2337 if (!NewUD->isInvalidDecl() &&
Richard Smith7ad0b882014-04-02 21:44:35 +00002338 SemaRef.CheckUsingDeclQualifier(D->getUsingLoc(), SS, NameInfo,
John McCallb96ec562009-12-04 22:46:56 +00002339 D->getLocation()))
2340 NewUD->setInvalidDecl();
John McCall84d87672009-12-10 09:41:52 +00002341
John McCallb96ec562009-12-04 22:46:56 +00002342 SemaRef.Context.setInstantiatedFromUsingDecl(NewUD, D);
2343 NewUD->setAccess(D->getAccess());
2344 Owner->addDecl(NewUD);
2345
John McCall84d87672009-12-10 09:41:52 +00002346 // Don't process the shadow decls for an invalid decl.
2347 if (NewUD->isInvalidDecl())
2348 return NewUD;
2349
Richard Smith23d55872012-04-02 01:30:27 +00002350 if (NameInfo.getName().getNameKind() == DeclarationName::CXXConstructorName) {
Richard Smith09d5b3a2014-05-01 00:35:04 +00002351 SemaRef.CheckInheritingConstructorUsingDecl(NewUD);
Richard Smith23d55872012-04-02 01:30:27 +00002352 return NewUD;
2353 }
2354
John McCalla1d85502009-12-22 22:26:37 +00002355 bool isFunctionScope = Owner->isFunctionOrMethod();
2356
John McCall84d87672009-12-10 09:41:52 +00002357 // Process the shadow decls.
Aaron Ballman91cdc282014-03-13 18:07:29 +00002358 for (auto *Shadow : D->shadows()) {
John McCall84d87672009-12-10 09:41:52 +00002359 NamedDecl *InstTarget =
Richard Smithfd8634a2013-10-23 02:17:46 +00002360 cast_or_null<NamedDecl>(SemaRef.FindInstantiatedDecl(
2361 Shadow->getLocation(), Shadow->getTargetDecl(), TemplateArgs));
Douglas Gregor55e6b312011-03-04 19:46:35 +00002362 if (!InstTarget)
Craig Topperc3ec1492014-05-26 06:22:03 +00002363 return nullptr;
John McCall84d87672009-12-10 09:41:52 +00002364
Craig Topperc3ec1492014-05-26 06:22:03 +00002365 UsingShadowDecl *PrevDecl = nullptr;
Richard Smithfd8634a2013-10-23 02:17:46 +00002366 if (CheckRedeclaration) {
2367 if (SemaRef.CheckUsingShadowDecl(NewUD, InstTarget, Prev, PrevDecl))
2368 continue;
Richard Smith41c79d92014-10-11 00:37:16 +00002369 } else if (UsingShadowDecl *OldPrev =
2370 getPreviousDeclForInstantiation(Shadow)) {
Richard Smithfd8634a2013-10-23 02:17:46 +00002371 PrevDecl = cast_or_null<UsingShadowDecl>(SemaRef.FindInstantiatedDecl(
2372 Shadow->getLocation(), OldPrev, TemplateArgs));
2373 }
John McCall84d87672009-12-10 09:41:52 +00002374
Richard Smithfd8634a2013-10-23 02:17:46 +00002375 UsingShadowDecl *InstShadow =
Craig Topperc3ec1492014-05-26 06:22:03 +00002376 SemaRef.BuildUsingShadowDecl(/*Scope*/nullptr, NewUD, InstTarget,
2377 PrevDecl);
John McCall84d87672009-12-10 09:41:52 +00002378 SemaRef.Context.setInstantiatedFromUsingShadowDecl(InstShadow, Shadow);
John McCalla1d85502009-12-22 22:26:37 +00002379
2380 if (isFunctionScope)
2381 SemaRef.CurrentInstantiationScope->InstantiatedLocal(Shadow, InstShadow);
John McCall84d87672009-12-10 09:41:52 +00002382 }
John McCallb96ec562009-12-04 22:46:56 +00002383
2384 return NewUD;
2385}
2386
2387Decl *TemplateDeclInstantiator::VisitUsingShadowDecl(UsingShadowDecl *D) {
John McCall84d87672009-12-10 09:41:52 +00002388 // Ignore these; we handle them in bulk when processing the UsingDecl.
Craig Topperc3ec1492014-05-26 06:22:03 +00002389 return nullptr;
John McCallb96ec562009-12-04 22:46:56 +00002390}
2391
John McCalle61f2ba2009-11-18 02:36:19 +00002392Decl * TemplateDeclInstantiator
2393 ::VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D) {
Douglas Gregor0499ab62011-02-25 15:54:31 +00002394 NestedNameSpecifierLoc QualifierLoc
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002395 = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(),
Douglas Gregor0499ab62011-02-25 15:54:31 +00002396 TemplateArgs);
2397 if (!QualifierLoc)
Craig Topperc3ec1492014-05-26 06:22:03 +00002398 return nullptr;
Mike Stump11289f42009-09-09 15:08:12 +00002399
Anders Carlsson4bd78752009-08-28 15:18:15 +00002400 CXXScopeSpec SS;
Douglas Gregor0499ab62011-02-25 15:54:31 +00002401 SS.Adopt(QualifierLoc);
Mike Stump11289f42009-09-09 15:08:12 +00002402
Abramo Bagnara8de74e92010-08-12 11:46:03 +00002403 // Since NameInfo refers to a typename, it cannot be a C++ special name.
Benjamin Kramerd81108f2012-11-14 15:08:31 +00002404 // Hence, no transformation is required for it.
Abramo Bagnara8de74e92010-08-12 11:46:03 +00002405 DeclarationNameInfo NameInfo(D->getDeclName(), D->getLocation());
Mike Stump11289f42009-09-09 15:08:12 +00002406 NamedDecl *UD =
Craig Topperc3ec1492014-05-26 06:22:03 +00002407 SemaRef.BuildUsingDeclaration(/*Scope*/ nullptr, D->getAccess(),
2408 D->getUsingLoc(), SS, NameInfo, nullptr,
John McCalle61f2ba2009-11-18 02:36:19 +00002409 /*instantiation*/ true,
2410 /*typename*/ true, D->getTypenameLoc());
Douglas Gregor6044d692010-05-19 17:02:24 +00002411 if (UD)
John McCallb96ec562009-12-04 22:46:56 +00002412 SemaRef.Context.setInstantiatedFromUsingDecl(cast<UsingDecl>(UD), D);
2413
John McCalle61f2ba2009-11-18 02:36:19 +00002414 return UD;
2415}
2416
2417Decl * TemplateDeclInstantiator
2418 ::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
Douglas Gregor0499ab62011-02-25 15:54:31 +00002419 NestedNameSpecifierLoc QualifierLoc
2420 = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(), TemplateArgs);
2421 if (!QualifierLoc)
Craig Topperc3ec1492014-05-26 06:22:03 +00002422 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002423
John McCalle61f2ba2009-11-18 02:36:19 +00002424 CXXScopeSpec SS;
Douglas Gregor0499ab62011-02-25 15:54:31 +00002425 SS.Adopt(QualifierLoc);
John McCalle61f2ba2009-11-18 02:36:19 +00002426
Abramo Bagnara8de74e92010-08-12 11:46:03 +00002427 DeclarationNameInfo NameInfo
2428 = SemaRef.SubstDeclarationNameInfo(D->getNameInfo(), TemplateArgs);
2429
John McCalle61f2ba2009-11-18 02:36:19 +00002430 NamedDecl *UD =
Craig Topperc3ec1492014-05-26 06:22:03 +00002431 SemaRef.BuildUsingDeclaration(/*Scope*/ nullptr, D->getAccess(),
2432 D->getUsingLoc(), SS, NameInfo, nullptr,
John McCalle61f2ba2009-11-18 02:36:19 +00002433 /*instantiation*/ true,
2434 /*typename*/ false, SourceLocation());
Douglas Gregor6044d692010-05-19 17:02:24 +00002435 if (UD)
John McCallb96ec562009-12-04 22:46:56 +00002436 SemaRef.Context.setInstantiatedFromUsingDecl(cast<UsingDecl>(UD), D);
2437
Anders Carlsson4bb87ce2009-08-29 19:37:28 +00002438 return UD;
Anders Carlsson4bd78752009-08-28 15:18:15 +00002439}
2440
Francois Pichet00c7e6c2011-08-14 03:52:19 +00002441
2442Decl *TemplateDeclInstantiator::VisitClassScopeFunctionSpecializationDecl(
2443 ClassScopeFunctionSpecializationDecl *Decl) {
2444 CXXMethodDecl *OldFD = Decl->getSpecialization();
Nick Lewycky0b727732015-01-02 01:33:12 +00002445 CXXMethodDecl *NewFD =
2446 cast_or_null<CXXMethodDecl>(VisitCXXMethodDecl(OldFD, nullptr, true));
2447 if (!NewFD)
2448 return nullptr;
Francois Pichet00c7e6c2011-08-14 03:52:19 +00002449
2450 LookupResult Previous(SemaRef, NewFD->getNameInfo(), Sema::LookupOrdinaryName,
2451 Sema::ForRedeclaration);
2452
Nico Weber7b5a7162012-06-25 17:21:05 +00002453 TemplateArgumentListInfo TemplateArgs;
Craig Topperc3ec1492014-05-26 06:22:03 +00002454 TemplateArgumentListInfo *TemplateArgsPtr = nullptr;
Nico Weber7b5a7162012-06-25 17:21:05 +00002455 if (Decl->hasExplicitTemplateArgs()) {
2456 TemplateArgs = Decl->templateArgs();
2457 TemplateArgsPtr = &TemplateArgs;
2458 }
2459
Francois Pichet00c7e6c2011-08-14 03:52:19 +00002460 SemaRef.LookupQualifiedName(Previous, SemaRef.CurContext);
Nico Weber7b5a7162012-06-25 17:21:05 +00002461 if (SemaRef.CheckFunctionTemplateSpecialization(NewFD, TemplateArgsPtr,
2462 Previous)) {
Francois Pichet00c7e6c2011-08-14 03:52:19 +00002463 NewFD->setInvalidDecl();
2464 return NewFD;
2465 }
2466
2467 // Associate the specialization with the pattern.
2468 FunctionDecl *Specialization = cast<FunctionDecl>(Previous.getFoundDecl());
2469 assert(Specialization && "Class scope Specialization is null");
2470 SemaRef.Context.setClassScopeSpecializationPattern(Specialization, OldFD);
2471
2472 return NewFD;
2473}
2474
Alexey Bataeva769e072013-03-22 06:34:35 +00002475Decl *TemplateDeclInstantiator::VisitOMPThreadPrivateDecl(
2476 OMPThreadPrivateDecl *D) {
Alexey Bataev6f6f3b42013-05-13 04:18:18 +00002477 SmallVector<Expr *, 5> Vars;
Aaron Ballman2205d2a2014-03-14 15:55:35 +00002478 for (auto *I : D->varlists()) {
Nikola Smiljanic01a75982014-05-29 10:55:11 +00002479 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
Alexey Bataeva769e072013-03-22 06:34:35 +00002480 assert(isa<DeclRefExpr>(Var) && "threadprivate arg is not a DeclRefExpr");
Alexey Bataev6f6f3b42013-05-13 04:18:18 +00002481 Vars.push_back(Var);
Alexey Bataeva769e072013-03-22 06:34:35 +00002482 }
2483
2484 OMPThreadPrivateDecl *TD =
2485 SemaRef.CheckOMPThreadPrivateDecl(D->getLocation(), Vars);
2486
Alexey Bataevd3db6ac2014-03-07 09:46:29 +00002487 TD->setAccess(AS_public);
2488 Owner->addDecl(TD);
2489
Alexey Bataeva769e072013-03-22 06:34:35 +00002490 return TD;
2491}
2492
Alexey Bataev4244be22016-02-11 05:35:55 +00002493Decl *TemplateDeclInstantiator::VisitOMPCapturedExprDecl(
2494 OMPCapturedExprDecl * /*D*/) {
Alexey Bataev90c228f2016-02-08 09:29:13 +00002495 llvm_unreachable("Should not be met in templates");
2496}
2497
Eli Friedmancb9cd6c2013-06-27 23:21:55 +00002498Decl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D) {
Craig Topperc3ec1492014-05-26 06:22:03 +00002499 return VisitFunctionDecl(D, nullptr);
Eli Friedmancb9cd6c2013-06-27 23:21:55 +00002500}
2501
2502Decl *TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D) {
Craig Topperc3ec1492014-05-26 06:22:03 +00002503 return VisitCXXMethodDecl(D, nullptr);
Eli Friedmancb9cd6c2013-06-27 23:21:55 +00002504}
2505
2506Decl *TemplateDeclInstantiator::VisitRecordDecl(RecordDecl *D) {
2507 llvm_unreachable("There are only CXXRecordDecls in C++");
2508}
2509
2510Decl *
2511TemplateDeclInstantiator::VisitClassTemplateSpecializationDecl(
2512 ClassTemplateSpecializationDecl *D) {
Richard Smith8a0dde72013-12-14 01:04:22 +00002513 // As a MS extension, we permit class-scope explicit specialization
2514 // of member class templates.
2515 ClassTemplateDecl *ClassTemplate = D->getSpecializedTemplate();
2516 assert(ClassTemplate->getDeclContext()->isRecord() &&
2517 D->getTemplateSpecializationKind() == TSK_ExplicitSpecialization &&
2518 "can only instantiate an explicit specialization "
2519 "for a member class template");
2520
2521 // Lookup the already-instantiated declaration in the instantiation
2522 // of the class template. FIXME: Diagnose or assert if this fails?
2523 DeclContext::lookup_result Found
2524 = Owner->lookup(ClassTemplate->getDeclName());
2525 if (Found.empty())
Craig Topperc3ec1492014-05-26 06:22:03 +00002526 return nullptr;
Richard Smith8a0dde72013-12-14 01:04:22 +00002527 ClassTemplateDecl *InstClassTemplate
2528 = dyn_cast<ClassTemplateDecl>(Found.front());
2529 if (!InstClassTemplate)
Craig Topperc3ec1492014-05-26 06:22:03 +00002530 return nullptr;
Richard Smith8a0dde72013-12-14 01:04:22 +00002531
2532 // Substitute into the template arguments of the class template explicit
2533 // specialization.
2534 TemplateSpecializationTypeLoc Loc = D->getTypeAsWritten()->getTypeLoc().
2535 castAs<TemplateSpecializationTypeLoc>();
2536 TemplateArgumentListInfo InstTemplateArgs(Loc.getLAngleLoc(),
2537 Loc.getRAngleLoc());
2538 SmallVector<TemplateArgumentLoc, 4> ArgLocs;
2539 for (unsigned I = 0; I != Loc.getNumArgs(); ++I)
2540 ArgLocs.push_back(Loc.getArgLoc(I));
2541 if (SemaRef.Subst(ArgLocs.data(), ArgLocs.size(),
2542 InstTemplateArgs, TemplateArgs))
Craig Topperc3ec1492014-05-26 06:22:03 +00002543 return nullptr;
Richard Smith8a0dde72013-12-14 01:04:22 +00002544
2545 // Check that the template argument list is well-formed for this
2546 // class template.
2547 SmallVector<TemplateArgument, 4> Converted;
2548 if (SemaRef.CheckTemplateArgumentList(InstClassTemplate,
2549 D->getLocation(),
2550 InstTemplateArgs,
2551 false,
2552 Converted))
Craig Topperc3ec1492014-05-26 06:22:03 +00002553 return nullptr;
Richard Smith8a0dde72013-12-14 01:04:22 +00002554
2555 // Figure out where to insert this class template explicit specialization
2556 // in the member template's set of class template explicit specializations.
Craig Topperc3ec1492014-05-26 06:22:03 +00002557 void *InsertPos = nullptr;
Richard Smith8a0dde72013-12-14 01:04:22 +00002558 ClassTemplateSpecializationDecl *PrevDecl =
Craig Topper7e0daca2014-06-26 04:58:53 +00002559 InstClassTemplate->findSpecialization(Converted, InsertPos);
Richard Smith8a0dde72013-12-14 01:04:22 +00002560
2561 // Check whether we've already seen a conflicting instantiation of this
2562 // declaration (for instance, if there was a prior implicit instantiation).
2563 bool Ignored;
2564 if (PrevDecl &&
2565 SemaRef.CheckSpecializationInstantiationRedecl(D->getLocation(),
2566 D->getSpecializationKind(),
2567 PrevDecl,
2568 PrevDecl->getSpecializationKind(),
2569 PrevDecl->getPointOfInstantiation(),
2570 Ignored))
Craig Topperc3ec1492014-05-26 06:22:03 +00002571 return nullptr;
Richard Smith8a0dde72013-12-14 01:04:22 +00002572
2573 // If PrevDecl was a definition and D is also a definition, diagnose.
2574 // This happens in cases like:
2575 //
2576 // template<typename T, typename U>
2577 // struct Outer {
2578 // template<typename X> struct Inner;
2579 // template<> struct Inner<T> {};
2580 // template<> struct Inner<U> {};
2581 // };
2582 //
2583 // Outer<int, int> outer; // error: the explicit specializations of Inner
2584 // // have the same signature.
2585 if (PrevDecl && PrevDecl->getDefinition() &&
2586 D->isThisDeclarationADefinition()) {
2587 SemaRef.Diag(D->getLocation(), diag::err_redefinition) << PrevDecl;
2588 SemaRef.Diag(PrevDecl->getDefinition()->getLocation(),
2589 diag::note_previous_definition);
Craig Topperc3ec1492014-05-26 06:22:03 +00002590 return nullptr;
Richard Smith8a0dde72013-12-14 01:04:22 +00002591 }
2592
2593 // Create the class template partial specialization declaration.
2594 ClassTemplateSpecializationDecl *InstD
2595 = ClassTemplateSpecializationDecl::Create(SemaRef.Context,
2596 D->getTagKind(),
2597 Owner,
2598 D->getLocStart(),
2599 D->getLocation(),
2600 InstClassTemplate,
2601 Converted.data(),
2602 Converted.size(),
2603 PrevDecl);
2604
2605 // Add this partial specialization to the set of class template partial
2606 // specializations.
2607 if (!PrevDecl)
2608 InstClassTemplate->AddSpecialization(InstD, InsertPos);
2609
2610 // Substitute the nested name specifier, if any.
2611 if (SubstQualifier(D, InstD))
Craig Topperc3ec1492014-05-26 06:22:03 +00002612 return nullptr;
Richard Smith8a0dde72013-12-14 01:04:22 +00002613
2614 // Build the canonical type that describes the converted template
2615 // arguments of the class template explicit specialization.
2616 QualType CanonType = SemaRef.Context.getTemplateSpecializationType(
2617 TemplateName(InstClassTemplate), Converted.data(), Converted.size(),
2618 SemaRef.Context.getRecordType(InstD));
2619
2620 // Build the fully-sugared type for this class template
2621 // specialization as the user wrote in the specialization
2622 // itself. This means that we'll pretty-print the type retrieved
2623 // from the specialization's declaration the way that the user
2624 // actually wrote the specialization, rather than formatting the
2625 // name based on the "canonical" representation used to store the
2626 // template arguments in the specialization.
2627 TypeSourceInfo *WrittenTy = SemaRef.Context.getTemplateSpecializationTypeInfo(
2628 TemplateName(InstClassTemplate), D->getLocation(), InstTemplateArgs,
2629 CanonType);
2630
2631 InstD->setAccess(D->getAccess());
2632 InstD->setInstantiationOfMemberClass(D, TSK_ImplicitInstantiation);
2633 InstD->setSpecializationKind(D->getSpecializationKind());
2634 InstD->setTypeAsWritten(WrittenTy);
2635 InstD->setExternLoc(D->getExternLoc());
2636 InstD->setTemplateKeywordLoc(D->getTemplateKeywordLoc());
2637
2638 Owner->addDecl(InstD);
2639
2640 // Instantiate the members of the class-scope explicit specialization eagerly.
2641 // We don't have support for lazy instantiation of an explicit specialization
2642 // yet, and MSVC eagerly instantiates in this case.
2643 if (D->isThisDeclarationADefinition() &&
2644 SemaRef.InstantiateClass(D->getLocation(), InstD, D, TemplateArgs,
2645 TSK_ImplicitInstantiation,
2646 /*Complain=*/true))
Craig Topperc3ec1492014-05-26 06:22:03 +00002647 return nullptr;
Richard Smith8a0dde72013-12-14 01:04:22 +00002648
2649 return InstD;
Eli Friedmancb9cd6c2013-06-27 23:21:55 +00002650}
2651
Larisse Voufo39a1e502013-08-06 01:03:05 +00002652Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl(
2653 VarTemplateSpecializationDecl *D) {
2654
2655 TemplateArgumentListInfo VarTemplateArgsInfo;
2656 VarTemplateDecl *VarTemplate = D->getSpecializedTemplate();
2657 assert(VarTemplate &&
2658 "A template specialization without specialized template?");
2659
2660 // Substitute the current template arguments.
2661 const TemplateArgumentListInfo &TemplateArgsInfo = D->getTemplateArgsInfo();
2662 VarTemplateArgsInfo.setLAngleLoc(TemplateArgsInfo.getLAngleLoc());
2663 VarTemplateArgsInfo.setRAngleLoc(TemplateArgsInfo.getRAngleLoc());
2664
2665 if (SemaRef.Subst(TemplateArgsInfo.getArgumentArray(),
2666 TemplateArgsInfo.size(), VarTemplateArgsInfo, TemplateArgs))
Craig Topperc3ec1492014-05-26 06:22:03 +00002667 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00002668
2669 // Check that the template argument list is well-formed for this template.
2670 SmallVector<TemplateArgument, 4> Converted;
Larisse Voufo39a1e502013-08-06 01:03:05 +00002671 if (SemaRef.CheckTemplateArgumentList(
2672 VarTemplate, VarTemplate->getLocStart(),
2673 const_cast<TemplateArgumentListInfo &>(VarTemplateArgsInfo), false,
Richard Smith83b11aa2014-01-09 02:22:22 +00002674 Converted))
Craig Topperc3ec1492014-05-26 06:22:03 +00002675 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00002676
2677 // Find the variable template specialization declaration that
2678 // corresponds to these arguments.
Craig Topperc3ec1492014-05-26 06:22:03 +00002679 void *InsertPos = nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00002680 if (VarTemplateSpecializationDecl *VarSpec = VarTemplate->findSpecialization(
Craig Topper7e0daca2014-06-26 04:58:53 +00002681 Converted, InsertPos))
Larisse Voufo39a1e502013-08-06 01:03:05 +00002682 // If we already have a variable template specialization, return it.
2683 return VarSpec;
2684
2685 return VisitVarTemplateSpecializationDecl(VarTemplate, D, InsertPos,
2686 VarTemplateArgsInfo, Converted);
2687}
2688
2689Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl(
2690 VarTemplateDecl *VarTemplate, VarDecl *D, void *InsertPos,
2691 const TemplateArgumentListInfo &TemplateArgsInfo,
Craig Topper00bbdcf2014-06-28 23:22:23 +00002692 ArrayRef<TemplateArgument> Converted) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00002693
Larisse Voufo39a1e502013-08-06 01:03:05 +00002694 // Do substitution on the type of the declaration
2695 TypeSourceInfo *DI =
2696 SemaRef.SubstType(D->getTypeSourceInfo(), TemplateArgs,
2697 D->getTypeSpecStartLoc(), D->getDeclName());
2698 if (!DI)
Craig Topperc3ec1492014-05-26 06:22:03 +00002699 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00002700
2701 if (DI->getType()->isFunctionType()) {
2702 SemaRef.Diag(D->getLocation(), diag::err_variable_instantiates_to_function)
2703 << D->isStaticDataMember() << DI->getType();
Craig Topperc3ec1492014-05-26 06:22:03 +00002704 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00002705 }
2706
2707 // Build the instantiated declaration
2708 VarTemplateSpecializationDecl *Var = VarTemplateSpecializationDecl::Create(
2709 SemaRef.Context, Owner, D->getInnerLocStart(), D->getLocation(),
2710 VarTemplate, DI->getType(), DI, D->getStorageClass(), Converted.data(),
2711 Converted.size());
2712 Var->setTemplateArgsInfo(TemplateArgsInfo);
Richard Smith8809a0c2013-09-27 20:14:12 +00002713 if (InsertPos)
2714 VarTemplate->AddSpecialization(Var, InsertPos);
Larisse Voufo39a1e502013-08-06 01:03:05 +00002715
2716 // Substitute the nested name specifier, if any.
2717 if (SubstQualifier(D, Var))
Craig Topperc3ec1492014-05-26 06:22:03 +00002718 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00002719
2720 SemaRef.BuildVariableInstantiation(Var, D, TemplateArgs, LateAttrs,
Richard Smith541b38b2013-09-20 01:15:31 +00002721 Owner, StartingScope);
Larisse Voufo39a1e502013-08-06 01:03:05 +00002722
2723 return Var;
2724}
2725
Eli Friedmancb9cd6c2013-06-27 23:21:55 +00002726Decl *TemplateDeclInstantiator::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D) {
2727 llvm_unreachable("@defs is not supported in Objective-C++");
2728}
2729
2730Decl *TemplateDeclInstantiator::VisitFriendTemplateDecl(FriendTemplateDecl *D) {
2731 // FIXME: We need to be able to instantiate FriendTemplateDecls.
2732 unsigned DiagID = SemaRef.getDiagnostics().getCustomDiagID(
2733 DiagnosticsEngine::Error,
2734 "cannot instantiate %0 yet");
2735 SemaRef.Diag(D->getLocation(), DiagID)
2736 << D->getDeclKindName();
2737
Craig Topperc3ec1492014-05-26 06:22:03 +00002738 return nullptr;
Eli Friedmancb9cd6c2013-06-27 23:21:55 +00002739}
2740
2741Decl *TemplateDeclInstantiator::VisitDecl(Decl *D) {
2742 llvm_unreachable("Unexpected decl");
2743}
2744
John McCall76d824f2009-08-25 22:02:44 +00002745Decl *Sema::SubstDecl(Decl *D, DeclContext *Owner,
Douglas Gregor01afeef2009-08-28 20:31:08 +00002746 const MultiLevelTemplateArgumentList &TemplateArgs) {
Douglas Gregord002c7b2009-05-11 23:53:27 +00002747 TemplateDeclInstantiator Instantiator(*this, Owner, TemplateArgs);
Douglas Gregor71ad4772010-02-16 19:28:15 +00002748 if (D->isInvalidDecl())
Craig Topperc3ec1492014-05-26 06:22:03 +00002749 return nullptr;
Douglas Gregor71ad4772010-02-16 19:28:15 +00002750
Douglas Gregord7e7a512009-03-17 21:15:40 +00002751 return Instantiator.Visit(D);
2752}
2753
John McCall87a44eb2009-08-20 01:44:21 +00002754/// \brief Instantiates a nested template parameter list in the current
2755/// instantiation context.
2756///
2757/// \param L The parameter list to instantiate
2758///
2759/// \returns NULL if there was an error
2760TemplateParameterList *
John McCall76d824f2009-08-25 22:02:44 +00002761TemplateDeclInstantiator::SubstTemplateParams(TemplateParameterList *L) {
John McCall87a44eb2009-08-20 01:44:21 +00002762 // Get errors for all the parameters before bailing out.
2763 bool Invalid = false;
2764
2765 unsigned N = L->size();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002766 typedef SmallVector<NamedDecl *, 8> ParamVector;
John McCall87a44eb2009-08-20 01:44:21 +00002767 ParamVector Params;
2768 Params.reserve(N);
Davide Italiano18960b92015-07-02 19:20:11 +00002769 for (auto &P : *L) {
2770 NamedDecl *D = cast_or_null<NamedDecl>(Visit(P));
John McCall87a44eb2009-08-20 01:44:21 +00002771 Params.push_back(D);
Douglas Gregore62e6a02009-11-11 19:13:48 +00002772 Invalid = Invalid || !D || D->isInvalidDecl();
John McCall87a44eb2009-08-20 01:44:21 +00002773 }
2774
2775 // Clean up if we had an error.
Douglas Gregorb412e172010-07-25 18:17:45 +00002776 if (Invalid)
Craig Topperc3ec1492014-05-26 06:22:03 +00002777 return nullptr;
John McCall87a44eb2009-08-20 01:44:21 +00002778
2779 TemplateParameterList *InstL
2780 = TemplateParameterList::Create(SemaRef.Context, L->getTemplateLoc(),
David Majnemer902f8c62015-12-27 07:16:27 +00002781 L->getLAngleLoc(), Params,
John McCall87a44eb2009-08-20 01:44:21 +00002782 L->getRAngleLoc());
2783 return InstL;
Mike Stump11289f42009-09-09 15:08:12 +00002784}
John McCall87a44eb2009-08-20 01:44:21 +00002785
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002786/// \brief Instantiate the declaration of a class template partial
Douglas Gregor21610382009-10-29 00:04:11 +00002787/// specialization.
2788///
2789/// \param ClassTemplate the (instantiated) class template that is partially
2790// specialized by the instantiation of \p PartialSpec.
2791///
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002792/// \param PartialSpec the (uninstantiated) class template partial
Douglas Gregor21610382009-10-29 00:04:11 +00002793/// specialization that we are instantiating.
2794///
Douglas Gregor869853e2010-11-10 19:44:59 +00002795/// \returns The instantiated partial specialization, if successful; otherwise,
2796/// NULL to indicate an error.
2797ClassTemplatePartialSpecializationDecl *
Douglas Gregor21610382009-10-29 00:04:11 +00002798TemplateDeclInstantiator::InstantiateClassTemplatePartialSpecialization(
2799 ClassTemplateDecl *ClassTemplate,
2800 ClassTemplatePartialSpecializationDecl *PartialSpec) {
Douglas Gregor954de172009-10-31 17:21:17 +00002801 // Create a local instantiation scope for this class template partial
2802 // specialization, which will contain the instantiations of the template
2803 // parameters.
John McCall19c1bfd2010-08-25 05:32:35 +00002804 LocalInstantiationScope Scope(SemaRef);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002805
Douglas Gregor21610382009-10-29 00:04:11 +00002806 // Substitute into the template parameters of the class template partial
2807 // specialization.
2808 TemplateParameterList *TempParams = PartialSpec->getTemplateParameters();
2809 TemplateParameterList *InstParams = SubstTemplateParams(TempParams);
2810 if (!InstParams)
Craig Topperc3ec1492014-05-26 06:22:03 +00002811 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002812
Douglas Gregor21610382009-10-29 00:04:11 +00002813 // Substitute into the template arguments of the class template partial
2814 // specialization.
Enea Zaffanella6dbe1872013-08-10 07:24:53 +00002815 const ASTTemplateArgumentListInfo *TemplArgInfo
2816 = PartialSpec->getTemplateArgsAsWritten();
2817 TemplateArgumentListInfo InstTemplateArgs(TemplArgInfo->LAngleLoc,
2818 TemplArgInfo->RAngleLoc);
2819 if (SemaRef.Subst(TemplArgInfo->getTemplateArgs(),
2820 TemplArgInfo->NumTemplateArgs,
Douglas Gregor0f3feb42010-12-22 21:19:48 +00002821 InstTemplateArgs, TemplateArgs))
Craig Topperc3ec1492014-05-26 06:22:03 +00002822 return nullptr;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002823
Douglas Gregor21610382009-10-29 00:04:11 +00002824 // Check that the template argument list is well-formed for this
2825 // class template.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002826 SmallVector<TemplateArgument, 4> Converted;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002827 if (SemaRef.CheckTemplateArgumentList(ClassTemplate,
Douglas Gregor21610382009-10-29 00:04:11 +00002828 PartialSpec->getLocation(),
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002829 InstTemplateArgs,
Douglas Gregor21610382009-10-29 00:04:11 +00002830 false,
2831 Converted))
Craig Topperc3ec1492014-05-26 06:22:03 +00002832 return nullptr;
Douglas Gregor21610382009-10-29 00:04:11 +00002833
2834 // Figure out where to insert this class template partial specialization
2835 // in the member template's set of class template partial specializations.
Craig Topperc3ec1492014-05-26 06:22:03 +00002836 void *InsertPos = nullptr;
Douglas Gregor21610382009-10-29 00:04:11 +00002837 ClassTemplateSpecializationDecl *PrevDecl
Craig Topper7e0daca2014-06-26 04:58:53 +00002838 = ClassTemplate->findPartialSpecialization(Converted, InsertPos);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002839
Douglas Gregor21610382009-10-29 00:04:11 +00002840 // Build the canonical type that describes the converted template
2841 // arguments of the class template partial specialization.
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002842 QualType CanonType
Douglas Gregor21610382009-10-29 00:04:11 +00002843 = SemaRef.Context.getTemplateSpecializationType(TemplateName(ClassTemplate),
Douglas Gregor1ccc8412010-11-07 23:05:16 +00002844 Converted.data(),
2845 Converted.size());
Douglas Gregor21610382009-10-29 00:04:11 +00002846
2847 // Build the fully-sugared type for this class template
2848 // specialization as the user wrote in the specialization
2849 // itself. This means that we'll pretty-print the type retrieved
2850 // from the specialization's declaration the way that the user
2851 // actually wrote the specialization, rather than formatting the
2852 // name based on the "canonical" representation used to store the
2853 // template arguments in the specialization.
John McCalle78aac42010-03-10 03:28:59 +00002854 TypeSourceInfo *WrittenTy
2855 = SemaRef.Context.getTemplateSpecializationTypeInfo(
2856 TemplateName(ClassTemplate),
2857 PartialSpec->getLocation(),
John McCall6b51f282009-11-23 01:53:49 +00002858 InstTemplateArgs,
Douglas Gregor21610382009-10-29 00:04:11 +00002859 CanonType);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002860
Douglas Gregor21610382009-10-29 00:04:11 +00002861 if (PrevDecl) {
2862 // We've already seen a partial specialization with the same template
2863 // parameters and template arguments. This can happen, for example, when
2864 // substituting the outer template arguments ends up causing two
2865 // class template partial specializations of a member class template
2866 // to have identical forms, e.g.,
2867 //
2868 // template<typename T, typename U>
2869 // struct Outer {
2870 // template<typename X, typename Y> struct Inner;
2871 // template<typename Y> struct Inner<T, Y>;
2872 // template<typename Y> struct Inner<U, Y>;
2873 // };
2874 //
2875 // Outer<int, int> outer; // error: the partial specializations of Inner
2876 // // have the same signature.
2877 SemaRef.Diag(PartialSpec->getLocation(), diag::err_partial_spec_redeclared)
Douglas Gregor869853e2010-11-10 19:44:59 +00002878 << WrittenTy->getType();
Douglas Gregor21610382009-10-29 00:04:11 +00002879 SemaRef.Diag(PrevDecl->getLocation(), diag::note_prev_partial_spec_here)
2880 << SemaRef.Context.getTypeDeclType(PrevDecl);
Craig Topperc3ec1492014-05-26 06:22:03 +00002881 return nullptr;
Douglas Gregor21610382009-10-29 00:04:11 +00002882 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002883
2884
Douglas Gregor21610382009-10-29 00:04:11 +00002885 // Create the class template partial specialization declaration.
2886 ClassTemplatePartialSpecializationDecl *InstPartialSpec
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002887 = ClassTemplatePartialSpecializationDecl::Create(SemaRef.Context,
Douglas Gregore9029562010-05-06 00:28:52 +00002888 PartialSpec->getTagKind(),
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002889 Owner,
Abramo Bagnara29c2d462011-03-09 14:09:51 +00002890 PartialSpec->getLocStart(),
2891 PartialSpec->getLocation(),
Douglas Gregor21610382009-10-29 00:04:11 +00002892 InstParams,
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002893 ClassTemplate,
Douglas Gregor1ccc8412010-11-07 23:05:16 +00002894 Converted.data(),
2895 Converted.size(),
John McCall6b51f282009-11-23 01:53:49 +00002896 InstTemplateArgs,
John McCalle78aac42010-03-10 03:28:59 +00002897 CanonType,
Craig Topperc3ec1492014-05-26 06:22:03 +00002898 nullptr);
John McCall3e11ebe2010-03-15 10:12:16 +00002899 // Substitute the nested name specifier, if any.
2900 if (SubstQualifier(PartialSpec, InstPartialSpec))
Craig Topperc3ec1492014-05-26 06:22:03 +00002901 return nullptr;
John McCall3e11ebe2010-03-15 10:12:16 +00002902
Douglas Gregor21610382009-10-29 00:04:11 +00002903 InstPartialSpec->setInstantiatedFromMember(PartialSpec);
Douglas Gregor6044d692010-05-19 17:02:24 +00002904 InstPartialSpec->setTypeAsWritten(WrittenTy);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00002905
Douglas Gregor21610382009-10-29 00:04:11 +00002906 // Add this partial specialization to the set of class template partial
2907 // specializations.
Craig Topperc3ec1492014-05-26 06:22:03 +00002908 ClassTemplate->AddPartialSpecialization(InstPartialSpec,
2909 /*InsertPos=*/nullptr);
Douglas Gregor869853e2010-11-10 19:44:59 +00002910 return InstPartialSpec;
Douglas Gregor21610382009-10-29 00:04:11 +00002911}
2912
Larisse Voufo39a1e502013-08-06 01:03:05 +00002913/// \brief Instantiate the declaration of a variable template partial
2914/// specialization.
2915///
2916/// \param VarTemplate the (instantiated) variable template that is partially
2917/// specialized by the instantiation of \p PartialSpec.
2918///
2919/// \param PartialSpec the (uninstantiated) variable template partial
2920/// specialization that we are instantiating.
2921///
2922/// \returns The instantiated partial specialization, if successful; otherwise,
2923/// NULL to indicate an error.
2924VarTemplatePartialSpecializationDecl *
2925TemplateDeclInstantiator::InstantiateVarTemplatePartialSpecialization(
2926 VarTemplateDecl *VarTemplate,
2927 VarTemplatePartialSpecializationDecl *PartialSpec) {
2928 // Create a local instantiation scope for this variable template partial
2929 // specialization, which will contain the instantiations of the template
2930 // parameters.
2931 LocalInstantiationScope Scope(SemaRef);
2932
2933 // Substitute into the template parameters of the variable template partial
2934 // specialization.
2935 TemplateParameterList *TempParams = PartialSpec->getTemplateParameters();
2936 TemplateParameterList *InstParams = SubstTemplateParams(TempParams);
2937 if (!InstParams)
Craig Topperc3ec1492014-05-26 06:22:03 +00002938 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00002939
2940 // Substitute into the template arguments of the variable template partial
2941 // specialization.
Enea Zaffanella6dbe1872013-08-10 07:24:53 +00002942 const ASTTemplateArgumentListInfo *TemplArgInfo
2943 = PartialSpec->getTemplateArgsAsWritten();
2944 TemplateArgumentListInfo InstTemplateArgs(TemplArgInfo->LAngleLoc,
2945 TemplArgInfo->RAngleLoc);
2946 if (SemaRef.Subst(TemplArgInfo->getTemplateArgs(),
2947 TemplArgInfo->NumTemplateArgs,
Larisse Voufo39a1e502013-08-06 01:03:05 +00002948 InstTemplateArgs, TemplateArgs))
Craig Topperc3ec1492014-05-26 06:22:03 +00002949 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00002950
2951 // Check that the template argument list is well-formed for this
2952 // class template.
2953 SmallVector<TemplateArgument, 4> Converted;
2954 if (SemaRef.CheckTemplateArgumentList(VarTemplate, PartialSpec->getLocation(),
2955 InstTemplateArgs, false, Converted))
Craig Topperc3ec1492014-05-26 06:22:03 +00002956 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00002957
2958 // Figure out where to insert this variable template partial specialization
2959 // in the member template's set of variable template partial specializations.
Craig Topperc3ec1492014-05-26 06:22:03 +00002960 void *InsertPos = nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00002961 VarTemplateSpecializationDecl *PrevDecl =
Craig Topper7e0daca2014-06-26 04:58:53 +00002962 VarTemplate->findPartialSpecialization(Converted, InsertPos);
Larisse Voufo39a1e502013-08-06 01:03:05 +00002963
2964 // Build the canonical type that describes the converted template
2965 // arguments of the variable template partial specialization.
2966 QualType CanonType = SemaRef.Context.getTemplateSpecializationType(
2967 TemplateName(VarTemplate), Converted.data(), Converted.size());
2968
2969 // Build the fully-sugared type for this variable template
2970 // specialization as the user wrote in the specialization
2971 // itself. This means that we'll pretty-print the type retrieved
2972 // from the specialization's declaration the way that the user
2973 // actually wrote the specialization, rather than formatting the
2974 // name based on the "canonical" representation used to store the
2975 // template arguments in the specialization.
2976 TypeSourceInfo *WrittenTy = SemaRef.Context.getTemplateSpecializationTypeInfo(
2977 TemplateName(VarTemplate), PartialSpec->getLocation(), InstTemplateArgs,
2978 CanonType);
2979
2980 if (PrevDecl) {
2981 // We've already seen a partial specialization with the same template
2982 // parameters and template arguments. This can happen, for example, when
2983 // substituting the outer template arguments ends up causing two
2984 // variable template partial specializations of a member variable template
2985 // to have identical forms, e.g.,
2986 //
2987 // template<typename T, typename U>
2988 // struct Outer {
2989 // template<typename X, typename Y> pair<X,Y> p;
2990 // template<typename Y> pair<T, Y> p;
2991 // template<typename Y> pair<U, Y> p;
2992 // };
2993 //
2994 // Outer<int, int> outer; // error: the partial specializations of Inner
2995 // // have the same signature.
2996 SemaRef.Diag(PartialSpec->getLocation(),
2997 diag::err_var_partial_spec_redeclared)
2998 << WrittenTy->getType();
2999 SemaRef.Diag(PrevDecl->getLocation(),
3000 diag::note_var_prev_partial_spec_here);
Craig Topperc3ec1492014-05-26 06:22:03 +00003001 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00003002 }
3003
3004 // Do substitution on the type of the declaration
3005 TypeSourceInfo *DI = SemaRef.SubstType(
3006 PartialSpec->getTypeSourceInfo(), TemplateArgs,
3007 PartialSpec->getTypeSpecStartLoc(), PartialSpec->getDeclName());
3008 if (!DI)
Craig Topperc3ec1492014-05-26 06:22:03 +00003009 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00003010
3011 if (DI->getType()->isFunctionType()) {
3012 SemaRef.Diag(PartialSpec->getLocation(),
3013 diag::err_variable_instantiates_to_function)
3014 << PartialSpec->isStaticDataMember() << DI->getType();
Craig Topperc3ec1492014-05-26 06:22:03 +00003015 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00003016 }
3017
3018 // Create the variable template partial specialization declaration.
3019 VarTemplatePartialSpecializationDecl *InstPartialSpec =
3020 VarTemplatePartialSpecializationDecl::Create(
3021 SemaRef.Context, Owner, PartialSpec->getInnerLocStart(),
3022 PartialSpec->getLocation(), InstParams, VarTemplate, DI->getType(),
3023 DI, PartialSpec->getStorageClass(), Converted.data(),
Richard Smithb2f61b42013-08-22 23:27:37 +00003024 Converted.size(), InstTemplateArgs);
Larisse Voufo39a1e502013-08-06 01:03:05 +00003025
3026 // Substitute the nested name specifier, if any.
3027 if (SubstQualifier(PartialSpec, InstPartialSpec))
Craig Topperc3ec1492014-05-26 06:22:03 +00003028 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00003029
3030 InstPartialSpec->setInstantiatedFromMember(PartialSpec);
3031 InstPartialSpec->setTypeAsWritten(WrittenTy);
3032
Larisse Voufo39a1e502013-08-06 01:03:05 +00003033 // Add this partial specialization to the set of variable template partial
3034 // specializations. The instantiation of the initializer is not necessary.
Craig Topperc3ec1492014-05-26 06:22:03 +00003035 VarTemplate->AddPartialSpecialization(InstPartialSpec, /*InsertPos=*/nullptr);
Larisse Voufo4cda4612013-08-22 00:28:27 +00003036
Larisse Voufo4cda4612013-08-22 00:28:27 +00003037 SemaRef.BuildVariableInstantiation(InstPartialSpec, PartialSpec, TemplateArgs,
Richard Smith541b38b2013-09-20 01:15:31 +00003038 LateAttrs, Owner, StartingScope);
Larisse Voufo4cda4612013-08-22 00:28:27 +00003039
Larisse Voufo39a1e502013-08-06 01:03:05 +00003040 return InstPartialSpec;
3041}
3042
John McCall58f10c32010-03-11 09:03:00 +00003043TypeSourceInfo*
John McCall76d824f2009-08-25 22:02:44 +00003044TemplateDeclInstantiator::SubstFunctionType(FunctionDecl *D,
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003045 SmallVectorImpl<ParmVarDecl *> &Params) {
John McCall58f10c32010-03-11 09:03:00 +00003046 TypeSourceInfo *OldTInfo = D->getTypeSourceInfo();
3047 assert(OldTInfo && "substituting function without type source info");
3048 assert(Params.empty() && "parameter vector is non-empty at start");
Craig Topperc3ec1492014-05-26 06:22:03 +00003049
3050 CXXRecordDecl *ThisContext = nullptr;
Douglas Gregor3024f072012-04-16 07:05:22 +00003051 unsigned ThisTypeQuals = 0;
3052 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
Richard Smithc3d2ebb2013-06-07 02:33:37 +00003053 ThisContext = cast<CXXRecordDecl>(Owner);
Douglas Gregor3024f072012-04-16 07:05:22 +00003054 ThisTypeQuals = Method->getTypeQualifiers();
3055 }
3056
John McCallb29f78f2010-04-09 17:38:44 +00003057 TypeSourceInfo *NewTInfo
3058 = SemaRef.SubstFunctionDeclType(OldTInfo, TemplateArgs,
3059 D->getTypeSpecStartLoc(),
Douglas Gregor3024f072012-04-16 07:05:22 +00003060 D->getDeclName(),
3061 ThisContext, ThisTypeQuals);
John McCall58f10c32010-03-11 09:03:00 +00003062 if (!NewTInfo)
Craig Topperc3ec1492014-05-26 06:22:03 +00003063 return nullptr;
Douglas Gregor21342092009-03-24 00:38:23 +00003064
Reid Klecknera09e44c2013-07-31 21:00:18 +00003065 TypeLoc OldTL = OldTInfo->getTypeLoc().IgnoreParens();
3066 if (FunctionProtoTypeLoc OldProtoLoc = OldTL.getAs<FunctionProtoTypeLoc>()) {
3067 if (NewTInfo != OldTInfo) {
3068 // Get parameters from the new type info.
Abramo Bagnaraa44c9022010-12-13 22:27:55 +00003069 TypeLoc NewTL = NewTInfo->getTypeLoc().IgnoreParens();
David Blaikie6adc78e2013-02-18 22:06:02 +00003070 FunctionProtoTypeLoc NewProtoLoc = NewTL.castAs<FunctionProtoTypeLoc>();
Richard Smith198223b2012-07-18 01:29:05 +00003071 unsigned NewIdx = 0;
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00003072 for (unsigned OldIdx = 0, NumOldParams = OldProtoLoc.getNumParams();
Douglas Gregorf3010112011-01-07 16:43:16 +00003073 OldIdx != NumOldParams; ++OldIdx) {
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00003074 ParmVarDecl *OldParam = OldProtoLoc.getParam(OldIdx);
Richard Smith198223b2012-07-18 01:29:05 +00003075 LocalInstantiationScope *Scope = SemaRef.CurrentInstantiationScope;
3076
David Blaikie05785d12013-02-20 22:23:23 +00003077 Optional<unsigned> NumArgumentsInExpansion;
Richard Smith198223b2012-07-18 01:29:05 +00003078 if (OldParam->isParameterPack())
3079 NumArgumentsInExpansion =
3080 SemaRef.getNumArgumentsInExpansion(OldParam->getType(),
3081 TemplateArgs);
3082 if (!NumArgumentsInExpansion) {
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00003083 // Simple case: normal parameter, or a parameter pack that's
Douglas Gregorf3010112011-01-07 16:43:16 +00003084 // instantiated to a (still-dependent) parameter pack.
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00003085 ParmVarDecl *NewParam = NewProtoLoc.getParam(NewIdx++);
Douglas Gregorf3010112011-01-07 16:43:16 +00003086 Params.push_back(NewParam);
Richard Smith198223b2012-07-18 01:29:05 +00003087 Scope->InstantiatedLocal(OldParam, NewParam);
3088 } else {
3089 // Parameter pack expansion: make the instantiation an argument pack.
3090 Scope->MakeInstantiatedLocalArgPack(OldParam);
3091 for (unsigned I = 0; I != *NumArgumentsInExpansion; ++I) {
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00003092 ParmVarDecl *NewParam = NewProtoLoc.getParam(NewIdx++);
Richard Smith198223b2012-07-18 01:29:05 +00003093 Params.push_back(NewParam);
3094 Scope->InstantiatedLocalPackArg(OldParam, NewParam);
3095 }
Douglas Gregorf3010112011-01-07 16:43:16 +00003096 }
Douglas Gregor95c70ec2010-05-03 15:32:18 +00003097 }
Reid Klecknera09e44c2013-07-31 21:00:18 +00003098 } else {
3099 // The function type itself was not dependent and therefore no
3100 // substitution occurred. However, we still need to instantiate
3101 // the function parameters themselves.
3102 const FunctionProtoType *OldProto =
3103 cast<FunctionProtoType>(OldProtoLoc.getType());
Alp Tokerb3fd5cf2014-01-21 00:32:38 +00003104 for (unsigned i = 0, i_end = OldProtoLoc.getNumParams(); i != i_end;
3105 ++i) {
3106 ParmVarDecl *OldParam = OldProtoLoc.getParam(i);
Reid Klecknera09e44c2013-07-31 21:00:18 +00003107 if (!OldParam) {
3108 Params.push_back(SemaRef.BuildParmVarDeclForTypedef(
Alp Toker9cacbab2014-01-20 20:26:09 +00003109 D, D->getLocation(), OldProto->getParamType(i)));
Reid Klecknera09e44c2013-07-31 21:00:18 +00003110 continue;
3111 }
3112
Eli Friedmancb9cd6c2013-06-27 23:21:55 +00003113 ParmVarDecl *Parm =
Reid Klecknera09e44c2013-07-31 21:00:18 +00003114 cast_or_null<ParmVarDecl>(VisitParmVarDecl(OldParam));
Douglas Gregor95c70ec2010-05-03 15:32:18 +00003115 if (!Parm)
Craig Topperc3ec1492014-05-26 06:22:03 +00003116 return nullptr;
Douglas Gregor95c70ec2010-05-03 15:32:18 +00003117 Params.push_back(Parm);
3118 }
Douglas Gregor940bca72010-04-12 07:48:19 +00003119 }
Reid Klecknera09e44c2013-07-31 21:00:18 +00003120 } else {
3121 // If the type of this function, after ignoring parentheses, is not
3122 // *directly* a function type, then we're instantiating a function that
3123 // was declared via a typedef or with attributes, e.g.,
3124 //
3125 // typedef int functype(int, int);
3126 // functype func;
3127 // int __cdecl meth(int, int);
3128 //
3129 // In this case, we'll just go instantiate the ParmVarDecls that we
3130 // synthesized in the method declaration.
3131 SmallVector<QualType, 4> ParamTypes;
John McCallc8e321d2016-03-01 02:09:25 +00003132 Sema::ExtParameterInfoBuilder ExtParamInfos;
Reid Klecknera09e44c2013-07-31 21:00:18 +00003133 if (SemaRef.SubstParmTypes(D->getLocation(), D->param_begin(),
John McCallc8e321d2016-03-01 02:09:25 +00003134 D->getNumParams(), nullptr, TemplateArgs,
3135 ParamTypes, &Params, ExtParamInfos))
Craig Topperc3ec1492014-05-26 06:22:03 +00003136 return nullptr;
Douglas Gregor940bca72010-04-12 07:48:19 +00003137 }
Reid Klecknera09e44c2013-07-31 21:00:18 +00003138
John McCall58f10c32010-03-11 09:03:00 +00003139 return NewTInfo;
Douglas Gregor21342092009-03-24 00:38:23 +00003140}
3141
Richard Smithf623c962012-04-17 00:58:00 +00003142/// Introduce the instantiated function parameters into the local
3143/// instantiation scope, and set the parameter names to those used
3144/// in the template.
Richard Smith2e321552014-11-12 02:00:47 +00003145static bool addInstantiatedParametersToScope(Sema &S, FunctionDecl *Function,
Richard Smithf623c962012-04-17 00:58:00 +00003146 const FunctionDecl *PatternDecl,
3147 LocalInstantiationScope &Scope,
3148 const MultiLevelTemplateArgumentList &TemplateArgs) {
3149 unsigned FParamIdx = 0;
3150 for (unsigned I = 0, N = PatternDecl->getNumParams(); I != N; ++I) {
3151 const ParmVarDecl *PatternParam = PatternDecl->getParamDecl(I);
3152 if (!PatternParam->isParameterPack()) {
3153 // Simple case: not a parameter pack.
3154 assert(FParamIdx < Function->getNumParams());
3155 ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx);
Richard Smith2e321552014-11-12 02:00:47 +00003156 FunctionParam->setDeclName(PatternParam->getDeclName());
Richard Smithaae40582014-03-13 00:28:45 +00003157 // If the parameter's type is not dependent, update it to match the type
3158 // in the pattern. They can differ in top-level cv-qualifiers, and we want
3159 // the pattern's type here. If the type is dependent, they can't differ,
Richard Smith2e321552014-11-12 02:00:47 +00003160 // per core issue 1668. Substitute into the type from the pattern, in case
3161 // it's instantiation-dependent.
Richard Smithaae40582014-03-13 00:28:45 +00003162 // FIXME: Updating the type to work around this is at best fragile.
Richard Smith2e321552014-11-12 02:00:47 +00003163 if (!PatternDecl->getType()->isDependentType()) {
3164 QualType T = S.SubstType(PatternParam->getType(), TemplateArgs,
3165 FunctionParam->getLocation(),
3166 FunctionParam->getDeclName());
3167 if (T.isNull())
3168 return true;
3169 FunctionParam->setType(T);
3170 }
Richard Smithaae40582014-03-13 00:28:45 +00003171
Richard Smithf623c962012-04-17 00:58:00 +00003172 Scope.InstantiatedLocal(PatternParam, FunctionParam);
3173 ++FParamIdx;
3174 continue;
3175 }
3176
3177 // Expand the parameter pack.
3178 Scope.MakeInstantiatedLocalArgPack(PatternParam);
David Blaikie05785d12013-02-20 22:23:23 +00003179 Optional<unsigned> NumArgumentsInExpansion
Richard Smithf623c962012-04-17 00:58:00 +00003180 = S.getNumArgumentsInExpansion(PatternParam->getType(), TemplateArgs);
Richard Smith198223b2012-07-18 01:29:05 +00003181 assert(NumArgumentsInExpansion &&
3182 "should only be called when all template arguments are known");
Richard Smith2e321552014-11-12 02:00:47 +00003183 QualType PatternType =
3184 PatternParam->getType()->castAs<PackExpansionType>()->getPattern();
Richard Smith198223b2012-07-18 01:29:05 +00003185 for (unsigned Arg = 0; Arg < *NumArgumentsInExpansion; ++Arg) {
Richard Smithf623c962012-04-17 00:58:00 +00003186 ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx);
NAKAMURA Takumi23224152014-10-17 12:48:37 +00003187 FunctionParam->setDeclName(PatternParam->getDeclName());
Richard Smith2e321552014-11-12 02:00:47 +00003188 if (!PatternDecl->getType()->isDependentType()) {
3189 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(S, Arg);
3190 QualType T = S.SubstType(PatternType, TemplateArgs,
3191 FunctionParam->getLocation(),
3192 FunctionParam->getDeclName());
3193 if (T.isNull())
3194 return true;
3195 FunctionParam->setType(T);
3196 }
3197
Richard Smithf623c962012-04-17 00:58:00 +00003198 Scope.InstantiatedLocalPackArg(PatternParam, FunctionParam);
3199 ++FParamIdx;
3200 }
3201 }
Richard Smithf623c962012-04-17 00:58:00 +00003202
Richard Smith2e321552014-11-12 02:00:47 +00003203 return false;
Richard Smithf623c962012-04-17 00:58:00 +00003204}
3205
3206void Sema::InstantiateExceptionSpec(SourceLocation PointOfInstantiation,
3207 FunctionDecl *Decl) {
Richard Smithd3729422012-04-19 00:08:28 +00003208 const FunctionProtoType *Proto = Decl->getType()->castAs<FunctionProtoType>();
3209 if (Proto->getExceptionSpecType() != EST_Uninstantiated)
Richard Smithf623c962012-04-17 00:58:00 +00003210 return;
3211
3212 InstantiatingTemplate Inst(*this, PointOfInstantiation, Decl,
3213 InstantiatingTemplate::ExceptionSpecification());
Alp Tokerd4a72d52013-10-08 08:09:04 +00003214 if (Inst.isInvalid()) {
Richard Smithd3b5c9082012-07-27 04:22:15 +00003215 // We hit the instantiation depth limit. Clear the exception specification
3216 // so that our callers don't have to cope with EST_Uninstantiated.
Richard Smith8acb4282014-07-31 21:57:55 +00003217 UpdateExceptionSpec(Decl, EST_None);
Richard Smithf623c962012-04-17 00:58:00 +00003218 return;
Richard Smithd3b5c9082012-07-27 04:22:15 +00003219 }
Richard Smithf623c962012-04-17 00:58:00 +00003220
3221 // Enter the scope of this instantiation. We don't use
3222 // PushDeclContext because we don't have a scope.
3223 Sema::ContextRAII savedContext(*this, Decl);
3224 LocalInstantiationScope Scope(*this);
3225
3226 MultiLevelTemplateArgumentList TemplateArgs =
Craig Topperc3ec1492014-05-26 06:22:03 +00003227 getTemplateInstantiationArgs(Decl, nullptr, /*RelativeToPrimary*/true);
Richard Smithf623c962012-04-17 00:58:00 +00003228
Richard Smithd3729422012-04-19 00:08:28 +00003229 FunctionDecl *Template = Proto->getExceptionSpecTemplate();
Richard Smith2e321552014-11-12 02:00:47 +00003230 if (addInstantiatedParametersToScope(*this, Decl, Template, Scope,
3231 TemplateArgs)) {
3232 UpdateExceptionSpec(Decl, EST_None);
3233 return;
3234 }
Richard Smithf623c962012-04-17 00:58:00 +00003235
Richard Smith2e321552014-11-12 02:00:47 +00003236 SubstExceptionSpec(Decl, Template->getType()->castAs<FunctionProtoType>(),
3237 TemplateArgs);
Richard Smithf623c962012-04-17 00:58:00 +00003238}
3239
Mike Stump11289f42009-09-09 15:08:12 +00003240/// \brief Initializes the common fields of an instantiation function
Douglas Gregorad3f2fc2009-06-25 22:08:12 +00003241/// declaration (New) from the corresponding fields of its template (Tmpl).
3242///
3243/// \returns true if there was an error
Mike Stump11289f42009-09-09 15:08:12 +00003244bool
3245TemplateDeclInstantiator::InitFunctionInstantiation(FunctionDecl *New,
Douglas Gregorad3f2fc2009-06-25 22:08:12 +00003246 FunctionDecl *Tmpl) {
David Blaikie5a0956e2012-07-16 18:50:45 +00003247 if (Tmpl->isDeleted())
Alexis Hunt4a8ea102011-05-06 20:44:56 +00003248 New->setDeletedAsWritten();
Mike Stump11289f42009-09-09 15:08:12 +00003249
David Majnemerdbc0c8f2013-12-04 09:01:55 +00003250 // Forward the mangling number from the template to the instantiated decl.
3251 SemaRef.Context.setManglingNumber(New,
3252 SemaRef.Context.getManglingNumber(Tmpl));
3253
Douglas Gregorff6cbdf2009-07-01 22:01:06 +00003254 // If we are performing substituting explicitly-specified template arguments
3255 // or deduced template arguments into a function template and we reach this
3256 // point, we are now past the point where SFINAE applies and have committed
Mike Stump11289f42009-09-09 15:08:12 +00003257 // to keeping the new function template specialization. We therefore
3258 // convert the active template instantiation for the function template
Douglas Gregorff6cbdf2009-07-01 22:01:06 +00003259 // into a template instantiation for this specific function template
3260 // specialization, which is not a SFINAE context, so that we diagnose any
3261 // further errors in the declaration itself.
3262 typedef Sema::ActiveTemplateInstantiation ActiveInstType;
3263 ActiveInstType &ActiveInst = SemaRef.ActiveTemplateInstantiations.back();
3264 if (ActiveInst.Kind == ActiveInstType::ExplicitTemplateArgumentSubstitution ||
3265 ActiveInst.Kind == ActiveInstType::DeducedTemplateArgumentSubstitution) {
Mike Stump11289f42009-09-09 15:08:12 +00003266 if (FunctionTemplateDecl *FunTmpl
Nick Lewyckycc8990f2012-11-16 08:40:59 +00003267 = dyn_cast<FunctionTemplateDecl>(ActiveInst.Entity)) {
Mike Stump11289f42009-09-09 15:08:12 +00003268 assert(FunTmpl->getTemplatedDecl() == Tmpl &&
Douglas Gregorff6cbdf2009-07-01 22:01:06 +00003269 "Deduction from the wrong function template?");
Daniel Dunbar54c59642009-07-16 22:10:11 +00003270 (void) FunTmpl;
Douglas Gregorff6cbdf2009-07-01 22:01:06 +00003271 ActiveInst.Kind = ActiveInstType::TemplateInstantiation;
Nick Lewyckycc8990f2012-11-16 08:40:59 +00003272 ActiveInst.Entity = New;
Douglas Gregorff6cbdf2009-07-01 22:01:06 +00003273 }
3274 }
Mike Stump11289f42009-09-09 15:08:12 +00003275
Douglas Gregor049bdca2009-12-08 17:45:32 +00003276 const FunctionProtoType *Proto = Tmpl->getType()->getAs<FunctionProtoType>();
3277 assert(Proto && "Function template without prototype?");
3278
Sebastian Redlfa453cf2011-03-12 11:50:43 +00003279 if (Proto->hasExceptionSpec() || Proto->getNoReturnAttr()) {
John McCalldb40c7f2010-12-14 08:05:40 +00003280 FunctionProtoType::ExtProtoInfo EPI = Proto->getExtProtoInfo();
John McCalldb40c7f2010-12-14 08:05:40 +00003281
Richard Smithf623c962012-04-17 00:58:00 +00003282 // DR1330: In C++11, defer instantiation of a non-trivial
3283 // exception specification.
Serge Pavlov3739f5e72015-06-29 17:50:19 +00003284 // DR1484: Local classes and their members are instantiated along with the
3285 // containing function.
Richard Smith2bf7fdb2013-01-02 11:42:31 +00003286 if (SemaRef.getLangOpts().CPlusPlus11 &&
Richard Smith8acb4282014-07-31 21:57:55 +00003287 EPI.ExceptionSpec.Type != EST_None &&
3288 EPI.ExceptionSpec.Type != EST_DynamicNone &&
Serge Pavlov3739f5e72015-06-29 17:50:19 +00003289 EPI.ExceptionSpec.Type != EST_BasicNoexcept &&
Serge Pavlov73c6a242015-08-23 10:22:28 +00003290 !Tmpl->isLexicallyWithinFunctionOrMethod()) {
Richard Smithd3729422012-04-19 00:08:28 +00003291 FunctionDecl *ExceptionSpecTemplate = Tmpl;
Richard Smith8acb4282014-07-31 21:57:55 +00003292 if (EPI.ExceptionSpec.Type == EST_Uninstantiated)
3293 ExceptionSpecTemplate = EPI.ExceptionSpec.SourceTemplate;
Richard Smith185be182013-04-10 05:48:59 +00003294 ExceptionSpecificationType NewEST = EST_Uninstantiated;
Richard Smith8acb4282014-07-31 21:57:55 +00003295 if (EPI.ExceptionSpec.Type == EST_Unevaluated)
Richard Smith185be182013-04-10 05:48:59 +00003296 NewEST = EST_Unevaluated;
Richard Smithd3729422012-04-19 00:08:28 +00003297
Richard Smithf623c962012-04-17 00:58:00 +00003298 // Mark the function has having an uninstantiated exception specification.
3299 const FunctionProtoType *NewProto
3300 = New->getType()->getAs<FunctionProtoType>();
3301 assert(NewProto && "Template instantiation without function prototype?");
3302 EPI = NewProto->getExtProtoInfo();
Richard Smith8acb4282014-07-31 21:57:55 +00003303 EPI.ExceptionSpec.Type = NewEST;
3304 EPI.ExceptionSpec.SourceDecl = New;
3305 EPI.ExceptionSpec.SourceTemplate = ExceptionSpecTemplate;
Reid Kleckner896b32f2013-06-10 20:51:09 +00003306 New->setType(SemaRef.Context.getFunctionType(
Alp Toker314cc812014-01-25 16:55:45 +00003307 NewProto->getReturnType(), NewProto->getParamTypes(), EPI));
Richard Smithf623c962012-04-17 00:58:00 +00003308 } else {
Richard Smith2e321552014-11-12 02:00:47 +00003309 SemaRef.SubstExceptionSpec(New, Proto, TemplateArgs);
Richard Smithf623c962012-04-17 00:58:00 +00003310 }
Douglas Gregor049bdca2009-12-08 17:45:32 +00003311 }
3312
Rafael Espindolaba195cf2011-07-06 15:46:09 +00003313 // Get the definition. Leaves the variable unchanged if undefined.
Richard Smithf623c962012-04-17 00:58:00 +00003314 const FunctionDecl *Definition = Tmpl;
Rafael Espindolaba195cf2011-07-06 15:46:09 +00003315 Tmpl->isDefined(Definition);
3316
DeLesley Hutchins30398dd2012-01-20 22:50:54 +00003317 SemaRef.InstantiateAttrs(TemplateArgs, Definition, New,
3318 LateAttrs, StartingScope);
Douglas Gregor08329632010-06-15 17:05:35 +00003319
Douglas Gregorad3f2fc2009-06-25 22:08:12 +00003320 return false;
3321}
3322
Douglas Gregor21342092009-03-24 00:38:23 +00003323/// \brief Initializes common fields of an instantiated method
3324/// declaration (New) from the corresponding fields of its template
3325/// (Tmpl).
3326///
3327/// \returns true if there was an error
Mike Stump11289f42009-09-09 15:08:12 +00003328bool
3329TemplateDeclInstantiator::InitMethodInstantiation(CXXMethodDecl *New,
Douglas Gregor21342092009-03-24 00:38:23 +00003330 CXXMethodDecl *Tmpl) {
Douglas Gregorad3f2fc2009-06-25 22:08:12 +00003331 if (InitFunctionInstantiation(New, Tmpl))
3332 return true;
Mike Stump11289f42009-09-09 15:08:12 +00003333
Douglas Gregor21342092009-03-24 00:38:23 +00003334 New->setAccess(Tmpl->getAccess());
Fariborz Jahanian6dfc1972009-12-03 18:44:40 +00003335 if (Tmpl->isVirtualAsWritten())
Douglas Gregor11c024b2010-09-28 20:50:54 +00003336 New->setVirtualAsWritten(true);
Douglas Gregor21342092009-03-24 00:38:23 +00003337
Douglas Gregor21342092009-03-24 00:38:23 +00003338 // FIXME: New needs a pointer to Tmpl
3339 return false;
3340}
Douglas Gregorbbbb02d2009-05-13 20:28:22 +00003341
3342/// \brief Instantiate the definition of the given function from its
3343/// template.
3344///
Douglas Gregordda7ced2009-06-30 17:20:14 +00003345/// \param PointOfInstantiation the point at which the instantiation was
3346/// required. Note that this is not precisely a "point of instantiation"
3347/// for the function, but it's close.
3348///
Douglas Gregorbbbb02d2009-05-13 20:28:22 +00003349/// \param Function the already-instantiated declaration of a
Douglas Gregordda7ced2009-06-30 17:20:14 +00003350/// function template specialization or member function of a class template
3351/// specialization.
3352///
3353/// \param Recursive if true, recursively instantiates any functions that
3354/// are required by this instantiation.
Douglas Gregora8b89d22009-10-15 14:05:49 +00003355///
3356/// \param DefinitionRequired if true, then we are performing an explicit
3357/// instantiation where the body of the function is required. Complain if
3358/// there is no such body.
Douglas Gregor85673582009-05-18 17:01:57 +00003359void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
Douglas Gregordda7ced2009-06-30 17:20:14 +00003360 FunctionDecl *Function,
Douglas Gregora8b89d22009-10-15 14:05:49 +00003361 bool Recursive,
3362 bool DefinitionRequired) {
Alexis Hunt4a8ea102011-05-06 20:44:56 +00003363 if (Function->isInvalidDecl() || Function->isDefined())
Douglas Gregorb4850462009-05-14 23:26:13 +00003364 return;
3365
Francois Pichet00c7e6c2011-08-14 03:52:19 +00003366 // Never instantiate an explicit specialization except if it is a class scope
3367 // explicit specialization.
3368 if (Function->getTemplateSpecializationKind() == TSK_ExplicitSpecialization &&
3369 !Function->getClassScopeSpecializationPattern())
Douglas Gregor86d142a2009-10-08 07:24:58 +00003370 return;
Douglas Gregor69f6a362010-05-17 17:34:56 +00003371
Douglas Gregor24c332b2009-05-14 21:06:31 +00003372 // Find the function body that we'll be substituting.
Douglas Gregorafca3b42009-10-27 20:53:28 +00003373 const FunctionDecl *PatternDecl = Function->getTemplateInstantiationPattern();
Alexis Hunt23f6b832011-05-27 20:00:14 +00003374 assert(PatternDecl && "instantiating a non-template");
3375
3376 Stmt *Pattern = PatternDecl->getBody(PatternDecl);
3377 assert(PatternDecl && "template definition is not a template");
3378 if (!Pattern) {
3379 // Try to find a defaulted definition
3380 PatternDecl->isDefined(PatternDecl);
Alexis Hunt92a0adf2011-05-25 22:02:25 +00003381 }
Alexis Hunt23f6b832011-05-27 20:00:14 +00003382 assert(PatternDecl && "template definition is not a template");
Douglas Gregor24c332b2009-05-14 21:06:31 +00003383
Francois Pichet1c229c02011-04-22 22:18:13 +00003384 // Postpone late parsed template instantiations.
Alexis Hunt23f6b832011-05-27 20:00:14 +00003385 if (PatternDecl->isLateTemplateParsed() &&
Nick Lewycky610128e2011-05-12 03:51:24 +00003386 !LateTemplateParser) {
Francois Pichet1c229c02011-04-22 22:18:13 +00003387 PendingInstantiations.push_back(
3388 std::make_pair(Function, PointOfInstantiation));
3389 return;
3390 }
3391
Nico Weberae4bb8c2014-08-15 23:21:41 +00003392 // If we're performing recursive template instantiation, create our own
3393 // queue of pending implicit instantiations that we will instantiate later,
3394 // while we're still within our own instantiation context.
3395 // This has to happen before LateTemplateParser below is called, so that
3396 // it marks vtables used in late parsed templates as used.
3397 SavePendingLocalImplicitInstantiationsRAII
3398 SavedPendingLocalImplicitInstantiations(*this);
Nico Weber7a92e1a2015-01-18 01:50:35 +00003399 SavePendingInstantiationsAndVTableUsesRAII
3400 SavePendingInstantiationsAndVTableUses(*this, /*Enabled=*/Recursive);
Nico Weberae4bb8c2014-08-15 23:21:41 +00003401
David Majnemerf0a84f22013-08-16 08:29:13 +00003402 // Call the LateTemplateParser callback if there is a need to late parse
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00003403 // a templated function definition.
Alexis Hunt23f6b832011-05-27 20:00:14 +00003404 if (!Pattern && PatternDecl->isLateTemplateParsed() &&
Francois Pichet1c229c02011-04-22 22:18:13 +00003405 LateTemplateParser) {
Richard Smithe40f2ba2013-08-07 21:41:30 +00003406 // FIXME: Optimize to allow individual templates to be deserialized.
3407 if (PatternDecl->isFromASTFile())
3408 ExternalSource->ReadLateParsedTemplates(LateParsedTemplateMap);
3409
3410 LateParsedTemplate *LPT = LateParsedTemplateMap.lookup(PatternDecl);
3411 assert(LPT && "missing LateParsedTemplate");
3412 LateTemplateParser(OpaqueParser, *LPT);
Francois Pichet1c229c02011-04-22 22:18:13 +00003413 Pattern = PatternDecl->getBody(PatternDecl);
3414 }
3415
Alexis Hunt23f6b832011-05-27 20:00:14 +00003416 if (!Pattern && !PatternDecl->isDefaulted()) {
Douglas Gregora8b89d22009-10-15 14:05:49 +00003417 if (DefinitionRequired) {
3418 if (Function->getPrimaryTemplate())
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00003419 Diag(PointOfInstantiation,
Douglas Gregora8b89d22009-10-15 14:05:49 +00003420 diag::err_explicit_instantiation_undefined_func_template)
3421 << Function->getPrimaryTemplate();
3422 else
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00003423 Diag(PointOfInstantiation,
Douglas Gregora8b89d22009-10-15 14:05:49 +00003424 diag::err_explicit_instantiation_undefined_member)
3425 << 1 << Function->getDeclName() << Function->getDeclContext();
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00003426
Douglas Gregora8b89d22009-10-15 14:05:49 +00003427 if (PatternDecl)
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00003428 Diag(PatternDecl->getLocation(),
Douglas Gregora8b89d22009-10-15 14:05:49 +00003429 diag::note_explicit_instantiation_here);
Douglas Gregorfd7224f2010-05-17 17:57:54 +00003430 Function->setInvalidDecl();
Chandler Carruthcfe41db2010-08-25 08:27:02 +00003431 } else if (Function->getTemplateSpecializationKind()
3432 == TSK_ExplicitInstantiationDefinition) {
Nico Weberae4bb8c2014-08-15 23:21:41 +00003433 assert(!Recursive);
Chandler Carruth54080172010-08-25 08:44:16 +00003434 PendingInstantiations.push_back(
Chandler Carruthcfe41db2010-08-25 08:27:02 +00003435 std::make_pair(Function, PointOfInstantiation));
Douglas Gregora8b89d22009-10-15 14:05:49 +00003436 }
Chandler Carruthcfe41db2010-08-25 08:27:02 +00003437
Douglas Gregor24c332b2009-05-14 21:06:31 +00003438 return;
Douglas Gregora8b89d22009-10-15 14:05:49 +00003439 }
Douglas Gregor24c332b2009-05-14 21:06:31 +00003440
Richard Smith2a7d4812013-05-04 07:00:32 +00003441 // C++1y [temp.explicit]p10:
3442 // Except for inline functions, declarations with types deduced from their
3443 // initializer or return value, and class template specializations, other
3444 // explicit instantiation declarations have the effect of suppressing the
3445 // implicit instantiation of the entity to which they refer.
Alp Toker314cc812014-01-25 16:55:45 +00003446 if (Function->getTemplateSpecializationKind() ==
3447 TSK_ExplicitInstantiationDeclaration &&
Richard Smith2a7d4812013-05-04 07:00:32 +00003448 !PatternDecl->isInlined() &&
Alp Toker314cc812014-01-25 16:55:45 +00003449 !PatternDecl->getReturnType()->getContainedAutoType())
Douglas Gregor34ec2ef2009-09-04 22:48:11 +00003450 return;
Mike Stump11289f42009-09-09 15:08:12 +00003451
Richard Smith195d8ef2014-05-29 03:15:31 +00003452 if (PatternDecl->isInlined()) {
3453 // Function, and all later redeclarations of it (from imported modules,
3454 // for instance), are now implicitly inline.
3455 for (auto *D = Function->getMostRecentDecl(); /**/;
3456 D = D->getPreviousDecl()) {
3457 D->setImplicitlyInline();
3458 if (D == Function)
3459 break;
3460 }
3461 }
Richard Smithf3814ad2013-01-25 00:08:28 +00003462
Douglas Gregor85673582009-05-18 17:01:57 +00003463 InstantiatingTemplate Inst(*this, PointOfInstantiation, Function);
Alp Tokerd4a72d52013-10-08 08:09:04 +00003464 if (Inst.isInvalid())
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00003465 return;
3466
Abramo Bagnara12dcbf32011-11-18 08:08:52 +00003467 // Copy the inner loc start from the pattern.
3468 Function->setInnerLocStart(PatternDecl->getInnerLocStart());
3469
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00003470 EnterExpressionEvaluationContext EvalContext(*this,
John McCallfaf5fb42010-08-26 23:41:50 +00003471 Sema::PotentiallyEvaluated);
Douglas Gregor67da0d92009-05-15 17:59:04 +00003472
Douglas Gregorb4850462009-05-14 23:26:13 +00003473 // Introduce a new scope where local variable instantiations will be
Douglas Gregor7f792cf2010-01-16 22:29:39 +00003474 // recorded, unless we're actually a member function within a local
3475 // class, in which case we need to merge our results with the parent
3476 // scope (of the enclosing function).
3477 bool MergeWithParentScope = false;
3478 if (CXXRecordDecl *Rec = dyn_cast<CXXRecordDecl>(Function->getDeclContext()))
3479 MergeWithParentScope = Rec->isLocalClass();
3480
3481 LocalInstantiationScope Scope(*this, MergeWithParentScope);
Mike Stump11289f42009-09-09 15:08:12 +00003482
Richard Smithbd305122012-12-11 01:14:52 +00003483 if (PatternDecl->isDefaulted())
Alexis Hunt61ae8d32011-05-23 23:14:04 +00003484 SetDeclDefaulted(Function, PatternDecl->getLocation());
Richard Smithbd305122012-12-11 01:14:52 +00003485 else {
Richard Smithcc928662014-10-17 20:37:29 +00003486 MultiLevelTemplateArgumentList TemplateArgs =
3487 getTemplateInstantiationArgs(Function, nullptr, false, PatternDecl);
3488
3489 // Substitute into the qualifier; we can get a substitution failure here
3490 // through evil use of alias templates.
3491 // FIXME: Is CurContext correct for this? Should we go to the (instantiation
3492 // of the) lexical context of the pattern?
3493 SubstQualifier(*this, PatternDecl, Function, TemplateArgs);
3494
Craig Topperc3ec1492014-05-26 06:22:03 +00003495 ActOnStartOfFunctionDef(nullptr, Function);
Richard Smithbd305122012-12-11 01:14:52 +00003496
3497 // Enter the scope of this instantiation. We don't use
3498 // PushDeclContext because we don't have a scope.
3499 Sema::ContextRAII savedContext(*this, Function);
3500
Richard Smith2e321552014-11-12 02:00:47 +00003501 if (addInstantiatedParametersToScope(*this, Function, PatternDecl, Scope,
3502 TemplateArgs))
3503 return;
Richard Smithbd305122012-12-11 01:14:52 +00003504
Alexis Hunt61ae8d32011-05-23 23:14:04 +00003505 // If this is a constructor, instantiate the member initializers.
3506 if (const CXXConstructorDecl *Ctor =
3507 dyn_cast<CXXConstructorDecl>(PatternDecl)) {
3508 InstantiateMemInitializers(cast<CXXConstructorDecl>(Function), Ctor,
3509 TemplateArgs);
3510 }
3511
3512 // Instantiate the function body.
3513 StmtResult Body = SubstStmt(Pattern, TemplateArgs);
3514
3515 if (Body.isInvalid())
3516 Function->setInvalidDecl();
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00003517
Alexis Hunt61ae8d32011-05-23 23:14:04 +00003518 ActOnFinishFunctionBody(Function, Body.get(),
3519 /*IsInstantiation=*/true);
Richard Smithbd305122012-12-11 01:14:52 +00003520
3521 PerformDependentDiagnostics(PatternDecl, TemplateArgs);
3522
Richard Smithd28ac5b2014-03-22 23:33:22 +00003523 if (auto *Listener = getASTMutationListener())
3524 Listener->FunctionDefinitionInstantiated(Function);
Richard Smith0ac1b8f2014-03-22 01:43:32 +00003525
Richard Smithbd305122012-12-11 01:14:52 +00003526 savedContext.pop();
Mike Stump11289f42009-09-09 15:08:12 +00003527 }
3528
Douglas Gregor28ad4b52009-05-26 20:50:29 +00003529 DeclGroupRef DG(Function);
3530 Consumer.HandleTopLevelDecl(DG);
Mike Stump11289f42009-09-09 15:08:12 +00003531
Douglas Gregor7f792cf2010-01-16 22:29:39 +00003532 // This class may have local implicit instantiations that need to be
3533 // instantiation within this scope.
Chandler Carruth54080172010-08-25 08:44:16 +00003534 PerformPendingInstantiations(/*LocalOnly=*/true);
Douglas Gregor7f792cf2010-01-16 22:29:39 +00003535 Scope.Exit();
3536
Douglas Gregordda7ced2009-06-30 17:20:14 +00003537 if (Recursive) {
Nick Lewyckyef4f4562010-11-25 00:35:20 +00003538 // Define any pending vtables.
3539 DefineUsedVTables();
3540
Douglas Gregordda7ced2009-06-30 17:20:14 +00003541 // Instantiate any pending implicit instantiations found during the
Mike Stump11289f42009-09-09 15:08:12 +00003542 // instantiation of this template.
Chandler Carruth54080172010-08-25 08:44:16 +00003543 PerformPendingInstantiations();
Mike Stump11289f42009-09-09 15:08:12 +00003544
Nico Weber7a92e1a2015-01-18 01:50:35 +00003545 // PendingInstantiations and VTableUses are restored through
3546 // SavePendingInstantiationsAndVTableUses's destructor.
Douglas Gregordda7ced2009-06-30 17:20:14 +00003547 }
Douglas Gregorbbbb02d2009-05-13 20:28:22 +00003548}
3549
Larisse Voufo39a1e502013-08-06 01:03:05 +00003550VarTemplateSpecializationDecl *Sema::BuildVarTemplateInstantiation(
3551 VarTemplateDecl *VarTemplate, VarDecl *FromVar,
3552 const TemplateArgumentList &TemplateArgList,
3553 const TemplateArgumentListInfo &TemplateArgsInfo,
3554 SmallVectorImpl<TemplateArgument> &Converted,
3555 SourceLocation PointOfInstantiation, void *InsertPos,
3556 LateInstantiatedAttrVec *LateAttrs,
3557 LocalInstantiationScope *StartingScope) {
3558 if (FromVar->isInvalidDecl())
Craig Topperc3ec1492014-05-26 06:22:03 +00003559 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00003560
3561 InstantiatingTemplate Inst(*this, PointOfInstantiation, FromVar);
Alp Tokerd4a72d52013-10-08 08:09:04 +00003562 if (Inst.isInvalid())
Craig Topperc3ec1492014-05-26 06:22:03 +00003563 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00003564
3565 MultiLevelTemplateArgumentList TemplateArgLists;
3566 TemplateArgLists.addOuterTemplateArguments(&TemplateArgList);
3567
Richard Smith8809a0c2013-09-27 20:14:12 +00003568 // Instantiate the first declaration of the variable template: for a partial
3569 // specialization of a static data member template, the first declaration may
3570 // or may not be the declaration in the class; if it's in the class, we want
3571 // to instantiate a member in the class (a declaration), and if it's outside,
3572 // we want to instantiate a definition.
Richard Smithbeef3452014-01-16 23:39:20 +00003573 //
3574 // If we're instantiating an explicitly-specialized member template or member
3575 // partial specialization, don't do this. The member specialization completely
3576 // replaces the original declaration in this case.
3577 bool IsMemberSpec = false;
3578 if (VarTemplatePartialSpecializationDecl *PartialSpec =
3579 dyn_cast<VarTemplatePartialSpecializationDecl>(FromVar))
3580 IsMemberSpec = PartialSpec->isMemberSpecialization();
3581 else if (VarTemplateDecl *FromTemplate = FromVar->getDescribedVarTemplate())
3582 IsMemberSpec = FromTemplate->isMemberSpecialization();
3583 if (!IsMemberSpec)
3584 FromVar = FromVar->getFirstDecl();
Richard Smith8809a0c2013-09-27 20:14:12 +00003585
Manuel Klimek5843add2013-09-30 13:29:01 +00003586 MultiLevelTemplateArgumentList MultiLevelList(TemplateArgList);
3587 TemplateDeclInstantiator Instantiator(*this, FromVar->getDeclContext(),
3588 MultiLevelList);
Larisse Voufo39a1e502013-08-06 01:03:05 +00003589
3590 // TODO: Set LateAttrs and StartingScope ...
3591
3592 return cast_or_null<VarTemplateSpecializationDecl>(
3593 Instantiator.VisitVarTemplateSpecializationDecl(
3594 VarTemplate, FromVar, InsertPos, TemplateArgsInfo, Converted));
3595}
3596
3597/// \brief Instantiates a variable template specialization by completing it
3598/// with appropriate type information and initializer.
3599VarTemplateSpecializationDecl *Sema::CompleteVarTemplateSpecializationDecl(
3600 VarTemplateSpecializationDecl *VarSpec, VarDecl *PatternDecl,
3601 const MultiLevelTemplateArgumentList &TemplateArgs) {
3602
3603 // Do substitution on the type of the declaration
3604 TypeSourceInfo *DI =
Richard Smith8809a0c2013-09-27 20:14:12 +00003605 SubstType(PatternDecl->getTypeSourceInfo(), TemplateArgs,
Larisse Voufo39a1e502013-08-06 01:03:05 +00003606 PatternDecl->getTypeSpecStartLoc(), PatternDecl->getDeclName());
3607 if (!DI)
Craig Topperc3ec1492014-05-26 06:22:03 +00003608 return nullptr;
Larisse Voufo39a1e502013-08-06 01:03:05 +00003609
3610 // Update the type of this variable template specialization.
3611 VarSpec->setType(DI->getType());
3612
3613 // Instantiate the initializer.
3614 InstantiateVariableInitializer(VarSpec, PatternDecl, TemplateArgs);
3615
3616 return VarSpec;
3617}
3618
3619/// BuildVariableInstantiation - Used after a new variable has been created.
3620/// Sets basic variable data and decides whether to postpone the
3621/// variable instantiation.
3622void Sema::BuildVariableInstantiation(
3623 VarDecl *NewVar, VarDecl *OldVar,
3624 const MultiLevelTemplateArgumentList &TemplateArgs,
Richard Smith541b38b2013-09-20 01:15:31 +00003625 LateInstantiatedAttrVec *LateAttrs, DeclContext *Owner,
3626 LocalInstantiationScope *StartingScope,
Larisse Voufo72caf2b2013-08-22 00:59:14 +00003627 bool InstantiatingVarTemplate) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00003628
Richard Smith541b38b2013-09-20 01:15:31 +00003629 // If we are instantiating a local extern declaration, the
3630 // instantiation belongs lexically to the containing function.
Larisse Voufo39a1e502013-08-06 01:03:05 +00003631 // If we are instantiating a static data member defined
3632 // out-of-line, the instantiation will have the same lexical
3633 // context (which will be a namespace scope) as the template.
Richard Smith541b38b2013-09-20 01:15:31 +00003634 if (OldVar->isLocalExternDecl()) {
3635 NewVar->setLocalExternDecl();
3636 NewVar->setLexicalDeclContext(Owner);
3637 } else if (OldVar->isOutOfLine())
Larisse Voufo39a1e502013-08-06 01:03:05 +00003638 NewVar->setLexicalDeclContext(OldVar->getLexicalDeclContext());
3639 NewVar->setTSCSpec(OldVar->getTSCSpec());
3640 NewVar->setInitStyle(OldVar->getInitStyle());
3641 NewVar->setCXXForRangeDecl(OldVar->isCXXForRangeDecl());
3642 NewVar->setConstexpr(OldVar->isConstexpr());
Richard Smithbb13c9a2013-09-28 04:02:39 +00003643 NewVar->setInitCapture(OldVar->isInitCapture());
Richard Smith1c34fb72013-08-13 18:18:50 +00003644 NewVar->setPreviousDeclInSameBlockScope(
3645 OldVar->isPreviousDeclInSameBlockScope());
Larisse Voufo39a1e502013-08-06 01:03:05 +00003646 NewVar->setAccess(OldVar->getAccess());
3647
Richard Smith0b551192013-09-23 23:12:22 +00003648 if (!OldVar->isStaticDataMember()) {
Rafael Espindolae4865d22013-10-23 16:46:34 +00003649 if (OldVar->isUsed(false))
3650 NewVar->setIsUsed();
Larisse Voufo39a1e502013-08-06 01:03:05 +00003651 NewVar->setReferenced(OldVar->isReferenced());
3652 }
3653
3654 InstantiateAttrs(TemplateArgs, OldVar, NewVar, LateAttrs, StartingScope);
3655
Richard Smith541b38b2013-09-20 01:15:31 +00003656 LookupResult Previous(
3657 *this, NewVar->getDeclName(), NewVar->getLocation(),
3658 NewVar->isLocalExternDecl() ? Sema::LookupRedeclarationWithLinkage
3659 : Sema::LookupOrdinaryName,
3660 Sema::ForRedeclaration);
Larisse Voufo39a1e502013-08-06 01:03:05 +00003661
Argyrios Kyrtzidis91486222013-11-27 08:34:14 +00003662 if (NewVar->isLocalExternDecl() && OldVar->getPreviousDecl() &&
3663 (!OldVar->getPreviousDecl()->getDeclContext()->isDependentContext() ||
3664 OldVar->getPreviousDecl()->getDeclContext()==OldVar->getDeclContext())) {
Richard Smith1c34fb72013-08-13 18:18:50 +00003665 // We have a previous declaration. Use that one, so we merge with the
3666 // right type.
3667 if (NamedDecl *NewPrev = FindInstantiatedDecl(
3668 NewVar->getLocation(), OldVar->getPreviousDecl(), TemplateArgs))
3669 Previous.addDecl(NewPrev);
3670 } else if (!isa<VarTemplateSpecializationDecl>(NewVar) &&
3671 OldVar->hasLinkage())
Larisse Voufo39a1e502013-08-06 01:03:05 +00003672 LookupQualifiedName(Previous, NewVar->getDeclContext(), false);
Larisse Voufo72caf2b2013-08-22 00:59:14 +00003673 CheckVariableDeclaration(NewVar, Previous);
Larisse Voufo39a1e502013-08-06 01:03:05 +00003674
Richard Smith541b38b2013-09-20 01:15:31 +00003675 if (!InstantiatingVarTemplate) {
3676 NewVar->getLexicalDeclContext()->addHiddenDecl(NewVar);
3677 if (!NewVar->isLocalExternDecl() || !NewVar->getPreviousDecl())
Larisse Voufo39a1e502013-08-06 01:03:05 +00003678 NewVar->getDeclContext()->makeDeclVisibleInContext(NewVar);
Richard Smith541b38b2013-09-20 01:15:31 +00003679 }
3680
3681 if (!OldVar->isOutOfLine()) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00003682 if (NewVar->getDeclContext()->isFunctionOrMethod())
3683 CurrentInstantiationScope->InstantiatedLocal(OldVar, NewVar);
3684 }
3685
3686 // Link instantiations of static data members back to the template from
3687 // which they were instantiated.
Larisse Voufo72caf2b2013-08-22 00:59:14 +00003688 if (NewVar->isStaticDataMember() && !InstantiatingVarTemplate)
Larisse Voufo39a1e502013-08-06 01:03:05 +00003689 NewVar->setInstantiationOfStaticDataMember(OldVar,
3690 TSK_ImplicitInstantiation);
3691
David Majnemerdbc0c8f2013-12-04 09:01:55 +00003692 // Forward the mangling number from the template to the instantiated decl.
3693 Context.setManglingNumber(NewVar, Context.getManglingNumber(OldVar));
David Majnemer2206bf52014-03-05 08:57:59 +00003694 Context.setStaticLocalNumber(NewVar, Context.getStaticLocalNumber(OldVar));
David Majnemerdbc0c8f2013-12-04 09:01:55 +00003695
Richard Smith8809a0c2013-09-27 20:14:12 +00003696 // Delay instantiation of the initializer for variable templates until a
Richard Smithd292b242014-03-16 01:00:40 +00003697 // definition of the variable is needed. We need it right away if the type
3698 // contains 'auto'.
3699 if ((!isa<VarTemplateSpecializationDecl>(NewVar) &&
3700 !InstantiatingVarTemplate) ||
3701 NewVar->getType()->isUndeducedType())
Larisse Voufo39a1e502013-08-06 01:03:05 +00003702 InstantiateVariableInitializer(NewVar, OldVar, TemplateArgs);
3703
3704 // Diagnose unused local variables with dependent types, where the diagnostic
3705 // will have been deferred.
3706 if (!NewVar->isInvalidDecl() &&
Nico Weber72889432014-09-06 01:25:55 +00003707 NewVar->getDeclContext()->isFunctionOrMethod() &&
Larisse Voufo39a1e502013-08-06 01:03:05 +00003708 OldVar->getType()->isDependentType())
3709 DiagnoseUnusedDecl(NewVar);
3710}
3711
3712/// \brief Instantiate the initializer of a variable.
3713void Sema::InstantiateVariableInitializer(
3714 VarDecl *Var, VarDecl *OldVar,
3715 const MultiLevelTemplateArgumentList &TemplateArgs) {
3716
3717 if (Var->getAnyInitializer())
3718 // We already have an initializer in the class.
3719 return;
3720
3721 if (OldVar->getInit()) {
3722 if (Var->isStaticDataMember() && !OldVar->isOutOfLine())
3723 PushExpressionEvaluationContext(Sema::ConstantEvaluated, OldVar);
3724 else
3725 PushExpressionEvaluationContext(Sema::PotentiallyEvaluated, OldVar);
3726
3727 // Instantiate the initializer.
3728 ExprResult Init =
3729 SubstInitializer(OldVar->getInit(), TemplateArgs,
3730 OldVar->getInitStyle() == VarDecl::CallInit);
3731 if (!Init.isInvalid()) {
3732 bool TypeMayContainAuto = true;
Hans Wennborg91ebe6e2014-06-10 00:55:51 +00003733 Expr *InitExpr = Init.get();
3734
Richard Smith95b83e92014-07-10 20:53:43 +00003735 if (Var->hasAttr<DLLImportAttr>() &&
3736 (!InitExpr ||
3737 !InitExpr->isConstantInitializer(getASTContext(), false))) {
Hans Wennborg91ebe6e2014-06-10 00:55:51 +00003738 // Do not dynamically initialize dllimport variables.
Hans Wennborg91ebe6e2014-06-10 00:55:51 +00003739 } else if (InitExpr) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00003740 bool DirectInit = OldVar->isDirectInit();
Hans Wennborg91ebe6e2014-06-10 00:55:51 +00003741 AddInitializerToDecl(Var, InitExpr, DirectInit, TypeMayContainAuto);
Larisse Voufo39a1e502013-08-06 01:03:05 +00003742 } else
3743 ActOnUninitializedDecl(Var, TypeMayContainAuto);
3744 } else {
3745 // FIXME: Not too happy about invalidating the declaration
3746 // because of a bogus initializer.
3747 Var->setInvalidDecl();
3748 }
3749
3750 PopExpressionEvaluationContext();
3751 } else if ((!Var->isStaticDataMember() || Var->isOutOfLine()) &&
3752 !Var->isCXXForRangeDecl())
3753 ActOnUninitializedDecl(Var, false);
3754}
3755
Douglas Gregorbbbb02d2009-05-13 20:28:22 +00003756/// \brief Instantiate the definition of the given variable from its
3757/// template.
3758///
Douglas Gregora6ef8f02009-07-24 20:34:43 +00003759/// \param PointOfInstantiation the point at which the instantiation was
3760/// required. Note that this is not precisely a "point of instantiation"
3761/// for the function, but it's close.
3762///
3763/// \param Var the already-instantiated declaration of a static member
3764/// variable of a class template specialization.
3765///
3766/// \param Recursive if true, recursively instantiates any functions that
3767/// are required by this instantiation.
Douglas Gregora8b89d22009-10-15 14:05:49 +00003768///
3769/// \param DefinitionRequired if true, then we are performing an explicit
3770/// instantiation where an out-of-line definition of the member variable
3771/// is required. Complain if there is no such definition.
Douglas Gregora6ef8f02009-07-24 20:34:43 +00003772void Sema::InstantiateStaticDataMemberDefinition(
3773 SourceLocation PointOfInstantiation,
3774 VarDecl *Var,
Douglas Gregora8b89d22009-10-15 14:05:49 +00003775 bool Recursive,
3776 bool DefinitionRequired) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00003777 InstantiateVariableDefinition(PointOfInstantiation, Var, Recursive,
3778 DefinitionRequired);
3779}
3780
3781void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
3782 VarDecl *Var, bool Recursive,
3783 bool DefinitionRequired) {
Douglas Gregora6ef8f02009-07-24 20:34:43 +00003784 if (Var->isInvalidDecl())
3785 return;
Mike Stump11289f42009-09-09 15:08:12 +00003786
Larisse Voufo39a1e502013-08-06 01:03:05 +00003787 VarTemplateSpecializationDecl *VarSpec =
3788 dyn_cast<VarTemplateSpecializationDecl>(Var);
Craig Topperc3ec1492014-05-26 06:22:03 +00003789 VarDecl *PatternDecl = nullptr, *Def = nullptr;
Richard Smith8809a0c2013-09-27 20:14:12 +00003790 MultiLevelTemplateArgumentList TemplateArgs =
3791 getTemplateInstantiationArgs(Var);
Mike Stump11289f42009-09-09 15:08:12 +00003792
Larisse Voufo39a1e502013-08-06 01:03:05 +00003793 if (VarSpec) {
Richard Smith8809a0c2013-09-27 20:14:12 +00003794 // If this is a variable template specialization, make sure that it is
3795 // non-dependent, then find its instantiation pattern.
Larisse Voufo39a1e502013-08-06 01:03:05 +00003796 bool InstantiationDependent = false;
3797 assert(!TemplateSpecializationType::anyDependentTemplateArguments(
3798 VarSpec->getTemplateArgsInfo(), InstantiationDependent) &&
3799 "Only instantiate variable template specializations that are "
3800 "not type-dependent");
Larisse Voufo4154f462013-08-06 03:57:41 +00003801 (void)InstantiationDependent;
Larisse Voufo39a1e502013-08-06 01:03:05 +00003802
Richard Smith8809a0c2013-09-27 20:14:12 +00003803 // Find the variable initialization that we'll be substituting. If the
3804 // pattern was instantiated from a member template, look back further to
3805 // find the real pattern.
Larisse Voufo39a1e502013-08-06 01:03:05 +00003806 assert(VarSpec->getSpecializedTemplate() &&
3807 "Specialization without specialized template?");
3808 llvm::PointerUnion<VarTemplateDecl *,
3809 VarTemplatePartialSpecializationDecl *> PatternPtr =
3810 VarSpec->getSpecializedTemplateOrPartial();
Larisse Voufoa11bd8a2013-08-13 02:02:26 +00003811 if (PatternPtr.is<VarTemplatePartialSpecializationDecl *>()) {
Richard Smith8809a0c2013-09-27 20:14:12 +00003812 VarTemplatePartialSpecializationDecl *Tmpl =
3813 PatternPtr.get<VarTemplatePartialSpecializationDecl *>();
3814 while (VarTemplatePartialSpecializationDecl *From =
3815 Tmpl->getInstantiatedFromMember()) {
3816 if (Tmpl->isMemberSpecialization())
3817 break;
Larisse Voufoa11bd8a2013-08-13 02:02:26 +00003818
Richard Smith8809a0c2013-09-27 20:14:12 +00003819 Tmpl = From;
3820 }
3821 PatternDecl = Tmpl;
Larisse Voufoa11bd8a2013-08-13 02:02:26 +00003822 } else {
Richard Smith8809a0c2013-09-27 20:14:12 +00003823 VarTemplateDecl *Tmpl = PatternPtr.get<VarTemplateDecl *>();
3824 while (VarTemplateDecl *From =
3825 Tmpl->getInstantiatedFromMemberTemplate()) {
3826 if (Tmpl->isMemberSpecialization())
3827 break;
Larisse Voufoa11bd8a2013-08-13 02:02:26 +00003828
Richard Smith8809a0c2013-09-27 20:14:12 +00003829 Tmpl = From;
3830 }
3831 PatternDecl = Tmpl->getTemplatedDecl();
Larisse Voufoa11bd8a2013-08-13 02:02:26 +00003832 }
Richard Smith8809a0c2013-09-27 20:14:12 +00003833
3834 // If this is a static data member template, there might be an
3835 // uninstantiated initializer on the declaration. If so, instantiate
3836 // it now.
3837 if (PatternDecl->isStaticDataMember() &&
Rafael Espindola8db352d2013-10-17 15:37:26 +00003838 (PatternDecl = PatternDecl->getFirstDecl())->hasInit() &&
Richard Smith8809a0c2013-09-27 20:14:12 +00003839 !Var->hasInit()) {
3840 // FIXME: Factor out the duplicated instantiation context setup/tear down
3841 // code here.
3842 InstantiatingTemplate Inst(*this, PointOfInstantiation, Var);
Alp Tokerd4a72d52013-10-08 08:09:04 +00003843 if (Inst.isInvalid())
Richard Smith8809a0c2013-09-27 20:14:12 +00003844 return;
3845
3846 // If we're performing recursive template instantiation, create our own
3847 // queue of pending implicit instantiations that we will instantiate
3848 // later, while we're still within our own instantiation context.
Nico Weber7a92e1a2015-01-18 01:50:35 +00003849 SavePendingInstantiationsAndVTableUsesRAII
3850 SavePendingInstantiationsAndVTableUses(*this, /*Enabled=*/Recursive);
Richard Smith8809a0c2013-09-27 20:14:12 +00003851
3852 LocalInstantiationScope Local(*this);
3853
3854 // Enter the scope of this instantiation. We don't use
3855 // PushDeclContext because we don't have a scope.
3856 ContextRAII PreviousContext(*this, Var->getDeclContext());
3857 InstantiateVariableInitializer(Var, PatternDecl, TemplateArgs);
3858 PreviousContext.pop();
3859
3860 // FIXME: Need to inform the ASTConsumer that we instantiated the
3861 // initializer?
3862
3863 // This variable may have local implicit instantiations that need to be
3864 // instantiated within this scope.
3865 PerformPendingInstantiations(/*LocalOnly=*/true);
3866
3867 Local.Exit();
3868
3869 if (Recursive) {
3870 // Define any newly required vtables.
3871 DefineUsedVTables();
3872
3873 // Instantiate any pending implicit instantiations found during the
3874 // instantiation of this template.
3875 PerformPendingInstantiations();
3876
Nico Weber7a92e1a2015-01-18 01:50:35 +00003877 // PendingInstantiations and VTableUses are restored through
3878 // SavePendingInstantiationsAndVTableUses's destructor.
Richard Smith8809a0c2013-09-27 20:14:12 +00003879 }
3880 }
3881
3882 // Find actual definition
3883 Def = PatternDecl->getDefinition(getASTContext());
3884 } else {
3885 // If this is a static data member, find its out-of-line definition.
3886 assert(Var->isStaticDataMember() && "not a static data member?");
3887 PatternDecl = Var->getInstantiatedFromStaticDataMember();
3888
3889 assert(PatternDecl && "data member was not instantiated from a template?");
3890 assert(PatternDecl->isStaticDataMember() && "not a static data member?");
3891 Def = PatternDecl->getOutOfLineDefinition();
Larisse Voufo39a1e502013-08-06 01:03:05 +00003892 }
3893
Richard Smith8809a0c2013-09-27 20:14:12 +00003894 // If we don't have a definition of the variable template, we won't perform
3895 // any instantiation. Rather, we rely on the user to instantiate this
3896 // definition (or provide a specialization for it) in another translation
3897 // unit.
3898 if (!Def) {
Douglas Gregora8b89d22009-10-15 14:05:49 +00003899 if (DefinitionRequired) {
Richard Smith8809a0c2013-09-27 20:14:12 +00003900 if (VarSpec)
Larisse Voufo39a1e502013-08-06 01:03:05 +00003901 Diag(PointOfInstantiation,
Richard Smith8809a0c2013-09-27 20:14:12 +00003902 diag::err_explicit_instantiation_undefined_var_template) << Var;
3903 else
Larisse Voufo39a1e502013-08-06 01:03:05 +00003904 Diag(PointOfInstantiation,
3905 diag::err_explicit_instantiation_undefined_member)
Richard Smith8809a0c2013-09-27 20:14:12 +00003906 << 2 << Var->getDeclName() << Var->getDeclContext();
3907 Diag(PatternDecl->getLocation(),
3908 diag::note_explicit_instantiation_here);
Larisse Voufo39a1e502013-08-06 01:03:05 +00003909 if (VarSpec)
3910 Var->setInvalidDecl();
Chandler Carruthcfe41db2010-08-25 08:27:02 +00003911 } else if (Var->getTemplateSpecializationKind()
3912 == TSK_ExplicitInstantiationDefinition) {
Chandler Carruth54080172010-08-25 08:44:16 +00003913 PendingInstantiations.push_back(
Chandler Carruthcfe41db2010-08-25 08:27:02 +00003914 std::make_pair(Var, PointOfInstantiation));
3915 }
3916
Douglas Gregora6ef8f02009-07-24 20:34:43 +00003917 return;
3918 }
3919
Rafael Espindola189fa742012-03-05 10:54:55 +00003920 TemplateSpecializationKind TSK = Var->getTemplateSpecializationKind();
3921
Douglas Gregor86d142a2009-10-08 07:24:58 +00003922 // Never instantiate an explicit specialization.
Rafael Espindola189fa742012-03-05 10:54:55 +00003923 if (TSK == TSK_ExplicitSpecialization)
Douglas Gregor86d142a2009-10-08 07:24:58 +00003924 return;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00003925
Larisse Voufo39a1e502013-08-06 01:03:05 +00003926 // C++11 [temp.explicit]p10:
3927 // Except for inline functions, [...] explicit instantiation declarations
3928 // have the effect of suppressing the implicit instantiation of the entity
3929 // to which they refer.
Rafael Espindola189fa742012-03-05 10:54:55 +00003930 if (TSK == TSK_ExplicitInstantiationDeclaration)
Douglas Gregor86d142a2009-10-08 07:24:58 +00003931 return;
Mike Stump11289f42009-09-09 15:08:12 +00003932
Argyrios Kyrtzidis8a27b2b2013-02-24 00:05:01 +00003933 // Make sure to pass the instantiated variable to the consumer at the end.
3934 struct PassToConsumerRAII {
3935 ASTConsumer &Consumer;
3936 VarDecl *Var;
3937
3938 PassToConsumerRAII(ASTConsumer &Consumer, VarDecl *Var)
3939 : Consumer(Consumer), Var(Var) { }
3940
3941 ~PassToConsumerRAII() {
Richard Smith8809a0c2013-09-27 20:14:12 +00003942 Consumer.HandleCXXStaticMemberVarInstantiation(Var);
Argyrios Kyrtzidis8a27b2b2013-02-24 00:05:01 +00003943 }
3944 } PassToConsumerRAII(Consumer, Var);
Rafael Espindoladf88f6f2012-03-08 15:51:03 +00003945
Reid Klecknere07140e2015-04-15 01:08:06 +00003946 // If we already have a definition, we're done.
3947 if (VarDecl *Def = Var->getDefinition()) {
3948 // We may be explicitly instantiating something we've already implicitly
3949 // instantiated.
3950 Def->setTemplateSpecializationKind(Var->getTemplateSpecializationKind(),
3951 PointOfInstantiation);
Richard Smith8809a0c2013-09-27 20:14:12 +00003952 return;
Reid Klecknere07140e2015-04-15 01:08:06 +00003953 }
Douglas Gregor57d4f972011-06-03 03:35:07 +00003954
Douglas Gregora6ef8f02009-07-24 20:34:43 +00003955 InstantiatingTemplate Inst(*this, PointOfInstantiation, Var);
Alp Tokerd4a72d52013-10-08 08:09:04 +00003956 if (Inst.isInvalid())
Douglas Gregora6ef8f02009-07-24 20:34:43 +00003957 return;
Mike Stump11289f42009-09-09 15:08:12 +00003958
Douglas Gregora6ef8f02009-07-24 20:34:43 +00003959 // If we're performing recursive template instantiation, create our own
3960 // queue of pending implicit instantiations that we will instantiate later,
3961 // while we're still within our own instantiation context.
David Majnemerfd6c685f2013-11-27 22:57:44 +00003962 SavePendingLocalImplicitInstantiationsRAII
3963 SavedPendingLocalImplicitInstantiations(*this);
Nico Weber7a92e1a2015-01-18 01:50:35 +00003964 SavePendingInstantiationsAndVTableUsesRAII
3965 SavePendingInstantiationsAndVTableUses(*this, /*Enabled=*/Recursive);
Mike Stump11289f42009-09-09 15:08:12 +00003966
Douglas Gregora6ef8f02009-07-24 20:34:43 +00003967 // Enter the scope of this instantiation. We don't use
3968 // PushDeclContext because we don't have a scope.
Larisse Voufo39a1e502013-08-06 01:03:05 +00003969 ContextRAII PreviousContext(*this, Var->getDeclContext());
Douglas Gregora86bc002012-02-16 21:36:18 +00003970 LocalInstantiationScope Local(*this);
John McCall2957e3e2011-02-14 20:37:25 +00003971
Larisse Voufo39a1e502013-08-06 01:03:05 +00003972 VarDecl *OldVar = Var;
3973 if (!VarSpec)
3974 Var = cast_or_null<VarDecl>(SubstDecl(Def, Var->getDeclContext(),
Richard Smith8809a0c2013-09-27 20:14:12 +00003975 TemplateArgs));
3976 else if (Var->isStaticDataMember() &&
3977 Var->getLexicalDeclContext()->isRecord()) {
3978 // We need to instantiate the definition of a static data member template,
3979 // and all we have is the in-class declaration of it. Instantiate a separate
3980 // declaration of the definition.
3981 TemplateDeclInstantiator Instantiator(*this, Var->getDeclContext(),
3982 TemplateArgs);
3983 Var = cast_or_null<VarDecl>(Instantiator.VisitVarTemplateSpecializationDecl(
Craig Topperc3ec1492014-05-26 06:22:03 +00003984 VarSpec->getSpecializedTemplate(), Def, nullptr,
Richard Smith8809a0c2013-09-27 20:14:12 +00003985 VarSpec->getTemplateArgsInfo(), VarSpec->getTemplateArgs().asArray()));
3986 if (Var) {
3987 llvm::PointerUnion<VarTemplateDecl *,
3988 VarTemplatePartialSpecializationDecl *> PatternPtr =
3989 VarSpec->getSpecializedTemplateOrPartial();
3990 if (VarTemplatePartialSpecializationDecl *Partial =
3991 PatternPtr.dyn_cast<VarTemplatePartialSpecializationDecl *>())
3992 cast<VarTemplateSpecializationDecl>(Var)->setInstantiationOf(
3993 Partial, &VarSpec->getTemplateInstantiationArgs());
3994
3995 // Merge the definition with the declaration.
3996 LookupResult R(*this, Var->getDeclName(), Var->getLocation(),
3997 LookupOrdinaryName, ForRedeclaration);
3998 R.addDecl(OldVar);
3999 MergeVarDecl(Var, R);
4000
4001 // Attach the initializer.
4002 InstantiateVariableInitializer(Var, Def, TemplateArgs);
4003 }
4004 } else
4005 // Complete the existing variable's definition with an appropriately
4006 // substituted type and initializer.
4007 Var = CompleteVarTemplateSpecializationDecl(VarSpec, Def, TemplateArgs);
Larisse Voufo39a1e502013-08-06 01:03:05 +00004008
4009 PreviousContext.pop();
Douglas Gregora6ef8f02009-07-24 20:34:43 +00004010
4011 if (Var) {
Larisse Voufo39a1e502013-08-06 01:03:05 +00004012 PassToConsumerRAII.Var = Var;
Richard Smith8809a0c2013-09-27 20:14:12 +00004013 Var->setTemplateSpecializationKind(OldVar->getTemplateSpecializationKind(),
4014 OldVar->getPointOfInstantiation());
Douglas Gregora6ef8f02009-07-24 20:34:43 +00004015 }
Larisse Voufo39a1e502013-08-06 01:03:05 +00004016
4017 // This variable may have local implicit instantiations that need to be
4018 // instantiated within this scope.
4019 PerformPendingInstantiations(/*LocalOnly=*/true);
4020
Douglas Gregora86bc002012-02-16 21:36:18 +00004021 Local.Exit();
4022
Douglas Gregora6ef8f02009-07-24 20:34:43 +00004023 if (Recursive) {
Nick Lewycky67c4d0f2011-05-31 07:58:42 +00004024 // Define any newly required vtables.
4025 DefineUsedVTables();
4026
Douglas Gregora6ef8f02009-07-24 20:34:43 +00004027 // Instantiate any pending implicit instantiations found during the
Mike Stump11289f42009-09-09 15:08:12 +00004028 // instantiation of this template.
Chandler Carruth54080172010-08-25 08:44:16 +00004029 PerformPendingInstantiations();
Mike Stump11289f42009-09-09 15:08:12 +00004030
Nico Weber7a92e1a2015-01-18 01:50:35 +00004031 // PendingInstantiations and VTableUses are restored through
4032 // SavePendingInstantiationsAndVTableUses's destructor.
Mike Stump11289f42009-09-09 15:08:12 +00004033 }
Douglas Gregorbbbb02d2009-05-13 20:28:22 +00004034}
Douglas Gregor51783312009-05-27 05:35:12 +00004035
Anders Carlsson70553942009-08-29 05:16:22 +00004036void
4037Sema::InstantiateMemInitializers(CXXConstructorDecl *New,
4038 const CXXConstructorDecl *Tmpl,
4039 const MultiLevelTemplateArgumentList &TemplateArgs) {
Mike Stump11289f42009-09-09 15:08:12 +00004040
Richard Trieu9becef62011-09-09 03:18:59 +00004041 SmallVector<CXXCtorInitializer*, 4> NewInits;
Richard Smith60f2e1e2012-09-25 00:23:05 +00004042 bool AnyErrors = Tmpl->isInvalidDecl();
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004043
Anders Carlsson70553942009-08-29 05:16:22 +00004044 // Instantiate all the initializers.
Aaron Ballman0ad78302014-03-13 17:34:31 +00004045 for (const auto *Init : Tmpl->inits()) {
Chandler Carruthf92bd8c2010-09-03 21:54:20 +00004046 // Only instantiate written initializers, let Sema re-construct implicit
4047 // ones.
4048 if (!Init->isWritten())
4049 continue;
4050
Douglas Gregor44e7df62011-01-04 00:32:56 +00004051 SourceLocation EllipsisLoc;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004052
Douglas Gregor44e7df62011-01-04 00:32:56 +00004053 if (Init->isPackExpansion()) {
4054 // This is a pack expansion. We should expand it now.
Douglas Gregord73f3dd2011-11-01 01:16:03 +00004055 TypeLoc BaseTL = Init->getTypeSourceInfo()->getTypeLoc();
Nick Lewycky2c308502013-06-13 00:45:47 +00004056 SmallVector<UnexpandedParameterPack, 4> Unexpanded;
Douglas Gregor44e7df62011-01-04 00:32:56 +00004057 collectUnexpandedParameterPacks(BaseTL, Unexpanded);
Nick Lewycky2c308502013-06-13 00:45:47 +00004058 collectUnexpandedParameterPacks(Init->getInit(), Unexpanded);
Douglas Gregor44e7df62011-01-04 00:32:56 +00004059 bool ShouldExpand = false;
Douglas Gregora8bac7f2011-01-10 07:32:04 +00004060 bool RetainExpansion = false;
David Blaikie05785d12013-02-20 22:23:23 +00004061 Optional<unsigned> NumExpansions;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004062 if (CheckParameterPacksForExpansion(Init->getEllipsisLoc(),
Douglas Gregor44e7df62011-01-04 00:32:56 +00004063 BaseTL.getSourceRange(),
David Blaikieb9c168a2011-09-22 02:34:54 +00004064 Unexpanded,
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004065 TemplateArgs, ShouldExpand,
Douglas Gregora8bac7f2011-01-10 07:32:04 +00004066 RetainExpansion,
Douglas Gregor44e7df62011-01-04 00:32:56 +00004067 NumExpansions)) {
4068 AnyErrors = true;
4069 New->setInvalidDecl();
4070 continue;
4071 }
4072 assert(ShouldExpand && "Partial instantiation of base initializer?");
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004073
4074 // Loop over all of the arguments in the argument pack(s),
Douglas Gregor0dca5fd2011-01-14 17:04:44 +00004075 for (unsigned I = 0; I != *NumExpansions; ++I) {
Douglas Gregor44e7df62011-01-04 00:32:56 +00004076 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(*this, I);
4077
4078 // Instantiate the initializer.
Sebastian Redla9351792012-02-11 23:51:47 +00004079 ExprResult TempInit = SubstInitializer(Init->getInit(), TemplateArgs,
4080 /*CXXDirectInit=*/true);
4081 if (TempInit.isInvalid()) {
Douglas Gregor44e7df62011-01-04 00:32:56 +00004082 AnyErrors = true;
4083 break;
4084 }
4085
4086 // Instantiate the base type.
Douglas Gregord73f3dd2011-11-01 01:16:03 +00004087 TypeSourceInfo *BaseTInfo = SubstType(Init->getTypeSourceInfo(),
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004088 TemplateArgs,
4089 Init->getSourceLocation(),
Douglas Gregor44e7df62011-01-04 00:32:56 +00004090 New->getDeclName());
4091 if (!BaseTInfo) {
4092 AnyErrors = true;
4093 break;
4094 }
4095
4096 // Build the initializer.
Sebastian Redla74948d2011-09-24 17:48:25 +00004097 MemInitResult NewInit = BuildBaseInitializer(BaseTInfo->getType(),
Nikola Smiljanic01a75982014-05-29 10:55:11 +00004098 BaseTInfo, TempInit.get(),
Douglas Gregor44e7df62011-01-04 00:32:56 +00004099 New->getParent(),
4100 SourceLocation());
4101 if (NewInit.isInvalid()) {
4102 AnyErrors = true;
4103 break;
4104 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004105
Douglas Gregor44e7df62011-01-04 00:32:56 +00004106 NewInits.push_back(NewInit.get());
Douglas Gregor44e7df62011-01-04 00:32:56 +00004107 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004108
Douglas Gregor44e7df62011-01-04 00:32:56 +00004109 continue;
4110 }
4111
Douglas Gregorb30f22b2010-03-02 07:38:39 +00004112 // Instantiate the initializer.
Sebastian Redla9351792012-02-11 23:51:47 +00004113 ExprResult TempInit = SubstInitializer(Init->getInit(), TemplateArgs,
4114 /*CXXDirectInit=*/true);
4115 if (TempInit.isInvalid()) {
Douglas Gregorb30f22b2010-03-02 07:38:39 +00004116 AnyErrors = true;
4117 continue;
Anders Carlsson70553942009-08-29 05:16:22 +00004118 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004119
Anders Carlsson70553942009-08-29 05:16:22 +00004120 MemInitResult NewInit;
Douglas Gregord73f3dd2011-11-01 01:16:03 +00004121 if (Init->isDelegatingInitializer() || Init->isBaseInitializer()) {
4122 TypeSourceInfo *TInfo = SubstType(Init->getTypeSourceInfo(),
4123 TemplateArgs,
4124 Init->getSourceLocation(),
4125 New->getDeclName());
4126 if (!TInfo) {
Douglas Gregor7ae2d772010-01-31 09:12:51 +00004127 AnyErrors = true;
Douglas Gregorc8c44b5d2009-12-02 22:36:29 +00004128 New->setInvalidDecl();
4129 continue;
4130 }
Sebastian Redla74948d2011-09-24 17:48:25 +00004131
Douglas Gregord73f3dd2011-11-01 01:16:03 +00004132 if (Init->isBaseInitializer())
Nikola Smiljanic01a75982014-05-29 10:55:11 +00004133 NewInit = BuildBaseInitializer(TInfo->getType(), TInfo, TempInit.get(),
Douglas Gregord73f3dd2011-11-01 01:16:03 +00004134 New->getParent(), EllipsisLoc);
4135 else
Nikola Smiljanic01a75982014-05-29 10:55:11 +00004136 NewInit = BuildDelegatingInitializer(TInfo, TempInit.get(),
Douglas Gregord73f3dd2011-11-01 01:16:03 +00004137 cast<CXXRecordDecl>(CurContext->getParent()));
Anders Carlsson70553942009-08-29 05:16:22 +00004138 } else if (Init->isMemberInitializer()) {
Douglas Gregor55e6b312011-03-04 19:46:35 +00004139 FieldDecl *Member = cast_or_null<FieldDecl>(FindInstantiatedDecl(
Francois Pichetd583da02010-12-04 09:14:42 +00004140 Init->getMemberLocation(),
4141 Init->getMember(),
4142 TemplateArgs));
Douglas Gregor55e6b312011-03-04 19:46:35 +00004143 if (!Member) {
4144 AnyErrors = true;
4145 New->setInvalidDecl();
4146 continue;
4147 }
Mike Stump11289f42009-09-09 15:08:12 +00004148
Nikola Smiljanic01a75982014-05-29 10:55:11 +00004149 NewInit = BuildMemberInitializer(Member, TempInit.get(),
Sebastian Redla74948d2011-09-24 17:48:25 +00004150 Init->getSourceLocation());
Francois Pichetd583da02010-12-04 09:14:42 +00004151 } else if (Init->isIndirectMemberInitializer()) {
4152 IndirectFieldDecl *IndirectMember =
Douglas Gregor55e6b312011-03-04 19:46:35 +00004153 cast_or_null<IndirectFieldDecl>(FindInstantiatedDecl(
Francois Pichetd583da02010-12-04 09:14:42 +00004154 Init->getMemberLocation(),
4155 Init->getIndirectMember(), TemplateArgs));
4156
Douglas Gregor55e6b312011-03-04 19:46:35 +00004157 if (!IndirectMember) {
4158 AnyErrors = true;
4159 New->setInvalidDecl();
Sebastian Redla74948d2011-09-24 17:48:25 +00004160 continue;
Douglas Gregor55e6b312011-03-04 19:46:35 +00004161 }
Sebastian Redla74948d2011-09-24 17:48:25 +00004162
Nikola Smiljanic01a75982014-05-29 10:55:11 +00004163 NewInit = BuildMemberInitializer(IndirectMember, TempInit.get(),
Sebastian Redla74948d2011-09-24 17:48:25 +00004164 Init->getSourceLocation());
Anders Carlsson70553942009-08-29 05:16:22 +00004165 }
4166
Douglas Gregor7ae2d772010-01-31 09:12:51 +00004167 if (NewInit.isInvalid()) {
4168 AnyErrors = true;
Anders Carlsson70553942009-08-29 05:16:22 +00004169 New->setInvalidDecl();
Douglas Gregor7ae2d772010-01-31 09:12:51 +00004170 } else {
Richard Trieu9becef62011-09-09 03:18:59 +00004171 NewInits.push_back(NewInit.get());
Anders Carlsson70553942009-08-29 05:16:22 +00004172 }
4173 }
Mike Stump11289f42009-09-09 15:08:12 +00004174
Anders Carlsson70553942009-08-29 05:16:22 +00004175 // Assign all the initializers to the new constructor.
John McCall48871652010-08-21 09:40:31 +00004176 ActOnMemInitializers(New,
Anders Carlsson70553942009-08-29 05:16:22 +00004177 /*FIXME: ColonLoc */
4178 SourceLocation(),
David Blaikie3fc2f912013-01-17 05:26:25 +00004179 NewInits,
Douglas Gregor7ae2d772010-01-31 09:12:51 +00004180 AnyErrors);
Anders Carlsson70553942009-08-29 05:16:22 +00004181}
4182
John McCall59660882009-08-29 08:11:13 +00004183// TODO: this could be templated if the various decl types used the
4184// same method name.
4185static bool isInstantiationOf(ClassTemplateDecl *Pattern,
4186 ClassTemplateDecl *Instance) {
4187 Pattern = Pattern->getCanonicalDecl();
4188
4189 do {
4190 Instance = Instance->getCanonicalDecl();
4191 if (Pattern == Instance) return true;
4192 Instance = Instance->getInstantiatedFromMemberTemplate();
4193 } while (Instance);
4194
4195 return false;
4196}
4197
Douglas Gregor14d1bf42009-09-28 06:34:35 +00004198static bool isInstantiationOf(FunctionTemplateDecl *Pattern,
4199 FunctionTemplateDecl *Instance) {
4200 Pattern = Pattern->getCanonicalDecl();
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004201
Douglas Gregor14d1bf42009-09-28 06:34:35 +00004202 do {
4203 Instance = Instance->getCanonicalDecl();
4204 if (Pattern == Instance) return true;
4205 Instance = Instance->getInstantiatedFromMemberTemplate();
4206 } while (Instance);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004207
Douglas Gregor14d1bf42009-09-28 06:34:35 +00004208 return false;
4209}
4210
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004211static bool
Douglas Gregor21610382009-10-29 00:04:11 +00004212isInstantiationOf(ClassTemplatePartialSpecializationDecl *Pattern,
4213 ClassTemplatePartialSpecializationDecl *Instance) {
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004214 Pattern
Douglas Gregor21610382009-10-29 00:04:11 +00004215 = cast<ClassTemplatePartialSpecializationDecl>(Pattern->getCanonicalDecl());
4216 do {
4217 Instance = cast<ClassTemplatePartialSpecializationDecl>(
4218 Instance->getCanonicalDecl());
4219 if (Pattern == Instance)
4220 return true;
4221 Instance = Instance->getInstantiatedFromMember();
4222 } while (Instance);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004223
Douglas Gregor21610382009-10-29 00:04:11 +00004224 return false;
4225}
4226
John McCall59660882009-08-29 08:11:13 +00004227static bool isInstantiationOf(CXXRecordDecl *Pattern,
4228 CXXRecordDecl *Instance) {
4229 Pattern = Pattern->getCanonicalDecl();
4230
4231 do {
4232 Instance = Instance->getCanonicalDecl();
4233 if (Pattern == Instance) return true;
4234 Instance = Instance->getInstantiatedFromMemberClass();
4235 } while (Instance);
4236
4237 return false;
4238}
4239
4240static bool isInstantiationOf(FunctionDecl *Pattern,
4241 FunctionDecl *Instance) {
4242 Pattern = Pattern->getCanonicalDecl();
4243
4244 do {
4245 Instance = Instance->getCanonicalDecl();
4246 if (Pattern == Instance) return true;
4247 Instance = Instance->getInstantiatedFromMemberFunction();
4248 } while (Instance);
4249
4250 return false;
4251}
4252
4253static bool isInstantiationOf(EnumDecl *Pattern,
4254 EnumDecl *Instance) {
4255 Pattern = Pattern->getCanonicalDecl();
4256
4257 do {
4258 Instance = Instance->getCanonicalDecl();
4259 if (Pattern == Instance) return true;
4260 Instance = Instance->getInstantiatedFromMemberEnum();
4261 } while (Instance);
4262
4263 return false;
4264}
4265
John McCallb96ec562009-12-04 22:46:56 +00004266static bool isInstantiationOf(UsingShadowDecl *Pattern,
4267 UsingShadowDecl *Instance,
4268 ASTContext &C) {
Richard Smith32952e12014-10-14 02:00:47 +00004269 return declaresSameEntity(C.getInstantiatedFromUsingShadowDecl(Instance),
4270 Pattern);
John McCallb96ec562009-12-04 22:46:56 +00004271}
4272
4273static bool isInstantiationOf(UsingDecl *Pattern,
4274 UsingDecl *Instance,
4275 ASTContext &C) {
Richard Smith32952e12014-10-14 02:00:47 +00004276 return declaresSameEntity(C.getInstantiatedFromUsingDecl(Instance), Pattern);
John McCallb96ec562009-12-04 22:46:56 +00004277}
4278
John McCalle61f2ba2009-11-18 02:36:19 +00004279static bool isInstantiationOf(UnresolvedUsingValueDecl *Pattern,
4280 UsingDecl *Instance,
4281 ASTContext &C) {
Richard Smith32952e12014-10-14 02:00:47 +00004282 return declaresSameEntity(C.getInstantiatedFromUsingDecl(Instance), Pattern);
John McCalle61f2ba2009-11-18 02:36:19 +00004283}
4284
4285static bool isInstantiationOf(UnresolvedUsingTypenameDecl *Pattern,
Anders Carlsson4bb87ce2009-08-29 19:37:28 +00004286 UsingDecl *Instance,
4287 ASTContext &C) {
Richard Smith32952e12014-10-14 02:00:47 +00004288 return declaresSameEntity(C.getInstantiatedFromUsingDecl(Instance), Pattern);
Anders Carlsson4bb87ce2009-08-29 19:37:28 +00004289}
4290
John McCall59660882009-08-29 08:11:13 +00004291static bool isInstantiationOfStaticDataMember(VarDecl *Pattern,
4292 VarDecl *Instance) {
4293 assert(Instance->isStaticDataMember());
4294
4295 Pattern = Pattern->getCanonicalDecl();
4296
4297 do {
4298 Instance = Instance->getCanonicalDecl();
4299 if (Pattern == Instance) return true;
4300 Instance = Instance->getInstantiatedFromStaticDataMember();
4301 } while (Instance);
4302
4303 return false;
4304}
4305
John McCallb96ec562009-12-04 22:46:56 +00004306// Other is the prospective instantiation
4307// D is the prospective pattern
Douglas Gregor51783312009-05-27 05:35:12 +00004308static bool isInstantiationOf(ASTContext &Ctx, NamedDecl *D, Decl *Other) {
Anders Carlsson4bb87ce2009-08-29 19:37:28 +00004309 if (D->getKind() != Other->getKind()) {
John McCalle61f2ba2009-11-18 02:36:19 +00004310 if (UnresolvedUsingTypenameDecl *UUD
4311 = dyn_cast<UnresolvedUsingTypenameDecl>(D)) {
4312 if (UsingDecl *UD = dyn_cast<UsingDecl>(Other)) {
4313 return isInstantiationOf(UUD, UD, Ctx);
4314 }
4315 }
4316
4317 if (UnresolvedUsingValueDecl *UUD
4318 = dyn_cast<UnresolvedUsingValueDecl>(D)) {
Anders Carlsson4bb87ce2009-08-29 19:37:28 +00004319 if (UsingDecl *UD = dyn_cast<UsingDecl>(Other)) {
4320 return isInstantiationOf(UUD, UD, Ctx);
4321 }
4322 }
Douglas Gregor51783312009-05-27 05:35:12 +00004323
Anders Carlsson4bb87ce2009-08-29 19:37:28 +00004324 return false;
4325 }
Mike Stump11289f42009-09-09 15:08:12 +00004326
John McCall59660882009-08-29 08:11:13 +00004327 if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(Other))
4328 return isInstantiationOf(cast<CXXRecordDecl>(D), Record);
Mike Stump11289f42009-09-09 15:08:12 +00004329
John McCall59660882009-08-29 08:11:13 +00004330 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Other))
4331 return isInstantiationOf(cast<FunctionDecl>(D), Function);
Douglas Gregor51783312009-05-27 05:35:12 +00004332
John McCall59660882009-08-29 08:11:13 +00004333 if (EnumDecl *Enum = dyn_cast<EnumDecl>(Other))
4334 return isInstantiationOf(cast<EnumDecl>(D), Enum);
Douglas Gregor51783312009-05-27 05:35:12 +00004335
Douglas Gregora6ef8f02009-07-24 20:34:43 +00004336 if (VarDecl *Var = dyn_cast<VarDecl>(Other))
John McCall59660882009-08-29 08:11:13 +00004337 if (Var->isStaticDataMember())
4338 return isInstantiationOfStaticDataMember(cast<VarDecl>(D), Var);
4339
4340 if (ClassTemplateDecl *Temp = dyn_cast<ClassTemplateDecl>(Other))
4341 return isInstantiationOf(cast<ClassTemplateDecl>(D), Temp);
Douglas Gregorf3db0032009-08-28 22:03:51 +00004342
Douglas Gregor14d1bf42009-09-28 06:34:35 +00004343 if (FunctionTemplateDecl *Temp = dyn_cast<FunctionTemplateDecl>(Other))
4344 return isInstantiationOf(cast<FunctionTemplateDecl>(D), Temp);
4345
Douglas Gregor21610382009-10-29 00:04:11 +00004346 if (ClassTemplatePartialSpecializationDecl *PartialSpec
4347 = dyn_cast<ClassTemplatePartialSpecializationDecl>(Other))
4348 return isInstantiationOf(cast<ClassTemplatePartialSpecializationDecl>(D),
4349 PartialSpec);
4350
Anders Carlsson5da84842009-09-01 04:26:58 +00004351 if (FieldDecl *Field = dyn_cast<FieldDecl>(Other)) {
4352 if (!Field->getDeclName()) {
4353 // This is an unnamed field.
Richard Smith32952e12014-10-14 02:00:47 +00004354 return declaresSameEntity(Ctx.getInstantiatedFromUnnamedFieldDecl(Field),
4355 cast<FieldDecl>(D));
Anders Carlsson5da84842009-09-01 04:26:58 +00004356 }
4357 }
Mike Stump11289f42009-09-09 15:08:12 +00004358
John McCallb96ec562009-12-04 22:46:56 +00004359 if (UsingDecl *Using = dyn_cast<UsingDecl>(Other))
4360 return isInstantiationOf(cast<UsingDecl>(D), Using, Ctx);
4361
4362 if (UsingShadowDecl *Shadow = dyn_cast<UsingShadowDecl>(Other))
4363 return isInstantiationOf(cast<UsingShadowDecl>(D), Shadow, Ctx);
4364
Douglas Gregor51783312009-05-27 05:35:12 +00004365 return D->getDeclName() && isa<NamedDecl>(Other) &&
4366 D->getDeclName() == cast<NamedDecl>(Other)->getDeclName();
4367}
4368
4369template<typename ForwardIterator>
Mike Stump11289f42009-09-09 15:08:12 +00004370static NamedDecl *findInstantiationOf(ASTContext &Ctx,
Douglas Gregor51783312009-05-27 05:35:12 +00004371 NamedDecl *D,
4372 ForwardIterator first,
4373 ForwardIterator last) {
4374 for (; first != last; ++first)
4375 if (isInstantiationOf(Ctx, D, *first))
4376 return cast<NamedDecl>(*first);
4377
Craig Topperc3ec1492014-05-26 06:22:03 +00004378 return nullptr;
Douglas Gregor51783312009-05-27 05:35:12 +00004379}
4380
John McCallaa74a0c2009-08-28 07:59:38 +00004381/// \brief Finds the instantiation of the given declaration context
4382/// within the current instantiation.
4383///
4384/// \returns NULL if there was an error
Douglas Gregora04f2ca2010-03-01 15:56:25 +00004385DeclContext *Sema::FindInstantiatedContext(SourceLocation Loc, DeclContext* DC,
Douglas Gregor64621e62009-09-16 18:34:49 +00004386 const MultiLevelTemplateArgumentList &TemplateArgs) {
John McCallaa74a0c2009-08-28 07:59:38 +00004387 if (NamedDecl *D = dyn_cast<NamedDecl>(DC)) {
Douglas Gregora04f2ca2010-03-01 15:56:25 +00004388 Decl* ID = FindInstantiatedDecl(Loc, D, TemplateArgs);
John McCallaa74a0c2009-08-28 07:59:38 +00004389 return cast_or_null<DeclContext>(ID);
4390 } else return DC;
4391}
4392
Douglas Gregorcd3a0972009-05-27 17:54:46 +00004393/// \brief Find the instantiation of the given declaration within the
4394/// current instantiation.
Douglas Gregor51783312009-05-27 05:35:12 +00004395///
4396/// This routine is intended to be used when \p D is a declaration
4397/// referenced from within a template, that needs to mapped into the
4398/// corresponding declaration within an instantiation. For example,
4399/// given:
4400///
4401/// \code
4402/// template<typename T>
4403/// struct X {
4404/// enum Kind {
4405/// KnownValue = sizeof(T)
4406/// };
4407///
4408/// bool getKind() const { return KnownValue; }
4409/// };
4410///
4411/// template struct X<int>;
4412/// \endcode
4413///
Serge Pavloved5fe902013-07-10 04:59:14 +00004414/// In the instantiation of <tt>X<int>::getKind()</tt>, we need to map the
4415/// \p EnumConstantDecl for \p KnownValue (which refers to
4416/// <tt>X<T>::<Kind>::KnownValue</tt>) to its instantiation
4417/// (<tt>X<int>::<Kind>::KnownValue</tt>). \p FindInstantiatedDecl performs
4418/// this mapping from within the instantiation of <tt>X<int></tt>.
Douglas Gregora04f2ca2010-03-01 15:56:25 +00004419NamedDecl *Sema::FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D,
Douglas Gregor64621e62009-09-16 18:34:49 +00004420 const MultiLevelTemplateArgumentList &TemplateArgs) {
Douglas Gregor51783312009-05-27 05:35:12 +00004421 DeclContext *ParentDC = D->getDeclContext();
Faisal Vali2cba1332013-10-23 06:44:28 +00004422 // FIXME: Parmeters of pointer to functions (y below) that are themselves
4423 // parameters (p below) can have their ParentDC set to the translation-unit
4424 // - thus we can not consistently check if the ParentDC of such a parameter
4425 // is Dependent or/and a FunctionOrMethod.
4426 // For e.g. this code, during Template argument deduction tries to
4427 // find an instantiated decl for (T y) when the ParentDC for y is
4428 // the translation unit.
4429 // e.g. template <class T> void Foo(auto (*p)(T y) -> decltype(y())) {}
Aaron Ballman36a53502014-01-16 13:03:14 +00004430 // float baz(float(*)()) { return 0.0; }
Faisal Vali2cba1332013-10-23 06:44:28 +00004431 // Foo(baz);
4432 // The better fix here is perhaps to ensure that a ParmVarDecl, by the time
4433 // it gets here, always has a FunctionOrMethod as its ParentDC??
4434 // For now:
4435 // - as long as we have a ParmVarDecl whose parent is non-dependent and
4436 // whose type is not instantiation dependent, do nothing to the decl
4437 // - otherwise find its instantiated decl.
4438 if (isa<ParmVarDecl>(D) && !ParentDC->isDependentContext() &&
4439 !cast<ParmVarDecl>(D)->getType()->isInstantiationDependentType())
4440 return D;
Rafael Espindola09b00e32013-10-23 04:12:23 +00004441 if (isa<ParmVarDecl>(D) || isa<NonTypeTemplateParmDecl>(D) ||
Douglas Gregorb93971082010-02-05 19:54:12 +00004442 isa<TemplateTypeParmDecl>(D) || isa<TemplateTemplateParmDecl>(D) ||
Douglas Gregora86bc002012-02-16 21:36:18 +00004443 (ParentDC->isFunctionOrMethod() && ParentDC->isDependentContext()) ||
4444 (isa<CXXRecordDecl>(D) && cast<CXXRecordDecl>(D)->isLambda())) {
Douglas Gregorf98d9b62009-05-27 17:07:49 +00004445 // D is a local of some kind. Look into the map of local
4446 // declarations to their instantiations.
Alexey Samsonov2c0aac22014-09-03 18:45:45 +00004447 if (CurrentInstantiationScope) {
4448 if (auto Found = CurrentInstantiationScope->findInstantiationOf(D)) {
4449 if (Decl *FD = Found->dyn_cast<Decl *>())
4450 return cast<NamedDecl>(FD);
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004451
Alexey Samsonov2c0aac22014-09-03 18:45:45 +00004452 int PackIdx = ArgumentPackSubstitutionIndex;
4453 assert(PackIdx != -1 &&
4454 "found declaration pack but not pack expanding");
4455 typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack;
4456 return cast<NamedDecl>((*Found->get<DeclArgumentPack *>())[PackIdx]);
4457 }
Chris Lattnercab02a62011-02-17 20:34:02 +00004458 }
4459
Serge Pavlov7cd8f602013-07-15 06:14:07 +00004460 // If we're performing a partial substitution during template argument
4461 // deduction, we may not have values for template parameters yet. They
4462 // just map to themselves.
4463 if (isa<NonTypeTemplateParmDecl>(D) || isa<TemplateTypeParmDecl>(D) ||
4464 isa<TemplateTemplateParmDecl>(D))
4465 return D;
4466
Serge Pavlov074a5182013-08-10 12:00:21 +00004467 if (D->isInvalidDecl())
Craig Topperc3ec1492014-05-26 06:22:03 +00004468 return nullptr;
Serge Pavlov074a5182013-08-10 12:00:21 +00004469
Serge Pavlove7ad8312015-05-15 10:10:28 +00004470 // Normally this function only searches for already instantiated declaration
4471 // however we have to make an exclusion for local types used before
4472 // definition as in the code:
4473 //
4474 // template<typename T> void f1() {
4475 // void g1(struct x1);
4476 // struct x1 {};
4477 // }
4478 //
4479 // In this case instantiation of the type of 'g1' requires definition of
4480 // 'x1', which is defined later. Error recovery may produce an enum used
4481 // before definition. In these cases we need to instantiate relevant
4482 // declarations here.
4483 bool NeedInstantiate = false;
4484 if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D))
4485 NeedInstantiate = RD->isLocalClass();
4486 else
4487 NeedInstantiate = isa<EnumDecl>(D);
4488 if (NeedInstantiate) {
Serge Pavlov4c511742015-05-04 16:44:39 +00004489 Decl *Inst = SubstDecl(D, CurContext, TemplateArgs);
4490 CurrentInstantiationScope->InstantiatedLocal(D, Inst);
4491 return cast<TypeDecl>(Inst);
4492 }
4493
Chris Lattnercab02a62011-02-17 20:34:02 +00004494 // If we didn't find the decl, then we must have a label decl that hasn't
4495 // been found yet. Lazily instantiate it and return it now.
4496 assert(isa<LabelDecl>(D));
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004497
Chris Lattnercab02a62011-02-17 20:34:02 +00004498 Decl *Inst = SubstDecl(D, CurContext, TemplateArgs);
4499 assert(Inst && "Failed to instantiate label??");
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004500
Chris Lattnercab02a62011-02-17 20:34:02 +00004501 CurrentInstantiationScope->InstantiatedLocal(D, Inst);
4502 return cast<LabelDecl>(Inst);
Douglas Gregorf98d9b62009-05-27 17:07:49 +00004503 }
Douglas Gregor51783312009-05-27 05:35:12 +00004504
Larisse Voufo39a1e502013-08-06 01:03:05 +00004505 // For variable template specializations, update those that are still
4506 // type-dependent.
4507 if (VarTemplateSpecializationDecl *VarSpec =
4508 dyn_cast<VarTemplateSpecializationDecl>(D)) {
4509 bool InstantiationDependent = false;
4510 const TemplateArgumentListInfo &VarTemplateArgs =
4511 VarSpec->getTemplateArgsInfo();
4512 if (TemplateSpecializationType::anyDependentTemplateArguments(
4513 VarTemplateArgs, InstantiationDependent))
4514 D = cast<NamedDecl>(
4515 SubstDecl(D, VarSpec->getDeclContext(), TemplateArgs));
4516 return D;
4517 }
4518
Douglas Gregor64621e62009-09-16 18:34:49 +00004519 if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(D)) {
4520 if (!Record->isDependentContext())
4521 return D;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004522
Douglas Gregor4109afa2011-11-07 17:43:18 +00004523 // Determine whether this record is the "templated" declaration describing
4524 // a class template or class template partial specialization.
Douglas Gregor64621e62009-09-16 18:34:49 +00004525 ClassTemplateDecl *ClassTemplate = Record->getDescribedClassTemplate();
Douglas Gregor4109afa2011-11-07 17:43:18 +00004526 if (ClassTemplate)
4527 ClassTemplate = ClassTemplate->getCanonicalDecl();
4528 else if (ClassTemplatePartialSpecializationDecl *PartialSpec
4529 = dyn_cast<ClassTemplatePartialSpecializationDecl>(Record))
4530 ClassTemplate = PartialSpec->getSpecializedTemplate()->getCanonicalDecl();
Larisse Voufo39a1e502013-08-06 01:03:05 +00004531
Douglas Gregor4109afa2011-11-07 17:43:18 +00004532 // Walk the current context to find either the record or an instantiation of
4533 // it.
4534 DeclContext *DC = CurContext;
4535 while (!DC->isFileContext()) {
4536 // If we're performing substitution while we're inside the template
4537 // definition, we'll find our own context. We're done.
4538 if (DC->Equals(Record))
4539 return Record;
Larisse Voufo39a1e502013-08-06 01:03:05 +00004540
Douglas Gregor4109afa2011-11-07 17:43:18 +00004541 if (CXXRecordDecl *InstRecord = dyn_cast<CXXRecordDecl>(DC)) {
4542 // Check whether we're in the process of instantiating a class template
4543 // specialization of the template we're mapping.
4544 if (ClassTemplateSpecializationDecl *InstSpec
4545 = dyn_cast<ClassTemplateSpecializationDecl>(InstRecord)){
4546 ClassTemplateDecl *SpecTemplate = InstSpec->getSpecializedTemplate();
4547 if (ClassTemplate && isInstantiationOf(ClassTemplate, SpecTemplate))
4548 return InstRecord;
4549 }
Larisse Voufo39a1e502013-08-06 01:03:05 +00004550
Douglas Gregor4109afa2011-11-07 17:43:18 +00004551 // Check whether we're in the process of instantiating a member class.
4552 if (isInstantiationOf(Record, InstRecord))
4553 return InstRecord;
Douglas Gregor64621e62009-09-16 18:34:49 +00004554 }
Larisse Voufo39a1e502013-08-06 01:03:05 +00004555
Douglas Gregor4109afa2011-11-07 17:43:18 +00004556 // Move to the outer template scope.
4557 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(DC)) {
4558 if (FD->getFriendObjectKind() && FD->getDeclContext()->isFileContext()){
4559 DC = FD->getLexicalDeclContext();
4560 continue;
4561 }
John McCall59660882009-08-29 08:11:13 +00004562 }
Larisse Voufo39a1e502013-08-06 01:03:05 +00004563
Douglas Gregor4109afa2011-11-07 17:43:18 +00004564 DC = DC->getParent();
John McCall59660882009-08-29 08:11:13 +00004565 }
Douglas Gregord225fa02010-02-05 22:40:03 +00004566
Douglas Gregor64621e62009-09-16 18:34:49 +00004567 // Fall through to deal with other dependent record types (e.g.,
4568 // anonymous unions in class templates).
4569 }
John McCall59660882009-08-29 08:11:13 +00004570
Douglas Gregor64621e62009-09-16 18:34:49 +00004571 if (!ParentDC->isDependentContext())
4572 return D;
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004573
Douglas Gregora04f2ca2010-03-01 15:56:25 +00004574 ParentDC = FindInstantiatedContext(Loc, ParentDC, TemplateArgs);
Mike Stump11289f42009-09-09 15:08:12 +00004575 if (!ParentDC)
Craig Topperc3ec1492014-05-26 06:22:03 +00004576 return nullptr;
Mike Stump11289f42009-09-09 15:08:12 +00004577
Douglas Gregor51783312009-05-27 05:35:12 +00004578 if (ParentDC != D->getDeclContext()) {
4579 // We performed some kind of instantiation in the parent context,
4580 // so now we need to look into the instantiated parent context to
4581 // find the instantiation of the declaration D.
Douglas Gregora04f2ca2010-03-01 15:56:25 +00004582
John McCalle78aac42010-03-10 03:28:59 +00004583 // If our context used to be dependent, we may need to instantiate
4584 // it before performing lookup into that context.
Douglas Gregor528ad932011-03-06 20:12:45 +00004585 bool IsBeingInstantiated = false;
John McCalle78aac42010-03-10 03:28:59 +00004586 if (CXXRecordDecl *Spec = dyn_cast<CXXRecordDecl>(ParentDC)) {
Douglas Gregora04f2ca2010-03-01 15:56:25 +00004587 if (!Spec->isDependentContext()) {
4588 QualType T = Context.getTypeDeclType(Spec);
John McCalle78aac42010-03-10 03:28:59 +00004589 const RecordType *Tag = T->getAs<RecordType>();
4590 assert(Tag && "type of non-dependent record is not a RecordType");
Douglas Gregor528ad932011-03-06 20:12:45 +00004591 if (Tag->isBeingDefined())
4592 IsBeingInstantiated = true;
John McCalle78aac42010-03-10 03:28:59 +00004593 if (!Tag->isBeingDefined() &&
4594 RequireCompleteType(Loc, T, diag::err_incomplete_type))
Craig Topperc3ec1492014-05-26 06:22:03 +00004595 return nullptr;
Douglas Gregor25edf432010-11-05 23:22:45 +00004596
4597 ParentDC = Tag->getDecl();
Douglas Gregora04f2ca2010-03-01 15:56:25 +00004598 }
4599 }
4600
Craig Topperc3ec1492014-05-26 06:22:03 +00004601 NamedDecl *Result = nullptr;
Douglas Gregor51783312009-05-27 05:35:12 +00004602 if (D->getDeclName()) {
Argyrios Kyrtzidiscfbfe782009-06-30 02:36:12 +00004603 DeclContext::lookup_result Found = ParentDC->lookup(D->getDeclName());
David Blaikieff7d47a2012-12-19 00:45:41 +00004604 Result = findInstantiationOf(Context, D, Found.begin(), Found.end());
Douglas Gregor51783312009-05-27 05:35:12 +00004605 } else {
4606 // Since we don't have a name for the entity we're looking for,
4607 // our only option is to walk through all of the declarations to
4608 // find that name. This will occur in a few cases:
4609 //
4610 // - anonymous struct/union within a template
4611 // - unnamed class/struct/union/enum within a template
4612 //
4613 // FIXME: Find a better way to find these instantiations!
Mike Stump11289f42009-09-09 15:08:12 +00004614 Result = findInstantiationOf(Context, D,
Argyrios Kyrtzidiscfbfe782009-06-30 02:36:12 +00004615 ParentDC->decls_begin(),
4616 ParentDC->decls_end());
Douglas Gregor51783312009-05-27 05:35:12 +00004617 }
Mike Stump11289f42009-09-09 15:08:12 +00004618
Douglas Gregor528ad932011-03-06 20:12:45 +00004619 if (!Result) {
4620 if (isa<UsingShadowDecl>(D)) {
4621 // UsingShadowDecls can instantiate to nothing because of using hiding.
4622 } else if (Diags.hasErrorOccurred()) {
4623 // We've already complained about something, so most likely this
4624 // declaration failed to instantiate. There's no point in complaining
4625 // further, since this is normal in invalid code.
4626 } else if (IsBeingInstantiated) {
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004627 // The class in which this member exists is currently being
Douglas Gregor528ad932011-03-06 20:12:45 +00004628 // instantiated, and we haven't gotten around to instantiating this
4629 // member yet. This can happen when the code uses forward declarations
4630 // of member classes, and introduces ordering dependencies via
4631 // template instantiation.
4632 Diag(Loc, diag::err_member_not_yet_instantiated)
4633 << D->getDeclName()
4634 << Context.getTypeDeclType(cast<CXXRecordDecl>(ParentDC));
4635 Diag(D->getLocation(), diag::note_non_instantiated_member_here);
Richard Smith169f2192012-03-26 20:28:16 +00004636 } else if (EnumConstantDecl *ED = dyn_cast<EnumConstantDecl>(D)) {
4637 // This enumeration constant was found when the template was defined,
4638 // but can't be found in the instantiation. This can happen if an
4639 // unscoped enumeration member is explicitly specialized.
4640 EnumDecl *Enum = cast<EnumDecl>(ED->getLexicalDeclContext());
4641 EnumDecl *Spec = cast<EnumDecl>(FindInstantiatedDecl(Loc, Enum,
4642 TemplateArgs));
4643 assert(Spec->getTemplateSpecializationKind() ==
4644 TSK_ExplicitSpecialization);
4645 Diag(Loc, diag::err_enumerator_does_not_exist)
4646 << D->getDeclName()
4647 << Context.getTypeDeclType(cast<TypeDecl>(Spec->getDeclContext()));
4648 Diag(Spec->getLocation(), diag::note_enum_specialized_here)
4649 << Context.getTypeDeclType(Spec);
Douglas Gregor528ad932011-03-06 20:12:45 +00004650 } else {
4651 // We should have found something, but didn't.
4652 llvm_unreachable("Unable to find instantiation of declaration!");
4653 }
4654 }
NAKAMURA Takumi82a35112011-10-08 11:31:46 +00004655
Douglas Gregor51783312009-05-27 05:35:12 +00004656 D = Result;
4657 }
4658
Douglas Gregor51783312009-05-27 05:35:12 +00004659 return D;
4660}
Douglas Gregor77b50e12009-06-22 23:06:13 +00004661
Mike Stump11289f42009-09-09 15:08:12 +00004662/// \brief Performs template instantiation for all implicit template
Douglas Gregor77b50e12009-06-22 23:06:13 +00004663/// instantiations we have seen until this point.
Nick Lewycky67c4d0f2011-05-31 07:58:42 +00004664void Sema::PerformPendingInstantiations(bool LocalOnly) {
Douglas Gregor7f792cf2010-01-16 22:29:39 +00004665 while (!PendingLocalImplicitInstantiations.empty() ||
Chandler Carruth54080172010-08-25 08:44:16 +00004666 (!LocalOnly && !PendingInstantiations.empty())) {
Douglas Gregor7f792cf2010-01-16 22:29:39 +00004667 PendingImplicitInstantiation Inst;
4668
4669 if (PendingLocalImplicitInstantiations.empty()) {
Chandler Carruth54080172010-08-25 08:44:16 +00004670 Inst = PendingInstantiations.front();
4671 PendingInstantiations.pop_front();
Douglas Gregor7f792cf2010-01-16 22:29:39 +00004672 } else {
4673 Inst = PendingLocalImplicitInstantiations.front();
4674 PendingLocalImplicitInstantiations.pop_front();
4675 }
Mike Stump11289f42009-09-09 15:08:12 +00004676
Douglas Gregora6ef8f02009-07-24 20:34:43 +00004677 // Instantiate function definitions
4678 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Inst.first)) {
John McCallfaf5fb42010-08-26 23:41:50 +00004679 PrettyDeclStackTraceEntry CrashInfo(*this, Function, SourceLocation(),
4680 "instantiating function definition");
Chandler Carruthcfe41db2010-08-25 08:27:02 +00004681 bool DefinitionRequired = Function->getTemplateSpecializationKind() ==
4682 TSK_ExplicitInstantiationDefinition;
4683 InstantiateFunctionDefinition(/*FIXME:*/Inst.second, Function, true,
4684 DefinitionRequired);
Douglas Gregora6ef8f02009-07-24 20:34:43 +00004685 continue;
4686 }
Mike Stump11289f42009-09-09 15:08:12 +00004687
Larisse Voufo39a1e502013-08-06 01:03:05 +00004688 // Instantiate variable definitions
Douglas Gregora6ef8f02009-07-24 20:34:43 +00004689 VarDecl *Var = cast<VarDecl>(Inst.first);
Larisse Voufo39a1e502013-08-06 01:03:05 +00004690
4691 assert((Var->isStaticDataMember() ||
4692 isa<VarTemplateSpecializationDecl>(Var)) &&
4693 "Not a static data member, nor a variable template"
4694 " specialization?");
Anders Carlsson62215c42009-09-01 05:12:24 +00004695
Chandler Carruth6b4756a2010-02-13 10:17:50 +00004696 // Don't try to instantiate declarations if the most recent redeclaration
4697 // is invalid.
Douglas Gregorec9fd132012-01-14 16:38:05 +00004698 if (Var->getMostRecentDecl()->isInvalidDecl())
Chandler Carruth6b4756a2010-02-13 10:17:50 +00004699 continue;
4700
4701 // Check if the most recent declaration has changed the specialization kind
4702 // and removed the need for implicit instantiation.
Douglas Gregorec9fd132012-01-14 16:38:05 +00004703 switch (Var->getMostRecentDecl()->getTemplateSpecializationKind()) {
Chandler Carruth6b4756a2010-02-13 10:17:50 +00004704 case TSK_Undeclared:
David Blaikie83d382b2011-09-23 05:06:16 +00004705 llvm_unreachable("Cannot instantitiate an undeclared specialization.");
Chandler Carruth6b4756a2010-02-13 10:17:50 +00004706 case TSK_ExplicitInstantiationDeclaration:
Chandler Carruth6b4756a2010-02-13 10:17:50 +00004707 case TSK_ExplicitSpecialization:
Chandler Carruthcfe41db2010-08-25 08:27:02 +00004708 continue; // No longer need to instantiate this type.
4709 case TSK_ExplicitInstantiationDefinition:
4710 // We only need an instantiation if the pending instantiation *is* the
4711 // explicit instantiation.
Douglas Gregorec9fd132012-01-14 16:38:05 +00004712 if (Var != Var->getMostRecentDecl()) continue;
Chandler Carruth6b4756a2010-02-13 10:17:50 +00004713 case TSK_ImplicitInstantiation:
4714 break;
4715 }
4716
Larisse Voufo39a1e502013-08-06 01:03:05 +00004717 PrettyDeclStackTraceEntry CrashInfo(*this, Var, SourceLocation(),
4718 "instantiating variable definition");
Chandler Carruthcfe41db2010-08-25 08:27:02 +00004719 bool DefinitionRequired = Var->getTemplateSpecializationKind() ==
4720 TSK_ExplicitInstantiationDefinition;
Larisse Voufo39a1e502013-08-06 01:03:05 +00004721
4722 // Instantiate static data member definitions or variable template
4723 // specializations.
4724 InstantiateVariableDefinition(/*FIXME:*/ Inst.second, Var, true,
4725 DefinitionRequired);
Douglas Gregor77b50e12009-06-22 23:06:13 +00004726 }
4727}
John McCallc62bb642010-03-24 05:22:00 +00004728
4729void Sema::PerformDependentDiagnostics(const DeclContext *Pattern,
4730 const MultiLevelTemplateArgumentList &TemplateArgs) {
Aaron Ballmanb105e492014-03-07 14:09:15 +00004731 for (auto DD : Pattern->ddiags()) {
John McCallc62bb642010-03-24 05:22:00 +00004732 switch (DD->getKind()) {
4733 case DependentDiagnostic::Access:
4734 HandleDependentAccessCheck(*DD, TemplateArgs);
4735 break;
4736 }
4737 }
4738}