1 //===--- 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 //===----------------------------------------------------------------------===/
12 #include "clang/Sema/SemaInternal.h"
13 #include "clang/AST/ASTConsumer.h"
14 #include "clang/AST/ASTContext.h"
15 #include "clang/AST/ASTMutationListener.h"
16 #include "clang/AST/DeclTemplate.h"
17 #include "clang/AST/DeclVisitor.h"
18 #include "clang/AST/DependentDiagnostic.h"
19 #include "clang/AST/Expr.h"
20 #include "clang/AST/ExprCXX.h"
21 #include "clang/AST/TypeLoc.h"
22 #include "clang/Sema/Lookup.h"
23 #include "clang/Sema/PrettyDeclStackTrace.h"
24 #include "clang/Sema/Template.h"
25
26 using namespace clang;
27
isDeclWithinFunction(const Decl * D)28 static 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
39 template<typename DeclT>
SubstQualifier(Sema & SemaRef,const DeclT * OldDecl,DeclT * NewDecl,const MultiLevelTemplateArgumentList & TemplateArgs)40 static bool SubstQualifier(Sema &SemaRef, const DeclT *OldDecl, DeclT *NewDecl,
41 const MultiLevelTemplateArgumentList &TemplateArgs) {
42 if (!OldDecl->getQualifierLoc())
43 return false;
44
45 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
54 NestedNameSpecifierLoc NewQualifierLoc
55 = SemaRef.SubstNestedNameSpecifierLoc(OldDecl->getQualifierLoc(),
56 TemplateArgs);
57
58 if (!NewQualifierLoc)
59 return true;
60
61 NewDecl->setQualifierInfo(NewQualifierLoc);
62 return false;
63 }
64
SubstQualifier(const DeclaratorDecl * OldDecl,DeclaratorDecl * NewDecl)65 bool TemplateDeclInstantiator::SubstQualifier(const DeclaratorDecl *OldDecl,
66 DeclaratorDecl *NewDecl) {
67 return ::SubstQualifier(SemaRef, OldDecl, NewDecl, TemplateArgs);
68 }
69
SubstQualifier(const TagDecl * OldDecl,TagDecl * NewDecl)70 bool TemplateDeclInstantiator::SubstQualifier(const TagDecl *OldDecl,
71 TagDecl *NewDecl) {
72 return ::SubstQualifier(SemaRef, OldDecl, NewDecl, TemplateArgs);
73 }
74
75 // Include attribute instantiation code.
76 #include "clang/Sema/AttrTemplateInstantiate.inc"
77
instantiateDependentAlignedAttr(Sema & S,const MultiLevelTemplateArgumentList & TemplateArgs,const AlignedAttr * Aligned,Decl * New,bool IsPackExpansion)78 static 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())
86 S.AddAlignedAttr(Aligned->getLocation(), New, Result.getAs<Expr>(),
87 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
instantiateDependentAlignedAttr(Sema & S,const MultiLevelTemplateArgumentList & TemplateArgs,const AlignedAttr * Aligned,Decl * New)98 static 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
instantiateDependentAssumeAlignedAttr(Sema & S,const MultiLevelTemplateArgumentList & TemplateArgs,const AssumeAlignedAttr * Aligned,Decl * New)136 static 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
instantiateDependentAlignValueAttr(Sema & S,const MultiLevelTemplateArgumentList & TemplateArgs,const AlignValueAttr * Aligned,Decl * New)159 static 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
instantiateDependentEnableIfAttr(Sema & S,const MultiLevelTemplateArgumentList & TemplateArgs,const EnableIfAttr * A,const Decl * Tmpl,Decl * New)170 static void instantiateDependentEnableIfAttr(
171 Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs,
172 const EnableIfAttr *A, const Decl *Tmpl, Decl *New) {
173 Expr *Cond = nullptr;
174 {
175 EnterExpressionEvaluationContext Unevaluated(S, Sema::Unevaluated);
176 ExprResult Result = S.SubstExpr(A->getCond(), TemplateArgs);
177 if (Result.isInvalid())
178 return;
179 Cond = Result.getAs<Expr>();
180 }
181 if (A->getCond()->isTypeDependent() && !Cond->isTypeDependent()) {
182 ExprResult Converted = S.PerformContextuallyConvertToBool(Cond);
183 if (Converted.isInvalid())
184 return;
185 Cond = Converted.get();
186 }
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
198 EnableIfAttr *EIA = new (S.getASTContext())
199 EnableIfAttr(A->getLocation(), S.getASTContext(), Cond,
200 A->getMessage(),
201 A->getSpellingListIndex());
202 New->addAttr(EIA);
203 }
204
205 // Constructs and adds to New a new instance of CUDALaunchBoundsAttr using
206 // template A as the base and arguments from TemplateArgs.
instantiateDependentCUDALaunchBoundsAttr(Sema & S,const MultiLevelTemplateArgumentList & TemplateArgs,const CUDALaunchBoundsAttr & Attr,Decl * New)207 static 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
230 static void
instantiateDependentModeAttr(Sema & S,const MultiLevelTemplateArgumentList & TemplateArgs,const ModeAttr & Attr,Decl * New)231 instantiateDependentModeAttr(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
238 /// Instantiation of 'declare simd' attribute and its arguments.
instantiateOMPDeclareSimdDeclAttr(Sema & S,const MultiLevelTemplateArgumentList & TemplateArgs,const OMPDeclareSimdDeclAttr & Attr,Decl * New)239 static void instantiateOMPDeclareSimdDeclAttr(
240 Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs,
241 const OMPDeclareSimdDeclAttr &Attr, Decl *New) {
242 // Allow 'this' in clauses with varlists.
243 if (auto *FTD = dyn_cast<FunctionTemplateDecl>(New))
244 New = FTD->getTemplatedDecl();
245 auto *FD = cast<FunctionDecl>(New);
246 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(FD->getDeclContext());
247 SmallVector<Expr *, 4> Uniforms, Aligneds, Alignments, Linears, Steps;
248 SmallVector<unsigned, 4> LinModifiers;
249
250 auto &&Subst = [&](Expr *E) -> ExprResult {
251 if (auto *DRE = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts()))
252 if (auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
253 Sema::ContextRAII SavedContext(S, FD);
254 LocalInstantiationScope Local(S);
255 if (FD->getNumParams() > PVD->getFunctionScopeIndex())
256 Local.InstantiatedLocal(
257 PVD, FD->getParamDecl(PVD->getFunctionScopeIndex()));
258 return S.SubstExpr(E, TemplateArgs);
259 }
260 Sema::CXXThisScopeRAII ThisScope(S, ThisContext, /*TypeQuals=*/0,
261 FD->isCXXInstanceMember());
262 return S.SubstExpr(E, TemplateArgs);
263 };
264
265 ExprResult Simdlen;
266 if (auto *E = Attr.getSimdlen())
267 Simdlen = Subst(E);
268
269 if (Attr.uniforms_size() > 0) {
270 for(auto *E : Attr.uniforms()) {
271 ExprResult Inst = Subst(E);
272 if (Inst.isInvalid())
273 continue;
274 Uniforms.push_back(Inst.get());
275 }
276 }
277
278 auto AI = Attr.alignments_begin();
279 for (auto *E : Attr.aligneds()) {
280 ExprResult Inst = Subst(E);
281 if (Inst.isInvalid())
282 continue;
283 Aligneds.push_back(Inst.get());
284 Inst = ExprEmpty();
285 if (*AI)
286 Inst = S.SubstExpr(*AI, TemplateArgs);
287 Alignments.push_back(Inst.get());
288 ++AI;
289 }
290
291 auto SI = Attr.steps_begin();
292 for (auto *E : Attr.linears()) {
293 ExprResult Inst = Subst(E);
294 if (Inst.isInvalid())
295 continue;
296 Linears.push_back(Inst.get());
297 Inst = ExprEmpty();
298 if (*SI)
299 Inst = S.SubstExpr(*SI, TemplateArgs);
300 Steps.push_back(Inst.get());
301 ++SI;
302 }
303 LinModifiers.append(Attr.modifiers_begin(), Attr.modifiers_end());
304 (void)S.ActOnOpenMPDeclareSimdDirective(
305 S.ConvertDeclToDeclGroup(New), Attr.getBranchState(), Simdlen.get(),
306 Uniforms, Aligneds, Alignments, Linears, LinModifiers, Steps,
307 Attr.getRange());
308 }
309
InstantiateAttrs(const MultiLevelTemplateArgumentList & TemplateArgs,const Decl * Tmpl,Decl * New,LateInstantiatedAttrVec * LateAttrs,LocalInstantiationScope * OuterMostScope)310 void Sema::InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs,
311 const Decl *Tmpl, Decl *New,
312 LateInstantiatedAttrVec *LateAttrs,
313 LocalInstantiationScope *OuterMostScope) {
314 for (const auto *TmplAttr : Tmpl->attrs()) {
315 // FIXME: This should be generalized to more than just the AlignedAttr.
316 const AlignedAttr *Aligned = dyn_cast<AlignedAttr>(TmplAttr);
317 if (Aligned && Aligned->isAlignmentDependent()) {
318 instantiateDependentAlignedAttr(*this, TemplateArgs, Aligned, New);
319 continue;
320 }
321
322 const AssumeAlignedAttr *AssumeAligned = dyn_cast<AssumeAlignedAttr>(TmplAttr);
323 if (AssumeAligned) {
324 instantiateDependentAssumeAlignedAttr(*this, TemplateArgs, AssumeAligned, New);
325 continue;
326 }
327
328 const AlignValueAttr *AlignValue = dyn_cast<AlignValueAttr>(TmplAttr);
329 if (AlignValue) {
330 instantiateDependentAlignValueAttr(*this, TemplateArgs, AlignValue, New);
331 continue;
332 }
333
334 const EnableIfAttr *EnableIf = dyn_cast<EnableIfAttr>(TmplAttr);
335 if (EnableIf && EnableIf->getCond()->isValueDependent()) {
336 instantiateDependentEnableIfAttr(*this, TemplateArgs, EnableIf, Tmpl,
337 New);
338 continue;
339 }
340
341 if (const CUDALaunchBoundsAttr *CUDALaunchBounds =
342 dyn_cast<CUDALaunchBoundsAttr>(TmplAttr)) {
343 instantiateDependentCUDALaunchBoundsAttr(*this, TemplateArgs,
344 *CUDALaunchBounds, New);
345 continue;
346 }
347
348 if (const ModeAttr *Mode = dyn_cast<ModeAttr>(TmplAttr)) {
349 instantiateDependentModeAttr(*this, TemplateArgs, *Mode, New);
350 continue;
351 }
352
353 if (const auto *OMPAttr = dyn_cast<OMPDeclareSimdDeclAttr>(TmplAttr)) {
354 instantiateOMPDeclareSimdDeclAttr(*this, TemplateArgs, *OMPAttr, New);
355 continue;
356 }
357
358 // Existing DLL attribute on the instantiation takes precedence.
359 if (TmplAttr->getKind() == attr::DLLExport ||
360 TmplAttr->getKind() == attr::DLLImport) {
361 if (New->hasAttr<DLLExportAttr>() || New->hasAttr<DLLImportAttr>()) {
362 continue;
363 }
364 }
365
366 if (auto ABIAttr = dyn_cast<ParameterABIAttr>(TmplAttr)) {
367 AddParameterABIAttr(ABIAttr->getRange(), New, ABIAttr->getABI(),
368 ABIAttr->getSpellingListIndex());
369 continue;
370 }
371
372 if (isa<NSConsumedAttr>(TmplAttr) || isa<CFConsumedAttr>(TmplAttr)) {
373 AddNSConsumedAttr(TmplAttr->getRange(), New,
374 TmplAttr->getSpellingListIndex(),
375 isa<NSConsumedAttr>(TmplAttr),
376 /*template instantiation*/ true);
377 continue;
378 }
379
380 assert(!TmplAttr->isPackExpansion());
381 if (TmplAttr->isLateParsed() && LateAttrs) {
382 // Late parsed attributes must be instantiated and attached after the
383 // enclosing class has been instantiated. See Sema::InstantiateClass.
384 LocalInstantiationScope *Saved = nullptr;
385 if (CurrentInstantiationScope)
386 Saved = CurrentInstantiationScope->cloneScopes(OuterMostScope);
387 LateAttrs->push_back(LateInstantiatedAttribute(TmplAttr, Saved, New));
388 } else {
389 // Allow 'this' within late-parsed attributes.
390 NamedDecl *ND = dyn_cast<NamedDecl>(New);
391 CXXRecordDecl *ThisContext =
392 dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext());
393 CXXThisScopeRAII ThisScope(*this, ThisContext, /*TypeQuals*/0,
394 ND && ND->isCXXInstanceMember());
395
396 Attr *NewAttr = sema::instantiateTemplateAttribute(TmplAttr, Context,
397 *this, TemplateArgs);
398 if (NewAttr)
399 New->addAttr(NewAttr);
400 }
401 }
402 }
403
404 /// Get the previous declaration of a declaration for the purposes of template
405 /// instantiation. If this finds a previous declaration, then the previous
406 /// declaration of the instantiation of D should be an instantiation of the
407 /// result of this function.
408 template<typename DeclT>
getPreviousDeclForInstantiation(DeclT * D)409 static DeclT *getPreviousDeclForInstantiation(DeclT *D) {
410 DeclT *Result = D->getPreviousDecl();
411
412 // If the declaration is within a class, and the previous declaration was
413 // merged from a different definition of that class, then we don't have a
414 // previous declaration for the purpose of template instantiation.
415 if (Result && isa<CXXRecordDecl>(D->getDeclContext()) &&
416 D->getLexicalDeclContext() != Result->getLexicalDeclContext())
417 return nullptr;
418
419 return Result;
420 }
421
422 Decl *
VisitTranslationUnitDecl(TranslationUnitDecl * D)423 TemplateDeclInstantiator::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
424 llvm_unreachable("Translation units cannot be instantiated");
425 }
426
427 Decl *
VisitPragmaCommentDecl(PragmaCommentDecl * D)428 TemplateDeclInstantiator::VisitPragmaCommentDecl(PragmaCommentDecl *D) {
429 llvm_unreachable("pragma comment cannot be instantiated");
430 }
431
VisitPragmaDetectMismatchDecl(PragmaDetectMismatchDecl * D)432 Decl *TemplateDeclInstantiator::VisitPragmaDetectMismatchDecl(
433 PragmaDetectMismatchDecl *D) {
434 llvm_unreachable("pragma comment cannot be instantiated");
435 }
436
437 Decl *
VisitExternCContextDecl(ExternCContextDecl * D)438 TemplateDeclInstantiator::VisitExternCContextDecl(ExternCContextDecl *D) {
439 llvm_unreachable("extern \"C\" context cannot be instantiated");
440 }
441
442 Decl *
VisitLabelDecl(LabelDecl * D)443 TemplateDeclInstantiator::VisitLabelDecl(LabelDecl *D) {
444 LabelDecl *Inst = LabelDecl::Create(SemaRef.Context, Owner, D->getLocation(),
445 D->getIdentifier());
446 Owner->addDecl(Inst);
447 return Inst;
448 }
449
450 Decl *
VisitNamespaceDecl(NamespaceDecl * D)451 TemplateDeclInstantiator::VisitNamespaceDecl(NamespaceDecl *D) {
452 llvm_unreachable("Namespaces cannot be instantiated");
453 }
454
455 Decl *
VisitNamespaceAliasDecl(NamespaceAliasDecl * D)456 TemplateDeclInstantiator::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
457 NamespaceAliasDecl *Inst
458 = NamespaceAliasDecl::Create(SemaRef.Context, Owner,
459 D->getNamespaceLoc(),
460 D->getAliasLoc(),
461 D->getIdentifier(),
462 D->getQualifierLoc(),
463 D->getTargetNameLoc(),
464 D->getNamespace());
465 Owner->addDecl(Inst);
466 return Inst;
467 }
468
InstantiateTypedefNameDecl(TypedefNameDecl * D,bool IsTypeAlias)469 Decl *TemplateDeclInstantiator::InstantiateTypedefNameDecl(TypedefNameDecl *D,
470 bool IsTypeAlias) {
471 bool Invalid = false;
472 TypeSourceInfo *DI = D->getTypeSourceInfo();
473 if (DI->getType()->isInstantiationDependentType() ||
474 DI->getType()->isVariablyModifiedType()) {
475 DI = SemaRef.SubstType(DI, TemplateArgs,
476 D->getLocation(), D->getDeclName());
477 if (!DI) {
478 Invalid = true;
479 DI = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.Context.IntTy);
480 }
481 } else {
482 SemaRef.MarkDeclarationsReferencedInType(D->getLocation(), DI->getType());
483 }
484
485 // HACK: g++ has a bug where it gets the value kind of ?: wrong.
486 // libstdc++ relies upon this bug in its implementation of common_type.
487 // If we happen to be processing that implementation, fake up the g++ ?:
488 // semantics. See LWG issue 2141 for more information on the bug.
489 const DecltypeType *DT = DI->getType()->getAs<DecltypeType>();
490 CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D->getDeclContext());
491 if (DT && RD && isa<ConditionalOperator>(DT->getUnderlyingExpr()) &&
492 DT->isReferenceType() &&
493 RD->getEnclosingNamespaceContext() == SemaRef.getStdNamespace() &&
494 RD->getIdentifier() && RD->getIdentifier()->isStr("common_type") &&
495 D->getIdentifier() && D->getIdentifier()->isStr("type") &&
496 SemaRef.getSourceManager().isInSystemHeader(D->getLocStart()))
497 // Fold it to the (non-reference) type which g++ would have produced.
498 DI = SemaRef.Context.getTrivialTypeSourceInfo(
499 DI->getType().getNonReferenceType());
500
501 // Create the new typedef
502 TypedefNameDecl *Typedef;
503 if (IsTypeAlias)
504 Typedef = TypeAliasDecl::Create(SemaRef.Context, Owner, D->getLocStart(),
505 D->getLocation(), D->getIdentifier(), DI);
506 else
507 Typedef = TypedefDecl::Create(SemaRef.Context, Owner, D->getLocStart(),
508 D->getLocation(), D->getIdentifier(), DI);
509 if (Invalid)
510 Typedef->setInvalidDecl();
511
512 // If the old typedef was the name for linkage purposes of an anonymous
513 // tag decl, re-establish that relationship for the new typedef.
514 if (const TagType *oldTagType = D->getUnderlyingType()->getAs<TagType>()) {
515 TagDecl *oldTag = oldTagType->getDecl();
516 if (oldTag->getTypedefNameForAnonDecl() == D && !Invalid) {
517 TagDecl *newTag = DI->getType()->castAs<TagType>()->getDecl();
518 assert(!newTag->hasNameForLinkage());
519 newTag->setTypedefNameForAnonDecl(Typedef);
520 }
521 }
522
523 if (TypedefNameDecl *Prev = getPreviousDeclForInstantiation(D)) {
524 NamedDecl *InstPrev = SemaRef.FindInstantiatedDecl(D->getLocation(), Prev,
525 TemplateArgs);
526 if (!InstPrev)
527 return nullptr;
528
529 TypedefNameDecl *InstPrevTypedef = cast<TypedefNameDecl>(InstPrev);
530
531 // If the typedef types are not identical, reject them.
532 SemaRef.isIncompatibleTypedef(InstPrevTypedef, Typedef);
533
534 Typedef->setPreviousDecl(InstPrevTypedef);
535 }
536
537 SemaRef.InstantiateAttrs(TemplateArgs, D, Typedef);
538
539 Typedef->setAccess(D->getAccess());
540
541 return Typedef;
542 }
543
VisitTypedefDecl(TypedefDecl * D)544 Decl *TemplateDeclInstantiator::VisitTypedefDecl(TypedefDecl *D) {
545 Decl *Typedef = InstantiateTypedefNameDecl(D, /*IsTypeAlias=*/false);
546 if (Typedef)
547 Owner->addDecl(Typedef);
548 return Typedef;
549 }
550
VisitTypeAliasDecl(TypeAliasDecl * D)551 Decl *TemplateDeclInstantiator::VisitTypeAliasDecl(TypeAliasDecl *D) {
552 Decl *Typedef = InstantiateTypedefNameDecl(D, /*IsTypeAlias=*/true);
553 if (Typedef)
554 Owner->addDecl(Typedef);
555 return Typedef;
556 }
557
558 Decl *
VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl * D)559 TemplateDeclInstantiator::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) {
560 // Create a local instantiation scope for this type alias template, which
561 // will contain the instantiations of the template parameters.
562 LocalInstantiationScope Scope(SemaRef);
563
564 TemplateParameterList *TempParams = D->getTemplateParameters();
565 TemplateParameterList *InstParams = SubstTemplateParams(TempParams);
566 if (!InstParams)
567 return nullptr;
568
569 TypeAliasDecl *Pattern = D->getTemplatedDecl();
570
571 TypeAliasTemplateDecl *PrevAliasTemplate = nullptr;
572 if (getPreviousDeclForInstantiation<TypedefNameDecl>(Pattern)) {
573 DeclContext::lookup_result Found = Owner->lookup(Pattern->getDeclName());
574 if (!Found.empty()) {
575 PrevAliasTemplate = dyn_cast<TypeAliasTemplateDecl>(Found.front());
576 }
577 }
578
579 TypeAliasDecl *AliasInst = cast_or_null<TypeAliasDecl>(
580 InstantiateTypedefNameDecl(Pattern, /*IsTypeAlias=*/true));
581 if (!AliasInst)
582 return nullptr;
583
584 TypeAliasTemplateDecl *Inst
585 = TypeAliasTemplateDecl::Create(SemaRef.Context, Owner, D->getLocation(),
586 D->getDeclName(), InstParams, AliasInst);
587 AliasInst->setDescribedAliasTemplate(Inst);
588 if (PrevAliasTemplate)
589 Inst->setPreviousDecl(PrevAliasTemplate);
590
591 Inst->setAccess(D->getAccess());
592
593 if (!PrevAliasTemplate)
594 Inst->setInstantiatedFromMemberTemplate(D);
595
596 Owner->addDecl(Inst);
597
598 return Inst;
599 }
600
VisitVarDecl(VarDecl * D)601 Decl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D) {
602 return VisitVarDecl(D, /*InstantiatingVarTemplate=*/false);
603 }
604
VisitVarDecl(VarDecl * D,bool InstantiatingVarTemplate)605 Decl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D,
606 bool InstantiatingVarTemplate) {
607
608 // Do substitution on the type of the declaration
609 TypeSourceInfo *DI = SemaRef.SubstType(D->getTypeSourceInfo(),
610 TemplateArgs,
611 D->getTypeSpecStartLoc(),
612 D->getDeclName());
613 if (!DI)
614 return nullptr;
615
616 if (DI->getType()->isFunctionType()) {
617 SemaRef.Diag(D->getLocation(), diag::err_variable_instantiates_to_function)
618 << D->isStaticDataMember() << DI->getType();
619 return nullptr;
620 }
621
622 DeclContext *DC = Owner;
623 if (D->isLocalExternDecl())
624 SemaRef.adjustContextForLocalExternDecl(DC);
625
626 // Build the instantiated declaration.
627 VarDecl *Var = VarDecl::Create(SemaRef.Context, DC, D->getInnerLocStart(),
628 D->getLocation(), D->getIdentifier(),
629 DI->getType(), DI, D->getStorageClass());
630
631 // In ARC, infer 'retaining' for variables of retainable type.
632 if (SemaRef.getLangOpts().ObjCAutoRefCount &&
633 SemaRef.inferObjCARCLifetime(Var))
634 Var->setInvalidDecl();
635
636 // Substitute the nested name specifier, if any.
637 if (SubstQualifier(D, Var))
638 return nullptr;
639
640 SemaRef.BuildVariableInstantiation(Var, D, TemplateArgs, LateAttrs, Owner,
641 StartingScope, InstantiatingVarTemplate);
642
643 if (D->isNRVOVariable()) {
644 QualType ReturnType = cast<FunctionDecl>(DC)->getReturnType();
645 if (SemaRef.isCopyElisionCandidate(ReturnType, Var, false))
646 Var->setNRVOVariable(true);
647 }
648
649 Var->setImplicit(D->isImplicit());
650
651 return Var;
652 }
653
VisitAccessSpecDecl(AccessSpecDecl * D)654 Decl *TemplateDeclInstantiator::VisitAccessSpecDecl(AccessSpecDecl *D) {
655 AccessSpecDecl* AD
656 = AccessSpecDecl::Create(SemaRef.Context, D->getAccess(), Owner,
657 D->getAccessSpecifierLoc(), D->getColonLoc());
658 Owner->addHiddenDecl(AD);
659 return AD;
660 }
661
VisitFieldDecl(FieldDecl * D)662 Decl *TemplateDeclInstantiator::VisitFieldDecl(FieldDecl *D) {
663 bool Invalid = false;
664 TypeSourceInfo *DI = D->getTypeSourceInfo();
665 if (DI->getType()->isInstantiationDependentType() ||
666 DI->getType()->isVariablyModifiedType()) {
667 DI = SemaRef.SubstType(DI, TemplateArgs,
668 D->getLocation(), D->getDeclName());
669 if (!DI) {
670 DI = D->getTypeSourceInfo();
671 Invalid = true;
672 } else if (DI->getType()->isFunctionType()) {
673 // C++ [temp.arg.type]p3:
674 // If a declaration acquires a function type through a type
675 // dependent on a template-parameter and this causes a
676 // declaration that does not use the syntactic form of a
677 // function declarator to have function type, the program is
678 // ill-formed.
679 SemaRef.Diag(D->getLocation(), diag::err_field_instantiates_to_function)
680 << DI->getType();
681 Invalid = true;
682 }
683 } else {
684 SemaRef.MarkDeclarationsReferencedInType(D->getLocation(), DI->getType());
685 }
686
687 Expr *BitWidth = D->getBitWidth();
688 if (Invalid)
689 BitWidth = nullptr;
690 else if (BitWidth) {
691 // The bit-width expression is a constant expression.
692 EnterExpressionEvaluationContext Unevaluated(SemaRef,
693 Sema::ConstantEvaluated);
694
695 ExprResult InstantiatedBitWidth
696 = SemaRef.SubstExpr(BitWidth, TemplateArgs);
697 if (InstantiatedBitWidth.isInvalid()) {
698 Invalid = true;
699 BitWidth = nullptr;
700 } else
701 BitWidth = InstantiatedBitWidth.getAs<Expr>();
702 }
703
704 FieldDecl *Field = SemaRef.CheckFieldDecl(D->getDeclName(),
705 DI->getType(), DI,
706 cast<RecordDecl>(Owner),
707 D->getLocation(),
708 D->isMutable(),
709 BitWidth,
710 D->getInClassInitStyle(),
711 D->getInnerLocStart(),
712 D->getAccess(),
713 nullptr);
714 if (!Field) {
715 cast<Decl>(Owner)->setInvalidDecl();
716 return nullptr;
717 }
718
719 SemaRef.InstantiateAttrs(TemplateArgs, D, Field, LateAttrs, StartingScope);
720
721 if (Field->hasAttrs())
722 SemaRef.CheckAlignasUnderalignment(Field);
723
724 if (Invalid)
725 Field->setInvalidDecl();
726
727 if (!Field->getDeclName()) {
728 // Keep track of where this decl came from.
729 SemaRef.Context.setInstantiatedFromUnnamedFieldDecl(Field, D);
730 }
731 if (CXXRecordDecl *Parent= dyn_cast<CXXRecordDecl>(Field->getDeclContext())) {
732 if (Parent->isAnonymousStructOrUnion() &&
733 Parent->getRedeclContext()->isFunctionOrMethod())
734 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Field);
735 }
736
737 Field->setImplicit(D->isImplicit());
738 Field->setAccess(D->getAccess());
739 Owner->addDecl(Field);
740
741 return Field;
742 }
743
VisitMSPropertyDecl(MSPropertyDecl * D)744 Decl *TemplateDeclInstantiator::VisitMSPropertyDecl(MSPropertyDecl *D) {
745 bool Invalid = false;
746 TypeSourceInfo *DI = D->getTypeSourceInfo();
747
748 if (DI->getType()->isVariablyModifiedType()) {
749 SemaRef.Diag(D->getLocation(), diag::err_property_is_variably_modified)
750 << D;
751 Invalid = true;
752 } else if (DI->getType()->isInstantiationDependentType()) {
753 DI = SemaRef.SubstType(DI, TemplateArgs,
754 D->getLocation(), D->getDeclName());
755 if (!DI) {
756 DI = D->getTypeSourceInfo();
757 Invalid = true;
758 } else if (DI->getType()->isFunctionType()) {
759 // C++ [temp.arg.type]p3:
760 // If a declaration acquires a function type through a type
761 // dependent on a template-parameter and this causes a
762 // declaration that does not use the syntactic form of a
763 // function declarator to have function type, the program is
764 // ill-formed.
765 SemaRef.Diag(D->getLocation(), diag::err_field_instantiates_to_function)
766 << DI->getType();
767 Invalid = true;
768 }
769 } else {
770 SemaRef.MarkDeclarationsReferencedInType(D->getLocation(), DI->getType());
771 }
772
773 MSPropertyDecl *Property = MSPropertyDecl::Create(
774 SemaRef.Context, Owner, D->getLocation(), D->getDeclName(), DI->getType(),
775 DI, D->getLocStart(), D->getGetterId(), D->getSetterId());
776
777 SemaRef.InstantiateAttrs(TemplateArgs, D, Property, LateAttrs,
778 StartingScope);
779
780 if (Invalid)
781 Property->setInvalidDecl();
782
783 Property->setAccess(D->getAccess());
784 Owner->addDecl(Property);
785
786 return Property;
787 }
788
VisitIndirectFieldDecl(IndirectFieldDecl * D)789 Decl *TemplateDeclInstantiator::VisitIndirectFieldDecl(IndirectFieldDecl *D) {
790 NamedDecl **NamedChain =
791 new (SemaRef.Context)NamedDecl*[D->getChainingSize()];
792
793 int i = 0;
794 for (auto *PI : D->chain()) {
795 NamedDecl *Next = SemaRef.FindInstantiatedDecl(D->getLocation(), PI,
796 TemplateArgs);
797 if (!Next)
798 return nullptr;
799
800 NamedChain[i++] = Next;
801 }
802
803 QualType T = cast<FieldDecl>(NamedChain[i-1])->getType();
804 IndirectFieldDecl *IndirectField = IndirectFieldDecl::Create(
805 SemaRef.Context, Owner, D->getLocation(), D->getIdentifier(), T,
806 {NamedChain, D->getChainingSize()});
807
808 for (const auto *Attr : D->attrs())
809 IndirectField->addAttr(Attr->clone(SemaRef.Context));
810
811 IndirectField->setImplicit(D->isImplicit());
812 IndirectField->setAccess(D->getAccess());
813 Owner->addDecl(IndirectField);
814 return IndirectField;
815 }
816
VisitFriendDecl(FriendDecl * D)817 Decl *TemplateDeclInstantiator::VisitFriendDecl(FriendDecl *D) {
818 // Handle friend type expressions by simply substituting template
819 // parameters into the pattern type and checking the result.
820 if (TypeSourceInfo *Ty = D->getFriendType()) {
821 TypeSourceInfo *InstTy;
822 // If this is an unsupported friend, don't bother substituting template
823 // arguments into it. The actual type referred to won't be used by any
824 // parts of Clang, and may not be valid for instantiating. Just use the
825 // same info for the instantiated friend.
826 if (D->isUnsupportedFriend()) {
827 InstTy = Ty;
828 } else {
829 InstTy = SemaRef.SubstType(Ty, TemplateArgs,
830 D->getLocation(), DeclarationName());
831 }
832 if (!InstTy)
833 return nullptr;
834
835 FriendDecl *FD = SemaRef.CheckFriendTypeDecl(D->getLocStart(),
836 D->getFriendLoc(), InstTy);
837 if (!FD)
838 return nullptr;
839
840 FD->setAccess(AS_public);
841 FD->setUnsupportedFriend(D->isUnsupportedFriend());
842 Owner->addDecl(FD);
843 return FD;
844 }
845
846 NamedDecl *ND = D->getFriendDecl();
847 assert(ND && "friend decl must be a decl or a type!");
848
849 // All of the Visit implementations for the various potential friend
850 // declarations have to be carefully written to work for friend
851 // objects, with the most important detail being that the target
852 // decl should almost certainly not be placed in Owner.
853 Decl *NewND = Visit(ND);
854 if (!NewND) return nullptr;
855
856 FriendDecl *FD =
857 FriendDecl::Create(SemaRef.Context, Owner, D->getLocation(),
858 cast<NamedDecl>(NewND), D->getFriendLoc());
859 FD->setAccess(AS_public);
860 FD->setUnsupportedFriend(D->isUnsupportedFriend());
861 Owner->addDecl(FD);
862 return FD;
863 }
864
VisitStaticAssertDecl(StaticAssertDecl * D)865 Decl *TemplateDeclInstantiator::VisitStaticAssertDecl(StaticAssertDecl *D) {
866 Expr *AssertExpr = D->getAssertExpr();
867
868 // The expression in a static assertion is a constant expression.
869 EnterExpressionEvaluationContext Unevaluated(SemaRef,
870 Sema::ConstantEvaluated);
871
872 ExprResult InstantiatedAssertExpr
873 = SemaRef.SubstExpr(AssertExpr, TemplateArgs);
874 if (InstantiatedAssertExpr.isInvalid())
875 return nullptr;
876
877 return SemaRef.BuildStaticAssertDeclaration(D->getLocation(),
878 InstantiatedAssertExpr.get(),
879 D->getMessage(),
880 D->getRParenLoc(),
881 D->isFailed());
882 }
883
VisitEnumDecl(EnumDecl * D)884 Decl *TemplateDeclInstantiator::VisitEnumDecl(EnumDecl *D) {
885 EnumDecl *PrevDecl = nullptr;
886 if (EnumDecl *PatternPrev = getPreviousDeclForInstantiation(D)) {
887 NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->getLocation(),
888 PatternPrev,
889 TemplateArgs);
890 if (!Prev) return nullptr;
891 PrevDecl = cast<EnumDecl>(Prev);
892 }
893
894 EnumDecl *Enum = EnumDecl::Create(SemaRef.Context, Owner, D->getLocStart(),
895 D->getLocation(), D->getIdentifier(),
896 PrevDecl, D->isScoped(),
897 D->isScopedUsingClassTag(), D->isFixed());
898 if (D->isFixed()) {
899 if (TypeSourceInfo *TI = D->getIntegerTypeSourceInfo()) {
900 // If we have type source information for the underlying type, it means it
901 // has been explicitly set by the user. Perform substitution on it before
902 // moving on.
903 SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc();
904 TypeSourceInfo *NewTI = SemaRef.SubstType(TI, TemplateArgs, UnderlyingLoc,
905 DeclarationName());
906 if (!NewTI || SemaRef.CheckEnumUnderlyingType(NewTI))
907 Enum->setIntegerType(SemaRef.Context.IntTy);
908 else
909 Enum->setIntegerTypeSourceInfo(NewTI);
910 } else {
911 assert(!D->getIntegerType()->isDependentType()
912 && "Dependent type without type source info");
913 Enum->setIntegerType(D->getIntegerType());
914 }
915 }
916
917 SemaRef.InstantiateAttrs(TemplateArgs, D, Enum);
918
919 Enum->setInstantiationOfMemberEnum(D, TSK_ImplicitInstantiation);
920 Enum->setAccess(D->getAccess());
921 // Forward the mangling number from the template to the instantiated decl.
922 SemaRef.Context.setManglingNumber(Enum, SemaRef.Context.getManglingNumber(D));
923 // See if the old tag was defined along with a declarator.
924 // If it did, mark the new tag as being associated with that declarator.
925 if (DeclaratorDecl *DD = SemaRef.Context.getDeclaratorForUnnamedTagDecl(D))
926 SemaRef.Context.addDeclaratorForUnnamedTagDecl(Enum, DD);
927 // See if the old tag was defined along with a typedef.
928 // If it did, mark the new tag as being associated with that typedef.
929 if (TypedefNameDecl *TND = SemaRef.Context.getTypedefNameForUnnamedTagDecl(D))
930 SemaRef.Context.addTypedefNameForUnnamedTagDecl(Enum, TND);
931 if (SubstQualifier(D, Enum)) return nullptr;
932 Owner->addDecl(Enum);
933
934 EnumDecl *Def = D->getDefinition();
935 if (Def && Def != D) {
936 // If this is an out-of-line definition of an enum member template, check
937 // that the underlying types match in the instantiation of both
938 // declarations.
939 if (TypeSourceInfo *TI = Def->getIntegerTypeSourceInfo()) {
940 SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc();
941 QualType DefnUnderlying =
942 SemaRef.SubstType(TI->getType(), TemplateArgs,
943 UnderlyingLoc, DeclarationName());
944 SemaRef.CheckEnumRedeclaration(Def->getLocation(), Def->isScoped(),
945 DefnUnderlying,
946 /*EnumUnderlyingIsImplicit=*/false, Enum);
947 }
948 }
949
950 // C++11 [temp.inst]p1: The implicit instantiation of a class template
951 // specialization causes the implicit instantiation of the declarations, but
952 // not the definitions of scoped member enumerations.
953 //
954 // DR1484 clarifies that enumeration definitions inside of a template
955 // declaration aren't considered entities that can be separately instantiated
956 // from the rest of the entity they are declared inside of.
957 if (isDeclWithinFunction(D) ? D == Def : Def && !Enum->isScoped()) {
958 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Enum);
959 InstantiateEnumDefinition(Enum, Def);
960 }
961
962 return Enum;
963 }
964
InstantiateEnumDefinition(EnumDecl * Enum,EnumDecl * Pattern)965 void TemplateDeclInstantiator::InstantiateEnumDefinition(
966 EnumDecl *Enum, EnumDecl *Pattern) {
967 Enum->startDefinition();
968
969 // Update the location to refer to the definition.
970 Enum->setLocation(Pattern->getLocation());
971
972 SmallVector<Decl*, 4> Enumerators;
973
974 EnumConstantDecl *LastEnumConst = nullptr;
975 for (auto *EC : Pattern->enumerators()) {
976 // The specified value for the enumerator.
977 ExprResult Value((Expr *)nullptr);
978 if (Expr *UninstValue = EC->getInitExpr()) {
979 // The enumerator's value expression is a constant expression.
980 EnterExpressionEvaluationContext Unevaluated(SemaRef,
981 Sema::ConstantEvaluated);
982
983 Value = SemaRef.SubstExpr(UninstValue, TemplateArgs);
984 }
985
986 // Drop the initial value and continue.
987 bool isInvalid = false;
988 if (Value.isInvalid()) {
989 Value = nullptr;
990 isInvalid = true;
991 }
992
993 EnumConstantDecl *EnumConst
994 = SemaRef.CheckEnumConstant(Enum, LastEnumConst,
995 EC->getLocation(), EC->getIdentifier(),
996 Value.get());
997
998 if (isInvalid) {
999 if (EnumConst)
1000 EnumConst->setInvalidDecl();
1001 Enum->setInvalidDecl();
1002 }
1003
1004 if (EnumConst) {
1005 SemaRef.InstantiateAttrs(TemplateArgs, EC, EnumConst);
1006
1007 EnumConst->setAccess(Enum->getAccess());
1008 Enum->addDecl(EnumConst);
1009 Enumerators.push_back(EnumConst);
1010 LastEnumConst = EnumConst;
1011
1012 if (Pattern->getDeclContext()->isFunctionOrMethod() &&
1013 !Enum->isScoped()) {
1014 // If the enumeration is within a function or method, record the enum
1015 // constant as a local.
1016 SemaRef.CurrentInstantiationScope->InstantiatedLocal(EC, EnumConst);
1017 }
1018 }
1019 }
1020
1021 // FIXME: Fixup LBraceLoc
1022 SemaRef.ActOnEnumBody(Enum->getLocation(), SourceLocation(),
1023 Enum->getRBraceLoc(), Enum,
1024 Enumerators,
1025 nullptr, nullptr);
1026 }
1027
VisitEnumConstantDecl(EnumConstantDecl * D)1028 Decl *TemplateDeclInstantiator::VisitEnumConstantDecl(EnumConstantDecl *D) {
1029 llvm_unreachable("EnumConstantDecls can only occur within EnumDecls.");
1030 }
1031
1032 Decl *
VisitBuiltinTemplateDecl(BuiltinTemplateDecl * D)1033 TemplateDeclInstantiator::VisitBuiltinTemplateDecl(BuiltinTemplateDecl *D) {
1034 llvm_unreachable("BuiltinTemplateDecls cannot be instantiated.");
1035 }
1036
VisitClassTemplateDecl(ClassTemplateDecl * D)1037 Decl *TemplateDeclInstantiator::VisitClassTemplateDecl(ClassTemplateDecl *D) {
1038 bool isFriend = (D->getFriendObjectKind() != Decl::FOK_None);
1039
1040 // Create a local instantiation scope for this class template, which
1041 // will contain the instantiations of the template parameters.
1042 LocalInstantiationScope Scope(SemaRef);
1043 TemplateParameterList *TempParams = D->getTemplateParameters();
1044 TemplateParameterList *InstParams = SubstTemplateParams(TempParams);
1045 if (!InstParams)
1046 return nullptr;
1047
1048 CXXRecordDecl *Pattern = D->getTemplatedDecl();
1049
1050 // Instantiate the qualifier. We have to do this first in case
1051 // we're a friend declaration, because if we are then we need to put
1052 // the new declaration in the appropriate context.
1053 NestedNameSpecifierLoc QualifierLoc = Pattern->getQualifierLoc();
1054 if (QualifierLoc) {
1055 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
1056 TemplateArgs);
1057 if (!QualifierLoc)
1058 return nullptr;
1059 }
1060
1061 CXXRecordDecl *PrevDecl = nullptr;
1062 ClassTemplateDecl *PrevClassTemplate = nullptr;
1063
1064 if (!isFriend && getPreviousDeclForInstantiation(Pattern)) {
1065 DeclContext::lookup_result Found = Owner->lookup(Pattern->getDeclName());
1066 if (!Found.empty()) {
1067 PrevClassTemplate = dyn_cast<ClassTemplateDecl>(Found.front());
1068 if (PrevClassTemplate)
1069 PrevDecl = PrevClassTemplate->getTemplatedDecl();
1070 }
1071 }
1072
1073 // If this isn't a friend, then it's a member template, in which
1074 // case we just want to build the instantiation in the
1075 // specialization. If it is a friend, we want to build it in
1076 // the appropriate context.
1077 DeclContext *DC = Owner;
1078 if (isFriend) {
1079 if (QualifierLoc) {
1080 CXXScopeSpec SS;
1081 SS.Adopt(QualifierLoc);
1082 DC = SemaRef.computeDeclContext(SS);
1083 if (!DC) return nullptr;
1084 } else {
1085 DC = SemaRef.FindInstantiatedContext(Pattern->getLocation(),
1086 Pattern->getDeclContext(),
1087 TemplateArgs);
1088 }
1089
1090 // Look for a previous declaration of the template in the owning
1091 // context.
1092 LookupResult R(SemaRef, Pattern->getDeclName(), Pattern->getLocation(),
1093 Sema::LookupOrdinaryName, Sema::ForRedeclaration);
1094 SemaRef.LookupQualifiedName(R, DC);
1095
1096 if (R.isSingleResult()) {
1097 PrevClassTemplate = R.getAsSingle<ClassTemplateDecl>();
1098 if (PrevClassTemplate)
1099 PrevDecl = PrevClassTemplate->getTemplatedDecl();
1100 }
1101
1102 if (!PrevClassTemplate && QualifierLoc) {
1103 SemaRef.Diag(Pattern->getLocation(), diag::err_not_tag_in_scope)
1104 << D->getTemplatedDecl()->getTagKind() << Pattern->getDeclName() << DC
1105 << QualifierLoc.getSourceRange();
1106 return nullptr;
1107 }
1108
1109 bool AdoptedPreviousTemplateParams = false;
1110 if (PrevClassTemplate) {
1111 bool Complain = true;
1112
1113 // HACK: libstdc++ 4.2.1 contains an ill-formed friend class
1114 // template for struct std::tr1::__detail::_Map_base, where the
1115 // template parameters of the friend declaration don't match the
1116 // template parameters of the original declaration. In this one
1117 // case, we don't complain about the ill-formed friend
1118 // declaration.
1119 if (isFriend && Pattern->getIdentifier() &&
1120 Pattern->getIdentifier()->isStr("_Map_base") &&
1121 DC->isNamespace() &&
1122 cast<NamespaceDecl>(DC)->getIdentifier() &&
1123 cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__detail")) {
1124 DeclContext *DCParent = DC->getParent();
1125 if (DCParent->isNamespace() &&
1126 cast<NamespaceDecl>(DCParent)->getIdentifier() &&
1127 cast<NamespaceDecl>(DCParent)->getIdentifier()->isStr("tr1")) {
1128 if (cast<Decl>(DCParent)->isInStdNamespace())
1129 Complain = false;
1130 }
1131 }
1132
1133 TemplateParameterList *PrevParams
1134 = PrevClassTemplate->getTemplateParameters();
1135
1136 // Make sure the parameter lists match.
1137 if (!SemaRef.TemplateParameterListsAreEqual(InstParams, PrevParams,
1138 Complain,
1139 Sema::TPL_TemplateMatch)) {
1140 if (Complain)
1141 return nullptr;
1142
1143 AdoptedPreviousTemplateParams = true;
1144 InstParams = PrevParams;
1145 }
1146
1147 // Do some additional validation, then merge default arguments
1148 // from the existing declarations.
1149 if (!AdoptedPreviousTemplateParams &&
1150 SemaRef.CheckTemplateParameterList(InstParams, PrevParams,
1151 Sema::TPC_ClassTemplate))
1152 return nullptr;
1153 }
1154 }
1155
1156 CXXRecordDecl *RecordInst
1157 = CXXRecordDecl::Create(SemaRef.Context, Pattern->getTagKind(), DC,
1158 Pattern->getLocStart(), Pattern->getLocation(),
1159 Pattern->getIdentifier(), PrevDecl,
1160 /*DelayTypeCreation=*/true);
1161
1162 if (QualifierLoc)
1163 RecordInst->setQualifierInfo(QualifierLoc);
1164
1165 ClassTemplateDecl *Inst
1166 = ClassTemplateDecl::Create(SemaRef.Context, DC, D->getLocation(),
1167 D->getIdentifier(), InstParams, RecordInst,
1168 PrevClassTemplate);
1169 RecordInst->setDescribedClassTemplate(Inst);
1170
1171 if (isFriend) {
1172 if (PrevClassTemplate)
1173 Inst->setAccess(PrevClassTemplate->getAccess());
1174 else
1175 Inst->setAccess(D->getAccess());
1176
1177 Inst->setObjectOfFriendDecl();
1178 // TODO: do we want to track the instantiation progeny of this
1179 // friend target decl?
1180 } else {
1181 Inst->setAccess(D->getAccess());
1182 if (!PrevClassTemplate)
1183 Inst->setInstantiatedFromMemberTemplate(D);
1184 }
1185
1186 // Trigger creation of the type for the instantiation.
1187 SemaRef.Context.getInjectedClassNameType(RecordInst,
1188 Inst->getInjectedClassNameSpecialization());
1189
1190 // Finish handling of friends.
1191 if (isFriend) {
1192 DC->makeDeclVisibleInContext(Inst);
1193 Inst->setLexicalDeclContext(Owner);
1194 RecordInst->setLexicalDeclContext(Owner);
1195 return Inst;
1196 }
1197
1198 if (D->isOutOfLine()) {
1199 Inst->setLexicalDeclContext(D->getLexicalDeclContext());
1200 RecordInst->setLexicalDeclContext(D->getLexicalDeclContext());
1201 }
1202
1203 Owner->addDecl(Inst);
1204
1205 if (!PrevClassTemplate) {
1206 // Queue up any out-of-line partial specializations of this member
1207 // class template; the client will force their instantiation once
1208 // the enclosing class has been instantiated.
1209 SmallVector<ClassTemplatePartialSpecializationDecl *, 4> PartialSpecs;
1210 D->getPartialSpecializations(PartialSpecs);
1211 for (unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
1212 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
1213 OutOfLinePartialSpecs.push_back(std::make_pair(Inst, PartialSpecs[I]));
1214 }
1215
1216 return Inst;
1217 }
1218
1219 Decl *
VisitClassTemplatePartialSpecializationDecl(ClassTemplatePartialSpecializationDecl * D)1220 TemplateDeclInstantiator::VisitClassTemplatePartialSpecializationDecl(
1221 ClassTemplatePartialSpecializationDecl *D) {
1222 ClassTemplateDecl *ClassTemplate = D->getSpecializedTemplate();
1223
1224 // Lookup the already-instantiated declaration in the instantiation
1225 // of the class template and return that.
1226 DeclContext::lookup_result Found
1227 = Owner->lookup(ClassTemplate->getDeclName());
1228 if (Found.empty())
1229 return nullptr;
1230
1231 ClassTemplateDecl *InstClassTemplate
1232 = dyn_cast<ClassTemplateDecl>(Found.front());
1233 if (!InstClassTemplate)
1234 return nullptr;
1235
1236 if (ClassTemplatePartialSpecializationDecl *Result
1237 = InstClassTemplate->findPartialSpecInstantiatedFromMember(D))
1238 return Result;
1239
1240 return InstantiateClassTemplatePartialSpecialization(InstClassTemplate, D);
1241 }
1242
VisitVarTemplateDecl(VarTemplateDecl * D)1243 Decl *TemplateDeclInstantiator::VisitVarTemplateDecl(VarTemplateDecl *D) {
1244 assert(D->getTemplatedDecl()->isStaticDataMember() &&
1245 "Only static data member templates are allowed.");
1246
1247 // Create a local instantiation scope for this variable template, which
1248 // will contain the instantiations of the template parameters.
1249 LocalInstantiationScope Scope(SemaRef);
1250 TemplateParameterList *TempParams = D->getTemplateParameters();
1251 TemplateParameterList *InstParams = SubstTemplateParams(TempParams);
1252 if (!InstParams)
1253 return nullptr;
1254
1255 VarDecl *Pattern = D->getTemplatedDecl();
1256 VarTemplateDecl *PrevVarTemplate = nullptr;
1257
1258 if (getPreviousDeclForInstantiation(Pattern)) {
1259 DeclContext::lookup_result Found = Owner->lookup(Pattern->getDeclName());
1260 if (!Found.empty())
1261 PrevVarTemplate = dyn_cast<VarTemplateDecl>(Found.front());
1262 }
1263
1264 VarDecl *VarInst =
1265 cast_or_null<VarDecl>(VisitVarDecl(Pattern,
1266 /*InstantiatingVarTemplate=*/true));
1267 if (!VarInst) return nullptr;
1268
1269 DeclContext *DC = Owner;
1270
1271 VarTemplateDecl *Inst = VarTemplateDecl::Create(
1272 SemaRef.Context, DC, D->getLocation(), D->getIdentifier(), InstParams,
1273 VarInst);
1274 VarInst->setDescribedVarTemplate(Inst);
1275 Inst->setPreviousDecl(PrevVarTemplate);
1276
1277 Inst->setAccess(D->getAccess());
1278 if (!PrevVarTemplate)
1279 Inst->setInstantiatedFromMemberTemplate(D);
1280
1281 if (D->isOutOfLine()) {
1282 Inst->setLexicalDeclContext(D->getLexicalDeclContext());
1283 VarInst->setLexicalDeclContext(D->getLexicalDeclContext());
1284 }
1285
1286 Owner->addDecl(Inst);
1287
1288 if (!PrevVarTemplate) {
1289 // Queue up any out-of-line partial specializations of this member
1290 // variable template; the client will force their instantiation once
1291 // the enclosing class has been instantiated.
1292 SmallVector<VarTemplatePartialSpecializationDecl *, 4> PartialSpecs;
1293 D->getPartialSpecializations(PartialSpecs);
1294 for (unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
1295 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
1296 OutOfLineVarPartialSpecs.push_back(
1297 std::make_pair(Inst, PartialSpecs[I]));
1298 }
1299
1300 return Inst;
1301 }
1302
VisitVarTemplatePartialSpecializationDecl(VarTemplatePartialSpecializationDecl * D)1303 Decl *TemplateDeclInstantiator::VisitVarTemplatePartialSpecializationDecl(
1304 VarTemplatePartialSpecializationDecl *D) {
1305 assert(D->isStaticDataMember() &&
1306 "Only static data member templates are allowed.");
1307
1308 VarTemplateDecl *VarTemplate = D->getSpecializedTemplate();
1309
1310 // Lookup the already-instantiated declaration and return that.
1311 DeclContext::lookup_result Found = Owner->lookup(VarTemplate->getDeclName());
1312 assert(!Found.empty() && "Instantiation found nothing?");
1313
1314 VarTemplateDecl *InstVarTemplate = dyn_cast<VarTemplateDecl>(Found.front());
1315 assert(InstVarTemplate && "Instantiation did not find a variable template?");
1316
1317 if (VarTemplatePartialSpecializationDecl *Result =
1318 InstVarTemplate->findPartialSpecInstantiatedFromMember(D))
1319 return Result;
1320
1321 return InstantiateVarTemplatePartialSpecialization(InstVarTemplate, D);
1322 }
1323
1324 Decl *
VisitFunctionTemplateDecl(FunctionTemplateDecl * D)1325 TemplateDeclInstantiator::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
1326 // Create a local instantiation scope for this function template, which
1327 // will contain the instantiations of the template parameters and then get
1328 // merged with the local instantiation scope for the function template
1329 // itself.
1330 LocalInstantiationScope Scope(SemaRef);
1331
1332 TemplateParameterList *TempParams = D->getTemplateParameters();
1333 TemplateParameterList *InstParams = SubstTemplateParams(TempParams);
1334 if (!InstParams)
1335 return nullptr;
1336
1337 FunctionDecl *Instantiated = nullptr;
1338 if (CXXMethodDecl *DMethod = dyn_cast<CXXMethodDecl>(D->getTemplatedDecl()))
1339 Instantiated = cast_or_null<FunctionDecl>(VisitCXXMethodDecl(DMethod,
1340 InstParams));
1341 else
1342 Instantiated = cast_or_null<FunctionDecl>(VisitFunctionDecl(
1343 D->getTemplatedDecl(),
1344 InstParams));
1345
1346 if (!Instantiated)
1347 return nullptr;
1348
1349 // Link the instantiated function template declaration to the function
1350 // template from which it was instantiated.
1351 FunctionTemplateDecl *InstTemplate
1352 = Instantiated->getDescribedFunctionTemplate();
1353 InstTemplate->setAccess(D->getAccess());
1354 assert(InstTemplate &&
1355 "VisitFunctionDecl/CXXMethodDecl didn't create a template!");
1356
1357 bool isFriend = (InstTemplate->getFriendObjectKind() != Decl::FOK_None);
1358
1359 // Link the instantiation back to the pattern *unless* this is a
1360 // non-definition friend declaration.
1361 if (!InstTemplate->getInstantiatedFromMemberTemplate() &&
1362 !(isFriend && !D->getTemplatedDecl()->isThisDeclarationADefinition()))
1363 InstTemplate->setInstantiatedFromMemberTemplate(D);
1364
1365 // Make declarations visible in the appropriate context.
1366 if (!isFriend) {
1367 Owner->addDecl(InstTemplate);
1368 } else if (InstTemplate->getDeclContext()->isRecord() &&
1369 !getPreviousDeclForInstantiation(D)) {
1370 SemaRef.CheckFriendAccess(InstTemplate);
1371 }
1372
1373 return InstTemplate;
1374 }
1375
VisitCXXRecordDecl(CXXRecordDecl * D)1376 Decl *TemplateDeclInstantiator::VisitCXXRecordDecl(CXXRecordDecl *D) {
1377 CXXRecordDecl *PrevDecl = nullptr;
1378 if (D->isInjectedClassName())
1379 PrevDecl = cast<CXXRecordDecl>(Owner);
1380 else if (CXXRecordDecl *PatternPrev = getPreviousDeclForInstantiation(D)) {
1381 NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->getLocation(),
1382 PatternPrev,
1383 TemplateArgs);
1384 if (!Prev) return nullptr;
1385 PrevDecl = cast<CXXRecordDecl>(Prev);
1386 }
1387
1388 CXXRecordDecl *Record
1389 = CXXRecordDecl::Create(SemaRef.Context, D->getTagKind(), Owner,
1390 D->getLocStart(), D->getLocation(),
1391 D->getIdentifier(), PrevDecl);
1392
1393 // Substitute the nested name specifier, if any.
1394 if (SubstQualifier(D, Record))
1395 return nullptr;
1396
1397 Record->setImplicit(D->isImplicit());
1398 // FIXME: Check against AS_none is an ugly hack to work around the issue that
1399 // the tag decls introduced by friend class declarations don't have an access
1400 // specifier. Remove once this area of the code gets sorted out.
1401 if (D->getAccess() != AS_none)
1402 Record->setAccess(D->getAccess());
1403 if (!D->isInjectedClassName())
1404 Record->setInstantiationOfMemberClass(D, TSK_ImplicitInstantiation);
1405
1406 // If the original function was part of a friend declaration,
1407 // inherit its namespace state.
1408 if (D->getFriendObjectKind())
1409 Record->setObjectOfFriendDecl();
1410
1411 // Make sure that anonymous structs and unions are recorded.
1412 if (D->isAnonymousStructOrUnion())
1413 Record->setAnonymousStructOrUnion(true);
1414
1415 if (D->isLocalClass())
1416 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Record);
1417
1418 // Forward the mangling number from the template to the instantiated decl.
1419 SemaRef.Context.setManglingNumber(Record,
1420 SemaRef.Context.getManglingNumber(D));
1421
1422 // See if the old tag was defined along with a declarator.
1423 // If it did, mark the new tag as being associated with that declarator.
1424 if (DeclaratorDecl *DD = SemaRef.Context.getDeclaratorForUnnamedTagDecl(D))
1425 SemaRef.Context.addDeclaratorForUnnamedTagDecl(Record, DD);
1426
1427 // See if the old tag was defined along with a typedef.
1428 // If it did, mark the new tag as being associated with that typedef.
1429 if (TypedefNameDecl *TND = SemaRef.Context.getTypedefNameForUnnamedTagDecl(D))
1430 SemaRef.Context.addTypedefNameForUnnamedTagDecl(Record, TND);
1431
1432 Owner->addDecl(Record);
1433
1434 // DR1484 clarifies that the members of a local class are instantiated as part
1435 // of the instantiation of their enclosing entity.
1436 if (D->isCompleteDefinition() && D->isLocalClass()) {
1437 Sema::SavePendingLocalImplicitInstantiationsRAII
1438 SavedPendingLocalImplicitInstantiations(SemaRef);
1439
1440 SemaRef.InstantiateClass(D->getLocation(), Record, D, TemplateArgs,
1441 TSK_ImplicitInstantiation,
1442 /*Complain=*/true);
1443
1444 SemaRef.InstantiateClassMembers(D->getLocation(), Record, TemplateArgs,
1445 TSK_ImplicitInstantiation);
1446
1447 // This class may have local implicit instantiations that need to be
1448 // performed within this scope.
1449 SemaRef.PerformPendingInstantiations(/*LocalOnly=*/true);
1450 }
1451
1452 SemaRef.DiagnoseUnusedNestedTypedefs(Record);
1453
1454 return Record;
1455 }
1456
1457 /// \brief Adjust the given function type for an instantiation of the
1458 /// given declaration, to cope with modifications to the function's type that
1459 /// aren't reflected in the type-source information.
1460 ///
1461 /// \param D The declaration we're instantiating.
1462 /// \param TInfo The already-instantiated type.
adjustFunctionTypeForInstantiation(ASTContext & Context,FunctionDecl * D,TypeSourceInfo * TInfo)1463 static QualType adjustFunctionTypeForInstantiation(ASTContext &Context,
1464 FunctionDecl *D,
1465 TypeSourceInfo *TInfo) {
1466 const FunctionProtoType *OrigFunc
1467 = D->getType()->castAs<FunctionProtoType>();
1468 const FunctionProtoType *NewFunc
1469 = TInfo->getType()->castAs<FunctionProtoType>();
1470 if (OrigFunc->getExtInfo() == NewFunc->getExtInfo())
1471 return TInfo->getType();
1472
1473 FunctionProtoType::ExtProtoInfo NewEPI = NewFunc->getExtProtoInfo();
1474 NewEPI.ExtInfo = OrigFunc->getExtInfo();
1475 return Context.getFunctionType(NewFunc->getReturnType(),
1476 NewFunc->getParamTypes(), NewEPI);
1477 }
1478
1479 /// Normal class members are of more specific types and therefore
1480 /// don't make it here. This function serves two purposes:
1481 /// 1) instantiating function templates
1482 /// 2) substituting friend declarations
VisitFunctionDecl(FunctionDecl * D,TemplateParameterList * TemplateParams)1483 Decl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D,
1484 TemplateParameterList *TemplateParams) {
1485 // Check whether there is already a function template specialization for
1486 // this declaration.
1487 FunctionTemplateDecl *FunctionTemplate = D->getDescribedFunctionTemplate();
1488 if (FunctionTemplate && !TemplateParams) {
1489 ArrayRef<TemplateArgument> Innermost = TemplateArgs.getInnermost();
1490
1491 void *InsertPos = nullptr;
1492 FunctionDecl *SpecFunc
1493 = FunctionTemplate->findSpecialization(Innermost, InsertPos);
1494
1495 // If we already have a function template specialization, return it.
1496 if (SpecFunc)
1497 return SpecFunc;
1498 }
1499
1500 bool isFriend;
1501 if (FunctionTemplate)
1502 isFriend = (FunctionTemplate->getFriendObjectKind() != Decl::FOK_None);
1503 else
1504 isFriend = (D->getFriendObjectKind() != Decl::FOK_None);
1505
1506 bool MergeWithParentScope = (TemplateParams != nullptr) ||
1507 Owner->isFunctionOrMethod() ||
1508 !(isa<Decl>(Owner) &&
1509 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
1510 LocalInstantiationScope Scope(SemaRef, MergeWithParentScope);
1511
1512 SmallVector<ParmVarDecl *, 4> Params;
1513 TypeSourceInfo *TInfo = SubstFunctionType(D, Params);
1514 if (!TInfo)
1515 return nullptr;
1516 QualType T = adjustFunctionTypeForInstantiation(SemaRef.Context, D, TInfo);
1517
1518 NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc();
1519 if (QualifierLoc) {
1520 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
1521 TemplateArgs);
1522 if (!QualifierLoc)
1523 return nullptr;
1524 }
1525
1526 // If we're instantiating a local function declaration, put the result
1527 // in the enclosing namespace; otherwise we need to find the instantiated
1528 // context.
1529 DeclContext *DC;
1530 if (D->isLocalExternDecl()) {
1531 DC = Owner;
1532 SemaRef.adjustContextForLocalExternDecl(DC);
1533 } else if (isFriend && QualifierLoc) {
1534 CXXScopeSpec SS;
1535 SS.Adopt(QualifierLoc);
1536 DC = SemaRef.computeDeclContext(SS);
1537 if (!DC) return nullptr;
1538 } else {
1539 DC = SemaRef.FindInstantiatedContext(D->getLocation(), D->getDeclContext(),
1540 TemplateArgs);
1541 }
1542
1543 FunctionDecl *Function =
1544 FunctionDecl::Create(SemaRef.Context, DC, D->getInnerLocStart(),
1545 D->getNameInfo(), T, TInfo,
1546 D->getCanonicalDecl()->getStorageClass(),
1547 D->isInlineSpecified(), D->hasWrittenPrototype(),
1548 D->isConstexpr());
1549 Function->setRangeEnd(D->getSourceRange().getEnd());
1550
1551 if (D->isInlined())
1552 Function->setImplicitlyInline();
1553
1554 if (QualifierLoc)
1555 Function->setQualifierInfo(QualifierLoc);
1556
1557 if (D->isLocalExternDecl())
1558 Function->setLocalExternDecl();
1559
1560 DeclContext *LexicalDC = Owner;
1561 if (!isFriend && D->isOutOfLine() && !D->isLocalExternDecl()) {
1562 assert(D->getDeclContext()->isFileContext());
1563 LexicalDC = D->getDeclContext();
1564 }
1565
1566 Function->setLexicalDeclContext(LexicalDC);
1567
1568 // Attach the parameters
1569 for (unsigned P = 0; P < Params.size(); ++P)
1570 if (Params[P])
1571 Params[P]->setOwningFunction(Function);
1572 Function->setParams(Params);
1573
1574 SourceLocation InstantiateAtPOI;
1575 if (TemplateParams) {
1576 // Our resulting instantiation is actually a function template, since we
1577 // are substituting only the outer template parameters. For example, given
1578 //
1579 // template<typename T>
1580 // struct X {
1581 // template<typename U> friend void f(T, U);
1582 // };
1583 //
1584 // X<int> x;
1585 //
1586 // We are instantiating the friend function template "f" within X<int>,
1587 // which means substituting int for T, but leaving "f" as a friend function
1588 // template.
1589 // Build the function template itself.
1590 FunctionTemplate = FunctionTemplateDecl::Create(SemaRef.Context, DC,
1591 Function->getLocation(),
1592 Function->getDeclName(),
1593 TemplateParams, Function);
1594 Function->setDescribedFunctionTemplate(FunctionTemplate);
1595
1596 FunctionTemplate->setLexicalDeclContext(LexicalDC);
1597
1598 if (isFriend && D->isThisDeclarationADefinition()) {
1599 // TODO: should we remember this connection regardless of whether
1600 // the friend declaration provided a body?
1601 FunctionTemplate->setInstantiatedFromMemberTemplate(
1602 D->getDescribedFunctionTemplate());
1603 }
1604 } else if (FunctionTemplate) {
1605 // Record this function template specialization.
1606 ArrayRef<TemplateArgument> Innermost = TemplateArgs.getInnermost();
1607 Function->setFunctionTemplateSpecialization(FunctionTemplate,
1608 TemplateArgumentList::CreateCopy(SemaRef.Context,
1609 Innermost),
1610 /*InsertPos=*/nullptr);
1611 } else if (isFriend) {
1612 // Note, we need this connection even if the friend doesn't have a body.
1613 // Its body may exist but not have been attached yet due to deferred
1614 // parsing.
1615 // FIXME: It might be cleaner to set this when attaching the body to the
1616 // friend function declaration, however that would require finding all the
1617 // instantiations and modifying them.
1618 Function->setInstantiationOfMemberFunction(D, TSK_ImplicitInstantiation);
1619 }
1620
1621 if (InitFunctionInstantiation(Function, D))
1622 Function->setInvalidDecl();
1623
1624 bool isExplicitSpecialization = false;
1625
1626 LookupResult Previous(
1627 SemaRef, Function->getDeclName(), SourceLocation(),
1628 D->isLocalExternDecl() ? Sema::LookupRedeclarationWithLinkage
1629 : Sema::LookupOrdinaryName,
1630 Sema::ForRedeclaration);
1631
1632 if (DependentFunctionTemplateSpecializationInfo *Info
1633 = D->getDependentSpecializationInfo()) {
1634 assert(isFriend && "non-friend has dependent specialization info?");
1635
1636 // This needs to be set now for future sanity.
1637 Function->setObjectOfFriendDecl();
1638
1639 // Instantiate the explicit template arguments.
1640 TemplateArgumentListInfo ExplicitArgs(Info->getLAngleLoc(),
1641 Info->getRAngleLoc());
1642 if (SemaRef.Subst(Info->getTemplateArgs(), Info->getNumTemplateArgs(),
1643 ExplicitArgs, TemplateArgs))
1644 return nullptr;
1645
1646 // Map the candidate templates to their instantiations.
1647 for (unsigned I = 0, E = Info->getNumTemplates(); I != E; ++I) {
1648 Decl *Temp = SemaRef.FindInstantiatedDecl(D->getLocation(),
1649 Info->getTemplate(I),
1650 TemplateArgs);
1651 if (!Temp) return nullptr;
1652
1653 Previous.addDecl(cast<FunctionTemplateDecl>(Temp));
1654 }
1655
1656 if (SemaRef.CheckFunctionTemplateSpecialization(Function,
1657 &ExplicitArgs,
1658 Previous))
1659 Function->setInvalidDecl();
1660
1661 isExplicitSpecialization = true;
1662
1663 } else if (TemplateParams || !FunctionTemplate) {
1664 // Look only into the namespace where the friend would be declared to
1665 // find a previous declaration. This is the innermost enclosing namespace,
1666 // as described in ActOnFriendFunctionDecl.
1667 SemaRef.LookupQualifiedName(Previous, DC);
1668
1669 // In C++, the previous declaration we find might be a tag type
1670 // (class or enum). In this case, the new declaration will hide the
1671 // tag type. Note that this does does not apply if we're declaring a
1672 // typedef (C++ [dcl.typedef]p4).
1673 if (Previous.isSingleTagDecl())
1674 Previous.clear();
1675 }
1676
1677 SemaRef.CheckFunctionDeclaration(/*Scope*/ nullptr, Function, Previous,
1678 isExplicitSpecialization);
1679
1680 NamedDecl *PrincipalDecl = (TemplateParams
1681 ? cast<NamedDecl>(FunctionTemplate)
1682 : Function);
1683
1684 // If the original function was part of a friend declaration,
1685 // inherit its namespace state and add it to the owner.
1686 if (isFriend) {
1687 PrincipalDecl->setObjectOfFriendDecl();
1688 DC->makeDeclVisibleInContext(PrincipalDecl);
1689
1690 bool QueuedInstantiation = false;
1691
1692 // C++11 [temp.friend]p4 (DR329):
1693 // When a function is defined in a friend function declaration in a class
1694 // template, the function is instantiated when the function is odr-used.
1695 // The same restrictions on multiple declarations and definitions that
1696 // apply to non-template function declarations and definitions also apply
1697 // to these implicit definitions.
1698 if (D->isThisDeclarationADefinition()) {
1699 // Check for a function body.
1700 const FunctionDecl *Definition = nullptr;
1701 if (Function->isDefined(Definition) &&
1702 Definition->getTemplateSpecializationKind() == TSK_Undeclared) {
1703 SemaRef.Diag(Function->getLocation(), diag::err_redefinition)
1704 << Function->getDeclName();
1705 SemaRef.Diag(Definition->getLocation(), diag::note_previous_definition);
1706 }
1707 // Check for redefinitions due to other instantiations of this or
1708 // a similar friend function.
1709 else for (auto R : Function->redecls()) {
1710 if (R == Function)
1711 continue;
1712
1713 // If some prior declaration of this function has been used, we need
1714 // to instantiate its definition.
1715 if (!QueuedInstantiation && R->isUsed(false)) {
1716 if (MemberSpecializationInfo *MSInfo =
1717 Function->getMemberSpecializationInfo()) {
1718 if (MSInfo->getPointOfInstantiation().isInvalid()) {
1719 SourceLocation Loc = R->getLocation(); // FIXME
1720 MSInfo->setPointOfInstantiation(Loc);
1721 SemaRef.PendingLocalImplicitInstantiations.push_back(
1722 std::make_pair(Function, Loc));
1723 QueuedInstantiation = true;
1724 }
1725 }
1726 }
1727
1728 // If some prior declaration of this function was a friend with an
1729 // uninstantiated definition, reject it.
1730 if (R->getFriendObjectKind()) {
1731 if (const FunctionDecl *RPattern =
1732 R->getTemplateInstantiationPattern()) {
1733 if (RPattern->isDefined(RPattern)) {
1734 SemaRef.Diag(Function->getLocation(), diag::err_redefinition)
1735 << Function->getDeclName();
1736 SemaRef.Diag(R->getLocation(), diag::note_previous_definition);
1737 break;
1738 }
1739 }
1740 }
1741 }
1742 }
1743 }
1744
1745 if (Function->isLocalExternDecl() && !Function->getPreviousDecl())
1746 DC->makeDeclVisibleInContext(PrincipalDecl);
1747
1748 if (Function->isOverloadedOperator() && !DC->isRecord() &&
1749 PrincipalDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary))
1750 PrincipalDecl->setNonMemberOperator();
1751
1752 assert(!D->isDefaulted() && "only methods should be defaulted");
1753 return Function;
1754 }
1755
1756 Decl *
VisitCXXMethodDecl(CXXMethodDecl * D,TemplateParameterList * TemplateParams,bool IsClassScopeSpecialization)1757 TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D,
1758 TemplateParameterList *TemplateParams,
1759 bool IsClassScopeSpecialization) {
1760 FunctionTemplateDecl *FunctionTemplate = D->getDescribedFunctionTemplate();
1761 if (FunctionTemplate && !TemplateParams) {
1762 // We are creating a function template specialization from a function
1763 // template. Check whether there is already a function template
1764 // specialization for this particular set of template arguments.
1765 ArrayRef<TemplateArgument> Innermost = TemplateArgs.getInnermost();
1766
1767 void *InsertPos = nullptr;
1768 FunctionDecl *SpecFunc
1769 = FunctionTemplate->findSpecialization(Innermost, InsertPos);
1770
1771 // If we already have a function template specialization, return it.
1772 if (SpecFunc)
1773 return SpecFunc;
1774 }
1775
1776 bool isFriend;
1777 if (FunctionTemplate)
1778 isFriend = (FunctionTemplate->getFriendObjectKind() != Decl::FOK_None);
1779 else
1780 isFriend = (D->getFriendObjectKind() != Decl::FOK_None);
1781
1782 bool MergeWithParentScope = (TemplateParams != nullptr) ||
1783 !(isa<Decl>(Owner) &&
1784 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
1785 LocalInstantiationScope Scope(SemaRef, MergeWithParentScope);
1786
1787 // Instantiate enclosing template arguments for friends.
1788 SmallVector<TemplateParameterList *, 4> TempParamLists;
1789 unsigned NumTempParamLists = 0;
1790 if (isFriend && (NumTempParamLists = D->getNumTemplateParameterLists())) {
1791 TempParamLists.resize(NumTempParamLists);
1792 for (unsigned I = 0; I != NumTempParamLists; ++I) {
1793 TemplateParameterList *TempParams = D->getTemplateParameterList(I);
1794 TemplateParameterList *InstParams = SubstTemplateParams(TempParams);
1795 if (!InstParams)
1796 return nullptr;
1797 TempParamLists[I] = InstParams;
1798 }
1799 }
1800
1801 SmallVector<ParmVarDecl *, 4> Params;
1802 TypeSourceInfo *TInfo = SubstFunctionType(D, Params);
1803 if (!TInfo)
1804 return nullptr;
1805 QualType T = adjustFunctionTypeForInstantiation(SemaRef.Context, D, TInfo);
1806
1807 NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc();
1808 if (QualifierLoc) {
1809 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
1810 TemplateArgs);
1811 if (!QualifierLoc)
1812 return nullptr;
1813 }
1814
1815 DeclContext *DC = Owner;
1816 if (isFriend) {
1817 if (QualifierLoc) {
1818 CXXScopeSpec SS;
1819 SS.Adopt(QualifierLoc);
1820 DC = SemaRef.computeDeclContext(SS);
1821
1822 if (DC && SemaRef.RequireCompleteDeclContext(SS, DC))
1823 return nullptr;
1824 } else {
1825 DC = SemaRef.FindInstantiatedContext(D->getLocation(),
1826 D->getDeclContext(),
1827 TemplateArgs);
1828 }
1829 if (!DC) return nullptr;
1830 }
1831
1832 // Build the instantiated method declaration.
1833 CXXRecordDecl *Record = cast<CXXRecordDecl>(DC);
1834 CXXMethodDecl *Method = nullptr;
1835
1836 SourceLocation StartLoc = D->getInnerLocStart();
1837 DeclarationNameInfo NameInfo
1838 = SemaRef.SubstDeclarationNameInfo(D->getNameInfo(), TemplateArgs);
1839 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) {
1840 Method = CXXConstructorDecl::Create(SemaRef.Context, Record,
1841 StartLoc, NameInfo, T, TInfo,
1842 Constructor->isExplicit(),
1843 Constructor->isInlineSpecified(),
1844 false, Constructor->isConstexpr());
1845 } else if (CXXDestructorDecl *Destructor = dyn_cast<CXXDestructorDecl>(D)) {
1846 Method = CXXDestructorDecl::Create(SemaRef.Context, Record,
1847 StartLoc, NameInfo, T, TInfo,
1848 Destructor->isInlineSpecified(),
1849 false);
1850 } else if (CXXConversionDecl *Conversion = dyn_cast<CXXConversionDecl>(D)) {
1851 Method = CXXConversionDecl::Create(SemaRef.Context, Record,
1852 StartLoc, NameInfo, T, TInfo,
1853 Conversion->isInlineSpecified(),
1854 Conversion->isExplicit(),
1855 Conversion->isConstexpr(),
1856 Conversion->getLocEnd());
1857 } else {
1858 StorageClass SC = D->isStatic() ? SC_Static : SC_None;
1859 Method = CXXMethodDecl::Create(SemaRef.Context, Record,
1860 StartLoc, NameInfo, T, TInfo,
1861 SC, D->isInlineSpecified(),
1862 D->isConstexpr(), D->getLocEnd());
1863 }
1864
1865 if (D->isInlined())
1866 Method->setImplicitlyInline();
1867
1868 if (QualifierLoc)
1869 Method->setQualifierInfo(QualifierLoc);
1870
1871 if (TemplateParams) {
1872 // Our resulting instantiation is actually a function template, since we
1873 // are substituting only the outer template parameters. For example, given
1874 //
1875 // template<typename T>
1876 // struct X {
1877 // template<typename U> void f(T, U);
1878 // };
1879 //
1880 // X<int> x;
1881 //
1882 // We are instantiating the member template "f" within X<int>, which means
1883 // substituting int for T, but leaving "f" as a member function template.
1884 // Build the function template itself.
1885 FunctionTemplate = FunctionTemplateDecl::Create(SemaRef.Context, Record,
1886 Method->getLocation(),
1887 Method->getDeclName(),
1888 TemplateParams, Method);
1889 if (isFriend) {
1890 FunctionTemplate->setLexicalDeclContext(Owner);
1891 FunctionTemplate->setObjectOfFriendDecl();
1892 } else if (D->isOutOfLine())
1893 FunctionTemplate->setLexicalDeclContext(D->getLexicalDeclContext());
1894 Method->setDescribedFunctionTemplate(FunctionTemplate);
1895 } else if (FunctionTemplate) {
1896 // Record this function template specialization.
1897 ArrayRef<TemplateArgument> Innermost = TemplateArgs.getInnermost();
1898 Method->setFunctionTemplateSpecialization(FunctionTemplate,
1899 TemplateArgumentList::CreateCopy(SemaRef.Context,
1900 Innermost),
1901 /*InsertPos=*/nullptr);
1902 } else if (!isFriend) {
1903 // Record that this is an instantiation of a member function.
1904 Method->setInstantiationOfMemberFunction(D, TSK_ImplicitInstantiation);
1905 }
1906
1907 // If we are instantiating a member function defined
1908 // out-of-line, the instantiation will have the same lexical
1909 // context (which will be a namespace scope) as the template.
1910 if (isFriend) {
1911 if (NumTempParamLists)
1912 Method->setTemplateParameterListsInfo(
1913 SemaRef.Context,
1914 llvm::makeArrayRef(TempParamLists.data(), NumTempParamLists));
1915
1916 Method->setLexicalDeclContext(Owner);
1917 Method->setObjectOfFriendDecl();
1918 } else if (D->isOutOfLine())
1919 Method->setLexicalDeclContext(D->getLexicalDeclContext());
1920
1921 // Attach the parameters
1922 for (unsigned P = 0; P < Params.size(); ++P)
1923 Params[P]->setOwningFunction(Method);
1924 Method->setParams(Params);
1925
1926 if (InitMethodInstantiation(Method, D))
1927 Method->setInvalidDecl();
1928
1929 LookupResult Previous(SemaRef, NameInfo, Sema::LookupOrdinaryName,
1930 Sema::ForRedeclaration);
1931
1932 if (!FunctionTemplate || TemplateParams || isFriend) {
1933 SemaRef.LookupQualifiedName(Previous, Record);
1934
1935 // In C++, the previous declaration we find might be a tag type
1936 // (class or enum). In this case, the new declaration will hide the
1937 // tag type. Note that this does does not apply if we're declaring a
1938 // typedef (C++ [dcl.typedef]p4).
1939 if (Previous.isSingleTagDecl())
1940 Previous.clear();
1941 }
1942
1943 if (!IsClassScopeSpecialization)
1944 SemaRef.CheckFunctionDeclaration(nullptr, Method, Previous, false);
1945
1946 if (D->isPure())
1947 SemaRef.CheckPureMethod(Method, SourceRange());
1948
1949 // Propagate access. For a non-friend declaration, the access is
1950 // whatever we're propagating from. For a friend, it should be the
1951 // previous declaration we just found.
1952 if (isFriend && Method->getPreviousDecl())
1953 Method->setAccess(Method->getPreviousDecl()->getAccess());
1954 else
1955 Method->setAccess(D->getAccess());
1956 if (FunctionTemplate)
1957 FunctionTemplate->setAccess(Method->getAccess());
1958
1959 SemaRef.CheckOverrideControl(Method);
1960
1961 // If a function is defined as defaulted or deleted, mark it as such now.
1962 if (D->isExplicitlyDefaulted())
1963 SemaRef.SetDeclDefaulted(Method, Method->getLocation());
1964 if (D->isDeletedAsWritten())
1965 SemaRef.SetDeclDeleted(Method, Method->getLocation());
1966
1967 // If there's a function template, let our caller handle it.
1968 if (FunctionTemplate) {
1969 // do nothing
1970
1971 // Don't hide a (potentially) valid declaration with an invalid one.
1972 } else if (Method->isInvalidDecl() && !Previous.empty()) {
1973 // do nothing
1974
1975 // Otherwise, check access to friends and make them visible.
1976 } else if (isFriend) {
1977 // We only need to re-check access for methods which we didn't
1978 // manage to match during parsing.
1979 if (!D->getPreviousDecl())
1980 SemaRef.CheckFriendAccess(Method);
1981
1982 Record->makeDeclVisibleInContext(Method);
1983
1984 // Otherwise, add the declaration. We don't need to do this for
1985 // class-scope specializations because we'll have matched them with
1986 // the appropriate template.
1987 } else if (!IsClassScopeSpecialization) {
1988 Owner->addDecl(Method);
1989 }
1990
1991 return Method;
1992 }
1993
VisitCXXConstructorDecl(CXXConstructorDecl * D)1994 Decl *TemplateDeclInstantiator::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
1995 return VisitCXXMethodDecl(D);
1996 }
1997
VisitCXXDestructorDecl(CXXDestructorDecl * D)1998 Decl *TemplateDeclInstantiator::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
1999 return VisitCXXMethodDecl(D);
2000 }
2001
VisitCXXConversionDecl(CXXConversionDecl * D)2002 Decl *TemplateDeclInstantiator::VisitCXXConversionDecl(CXXConversionDecl *D) {
2003 return VisitCXXMethodDecl(D);
2004 }
2005
VisitParmVarDecl(ParmVarDecl * D)2006 Decl *TemplateDeclInstantiator::VisitParmVarDecl(ParmVarDecl *D) {
2007 return SemaRef.SubstParmVarDecl(D, TemplateArgs, /*indexAdjustment*/ 0, None,
2008 /*ExpectParameterPack=*/ false);
2009 }
2010
VisitTemplateTypeParmDecl(TemplateTypeParmDecl * D)2011 Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl(
2012 TemplateTypeParmDecl *D) {
2013 // TODO: don't always clone when decls are refcounted.
2014 assert(D->getTypeForDecl()->isTemplateTypeParmType());
2015
2016 TemplateTypeParmDecl *Inst =
2017 TemplateTypeParmDecl::Create(SemaRef.Context, Owner,
2018 D->getLocStart(), D->getLocation(),
2019 D->getDepth() - TemplateArgs.getNumLevels(),
2020 D->getIndex(), D->getIdentifier(),
2021 D->wasDeclaredWithTypename(),
2022 D->isParameterPack());
2023 Inst->setAccess(AS_public);
2024
2025 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) {
2026 TypeSourceInfo *InstantiatedDefaultArg =
2027 SemaRef.SubstType(D->getDefaultArgumentInfo(), TemplateArgs,
2028 D->getDefaultArgumentLoc(), D->getDeclName());
2029 if (InstantiatedDefaultArg)
2030 Inst->setDefaultArgument(InstantiatedDefaultArg);
2031 }
2032
2033 // Introduce this template parameter's instantiation into the instantiation
2034 // scope.
2035 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Inst);
2036
2037 return Inst;
2038 }
2039
VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl * D)2040 Decl *TemplateDeclInstantiator::VisitNonTypeTemplateParmDecl(
2041 NonTypeTemplateParmDecl *D) {
2042 // Substitute into the type of the non-type template parameter.
2043 TypeLoc TL = D->getTypeSourceInfo()->getTypeLoc();
2044 SmallVector<TypeSourceInfo *, 4> ExpandedParameterPackTypesAsWritten;
2045 SmallVector<QualType, 4> ExpandedParameterPackTypes;
2046 bool IsExpandedParameterPack = false;
2047 TypeSourceInfo *DI;
2048 QualType T;
2049 bool Invalid = false;
2050
2051 if (D->isExpandedParameterPack()) {
2052 // The non-type template parameter pack is an already-expanded pack
2053 // expansion of types. Substitute into each of the expanded types.
2054 ExpandedParameterPackTypes.reserve(D->getNumExpansionTypes());
2055 ExpandedParameterPackTypesAsWritten.reserve(D->getNumExpansionTypes());
2056 for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) {
2057 TypeSourceInfo *NewDI =SemaRef.SubstType(D->getExpansionTypeSourceInfo(I),
2058 TemplateArgs,
2059 D->getLocation(),
2060 D->getDeclName());
2061 if (!NewDI)
2062 return nullptr;
2063
2064 ExpandedParameterPackTypesAsWritten.push_back(NewDI);
2065 QualType NewT =SemaRef.CheckNonTypeTemplateParameterType(NewDI->getType(),
2066 D->getLocation());
2067 if (NewT.isNull())
2068 return nullptr;
2069 ExpandedParameterPackTypes.push_back(NewT);
2070 }
2071
2072 IsExpandedParameterPack = true;
2073 DI = D->getTypeSourceInfo();
2074 T = DI->getType();
2075 } else if (D->isPackExpansion()) {
2076 // The non-type template parameter pack's type is a pack expansion of types.
2077 // Determine whether we need to expand this parameter pack into separate
2078 // types.
2079 PackExpansionTypeLoc Expansion = TL.castAs<PackExpansionTypeLoc>();
2080 TypeLoc Pattern = Expansion.getPatternLoc();
2081 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
2082 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
2083
2084 // Determine whether the set of unexpanded parameter packs can and should
2085 // be expanded.
2086 bool Expand = true;
2087 bool RetainExpansion = false;
2088 Optional<unsigned> OrigNumExpansions
2089 = Expansion.getTypePtr()->getNumExpansions();
2090 Optional<unsigned> NumExpansions = OrigNumExpansions;
2091 if (SemaRef.CheckParameterPacksForExpansion(Expansion.getEllipsisLoc(),
2092 Pattern.getSourceRange(),
2093 Unexpanded,
2094 TemplateArgs,
2095 Expand, RetainExpansion,
2096 NumExpansions))
2097 return nullptr;
2098
2099 if (Expand) {
2100 for (unsigned I = 0; I != *NumExpansions; ++I) {
2101 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
2102 TypeSourceInfo *NewDI = SemaRef.SubstType(Pattern, TemplateArgs,
2103 D->getLocation(),
2104 D->getDeclName());
2105 if (!NewDI)
2106 return nullptr;
2107
2108 ExpandedParameterPackTypesAsWritten.push_back(NewDI);
2109 QualType NewT = SemaRef.CheckNonTypeTemplateParameterType(
2110 NewDI->getType(),
2111 D->getLocation());
2112 if (NewT.isNull())
2113 return nullptr;
2114 ExpandedParameterPackTypes.push_back(NewT);
2115 }
2116
2117 // Note that we have an expanded parameter pack. The "type" of this
2118 // expanded parameter pack is the original expansion type, but callers
2119 // will end up using the expanded parameter pack types for type-checking.
2120 IsExpandedParameterPack = true;
2121 DI = D->getTypeSourceInfo();
2122 T = DI->getType();
2123 } else {
2124 // We cannot fully expand the pack expansion now, so substitute into the
2125 // pattern and create a new pack expansion type.
2126 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, -1);
2127 TypeSourceInfo *NewPattern = SemaRef.SubstType(Pattern, TemplateArgs,
2128 D->getLocation(),
2129 D->getDeclName());
2130 if (!NewPattern)
2131 return nullptr;
2132
2133 DI = SemaRef.CheckPackExpansion(NewPattern, Expansion.getEllipsisLoc(),
2134 NumExpansions);
2135 if (!DI)
2136 return nullptr;
2137
2138 T = DI->getType();
2139 }
2140 } else {
2141 // Simple case: substitution into a parameter that is not a parameter pack.
2142 DI = SemaRef.SubstType(D->getTypeSourceInfo(), TemplateArgs,
2143 D->getLocation(), D->getDeclName());
2144 if (!DI)
2145 return nullptr;
2146
2147 // Check that this type is acceptable for a non-type template parameter.
2148 T = SemaRef.CheckNonTypeTemplateParameterType(DI->getType(),
2149 D->getLocation());
2150 if (T.isNull()) {
2151 T = SemaRef.Context.IntTy;
2152 Invalid = true;
2153 }
2154 }
2155
2156 NonTypeTemplateParmDecl *Param;
2157 if (IsExpandedParameterPack)
2158 Param = NonTypeTemplateParmDecl::Create(
2159 SemaRef.Context, Owner, D->getInnerLocStart(), D->getLocation(),
2160 D->getDepth() - TemplateArgs.getNumLevels(), D->getPosition(),
2161 D->getIdentifier(), T, DI, ExpandedParameterPackTypes,
2162 ExpandedParameterPackTypesAsWritten);
2163 else
2164 Param = NonTypeTemplateParmDecl::Create(SemaRef.Context, Owner,
2165 D->getInnerLocStart(),
2166 D->getLocation(),
2167 D->getDepth() - TemplateArgs.getNumLevels(),
2168 D->getPosition(),
2169 D->getIdentifier(), T,
2170 D->isParameterPack(), DI);
2171
2172 Param->setAccess(AS_public);
2173 if (Invalid)
2174 Param->setInvalidDecl();
2175
2176 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) {
2177 EnterExpressionEvaluationContext ConstantEvaluated(SemaRef,
2178 Sema::ConstantEvaluated);
2179 ExprResult Value = SemaRef.SubstExpr(D->getDefaultArgument(), TemplateArgs);
2180 if (!Value.isInvalid())
2181 Param->setDefaultArgument(Value.get());
2182 }
2183
2184 // Introduce this template parameter's instantiation into the instantiation
2185 // scope.
2186 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param);
2187 return Param;
2188 }
2189
collectUnexpandedParameterPacks(Sema & S,TemplateParameterList * Params,SmallVectorImpl<UnexpandedParameterPack> & Unexpanded)2190 static void collectUnexpandedParameterPacks(
2191 Sema &S,
2192 TemplateParameterList *Params,
2193 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
2194 for (const auto &P : *Params) {
2195 if (P->isTemplateParameterPack())
2196 continue;
2197 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P))
2198 S.collectUnexpandedParameterPacks(NTTP->getTypeSourceInfo()->getTypeLoc(),
2199 Unexpanded);
2200 if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(P))
2201 collectUnexpandedParameterPacks(S, TTP->getTemplateParameters(),
2202 Unexpanded);
2203 }
2204 }
2205
2206 Decl *
VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl * D)2207 TemplateDeclInstantiator::VisitTemplateTemplateParmDecl(
2208 TemplateTemplateParmDecl *D) {
2209 // Instantiate the template parameter list of the template template parameter.
2210 TemplateParameterList *TempParams = D->getTemplateParameters();
2211 TemplateParameterList *InstParams;
2212 SmallVector<TemplateParameterList*, 8> ExpandedParams;
2213
2214 bool IsExpandedParameterPack = false;
2215
2216 if (D->isExpandedParameterPack()) {
2217 // The template template parameter pack is an already-expanded pack
2218 // expansion of template parameters. Substitute into each of the expanded
2219 // parameters.
2220 ExpandedParams.reserve(D->getNumExpansionTemplateParameters());
2221 for (unsigned I = 0, N = D->getNumExpansionTemplateParameters();
2222 I != N; ++I) {
2223 LocalInstantiationScope Scope(SemaRef);
2224 TemplateParameterList *Expansion =
2225 SubstTemplateParams(D->getExpansionTemplateParameters(I));
2226 if (!Expansion)
2227 return nullptr;
2228 ExpandedParams.push_back(Expansion);
2229 }
2230
2231 IsExpandedParameterPack = true;
2232 InstParams = TempParams;
2233 } else if (D->isPackExpansion()) {
2234 // The template template parameter pack expands to a pack of template
2235 // template parameters. Determine whether we need to expand this parameter
2236 // pack into separate parameters.
2237 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
2238 collectUnexpandedParameterPacks(SemaRef, D->getTemplateParameters(),
2239 Unexpanded);
2240
2241 // Determine whether the set of unexpanded parameter packs can and should
2242 // be expanded.
2243 bool Expand = true;
2244 bool RetainExpansion = false;
2245 Optional<unsigned> NumExpansions;
2246 if (SemaRef.CheckParameterPacksForExpansion(D->getLocation(),
2247 TempParams->getSourceRange(),
2248 Unexpanded,
2249 TemplateArgs,
2250 Expand, RetainExpansion,
2251 NumExpansions))
2252 return nullptr;
2253
2254 if (Expand) {
2255 for (unsigned I = 0; I != *NumExpansions; ++I) {
2256 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
2257 LocalInstantiationScope Scope(SemaRef);
2258 TemplateParameterList *Expansion = SubstTemplateParams(TempParams);
2259 if (!Expansion)
2260 return nullptr;
2261 ExpandedParams.push_back(Expansion);
2262 }
2263
2264 // Note that we have an expanded parameter pack. The "type" of this
2265 // expanded parameter pack is the original expansion type, but callers
2266 // will end up using the expanded parameter pack types for type-checking.
2267 IsExpandedParameterPack = true;
2268 InstParams = TempParams;
2269 } else {
2270 // We cannot fully expand the pack expansion now, so just substitute
2271 // into the pattern.
2272 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, -1);
2273
2274 LocalInstantiationScope Scope(SemaRef);
2275 InstParams = SubstTemplateParams(TempParams);
2276 if (!InstParams)
2277 return nullptr;
2278 }
2279 } else {
2280 // Perform the actual substitution of template parameters within a new,
2281 // local instantiation scope.
2282 LocalInstantiationScope Scope(SemaRef);
2283 InstParams = SubstTemplateParams(TempParams);
2284 if (!InstParams)
2285 return nullptr;
2286 }
2287
2288 // Build the template template parameter.
2289 TemplateTemplateParmDecl *Param;
2290 if (IsExpandedParameterPack)
2291 Param = TemplateTemplateParmDecl::Create(SemaRef.Context, Owner,
2292 D->getLocation(),
2293 D->getDepth() - TemplateArgs.getNumLevels(),
2294 D->getPosition(),
2295 D->getIdentifier(), InstParams,
2296 ExpandedParams);
2297 else
2298 Param = TemplateTemplateParmDecl::Create(SemaRef.Context, Owner,
2299 D->getLocation(),
2300 D->getDepth() - TemplateArgs.getNumLevels(),
2301 D->getPosition(),
2302 D->isParameterPack(),
2303 D->getIdentifier(), InstParams);
2304 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) {
2305 NestedNameSpecifierLoc QualifierLoc =
2306 D->getDefaultArgument().getTemplateQualifierLoc();
2307 QualifierLoc =
2308 SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc, TemplateArgs);
2309 TemplateName TName = SemaRef.SubstTemplateName(
2310 QualifierLoc, D->getDefaultArgument().getArgument().getAsTemplate(),
2311 D->getDefaultArgument().getTemplateNameLoc(), TemplateArgs);
2312 if (!TName.isNull())
2313 Param->setDefaultArgument(
2314 SemaRef.Context,
2315 TemplateArgumentLoc(TemplateArgument(TName),
2316 D->getDefaultArgument().getTemplateQualifierLoc(),
2317 D->getDefaultArgument().getTemplateNameLoc()));
2318 }
2319 Param->setAccess(AS_public);
2320
2321 // Introduce this template parameter's instantiation into the instantiation
2322 // scope.
2323 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param);
2324
2325 return Param;
2326 }
2327
VisitUsingDirectiveDecl(UsingDirectiveDecl * D)2328 Decl *TemplateDeclInstantiator::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
2329 // Using directives are never dependent (and never contain any types or
2330 // expressions), so they require no explicit instantiation work.
2331
2332 UsingDirectiveDecl *Inst
2333 = UsingDirectiveDecl::Create(SemaRef.Context, Owner, D->getLocation(),
2334 D->getNamespaceKeyLocation(),
2335 D->getQualifierLoc(),
2336 D->getIdentLocation(),
2337 D->getNominatedNamespace(),
2338 D->getCommonAncestor());
2339
2340 // Add the using directive to its declaration context
2341 // only if this is not a function or method.
2342 if (!Owner->isFunctionOrMethod())
2343 Owner->addDecl(Inst);
2344
2345 return Inst;
2346 }
2347
VisitUsingDecl(UsingDecl * D)2348 Decl *TemplateDeclInstantiator::VisitUsingDecl(UsingDecl *D) {
2349
2350 // The nested name specifier may be dependent, for example
2351 // template <typename T> struct t {
2352 // struct s1 { T f1(); };
2353 // struct s2 : s1 { using s1::f1; };
2354 // };
2355 // template struct t<int>;
2356 // Here, in using s1::f1, s1 refers to t<T>::s1;
2357 // we need to substitute for t<int>::s1.
2358 NestedNameSpecifierLoc QualifierLoc
2359 = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(),
2360 TemplateArgs);
2361 if (!QualifierLoc)
2362 return nullptr;
2363
2364 // For an inheriting constructor declaration, the name of the using
2365 // declaration is the name of a constructor in this class, not in the
2366 // base class.
2367 DeclarationNameInfo NameInfo = D->getNameInfo();
2368 if (NameInfo.getName().getNameKind() == DeclarationName::CXXConstructorName)
2369 if (auto *RD = dyn_cast<CXXRecordDecl>(SemaRef.CurContext))
2370 NameInfo.setName(SemaRef.Context.DeclarationNames.getCXXConstructorName(
2371 SemaRef.Context.getCanonicalType(SemaRef.Context.getRecordType(RD))));
2372
2373 // We only need to do redeclaration lookups if we're in a class
2374 // scope (in fact, it's not really even possible in non-class
2375 // scopes).
2376 bool CheckRedeclaration = Owner->isRecord();
2377
2378 LookupResult Prev(SemaRef, NameInfo, Sema::LookupUsingDeclName,
2379 Sema::ForRedeclaration);
2380
2381 UsingDecl *NewUD = UsingDecl::Create(SemaRef.Context, Owner,
2382 D->getUsingLoc(),
2383 QualifierLoc,
2384 NameInfo,
2385 D->hasTypename());
2386
2387 CXXScopeSpec SS;
2388 SS.Adopt(QualifierLoc);
2389 if (CheckRedeclaration) {
2390 Prev.setHideTags(false);
2391 SemaRef.LookupQualifiedName(Prev, Owner);
2392
2393 // Check for invalid redeclarations.
2394 if (SemaRef.CheckUsingDeclRedeclaration(D->getUsingLoc(),
2395 D->hasTypename(), SS,
2396 D->getLocation(), Prev))
2397 NewUD->setInvalidDecl();
2398
2399 }
2400
2401 if (!NewUD->isInvalidDecl() &&
2402 SemaRef.CheckUsingDeclQualifier(D->getUsingLoc(), SS, NameInfo,
2403 D->getLocation()))
2404 NewUD->setInvalidDecl();
2405
2406 SemaRef.Context.setInstantiatedFromUsingDecl(NewUD, D);
2407 NewUD->setAccess(D->getAccess());
2408 Owner->addDecl(NewUD);
2409
2410 // Don't process the shadow decls for an invalid decl.
2411 if (NewUD->isInvalidDecl())
2412 return NewUD;
2413
2414 if (NameInfo.getName().getNameKind() == DeclarationName::CXXConstructorName)
2415 SemaRef.CheckInheritingConstructorUsingDecl(NewUD);
2416
2417 bool isFunctionScope = Owner->isFunctionOrMethod();
2418
2419 // Process the shadow decls.
2420 for (auto *Shadow : D->shadows()) {
2421 // FIXME: UsingShadowDecl doesn't preserve its immediate target, so
2422 // reconstruct it in the case where it matters.
2423 NamedDecl *OldTarget = Shadow->getTargetDecl();
2424 if (auto *CUSD = dyn_cast<ConstructorUsingShadowDecl>(Shadow))
2425 if (auto *BaseShadow = CUSD->getNominatedBaseClassShadowDecl())
2426 OldTarget = BaseShadow;
2427
2428 NamedDecl *InstTarget =
2429 cast_or_null<NamedDecl>(SemaRef.FindInstantiatedDecl(
2430 Shadow->getLocation(), OldTarget, TemplateArgs));
2431 if (!InstTarget)
2432 return nullptr;
2433
2434 UsingShadowDecl *PrevDecl = nullptr;
2435 if (CheckRedeclaration) {
2436 if (SemaRef.CheckUsingShadowDecl(NewUD, InstTarget, Prev, PrevDecl))
2437 continue;
2438 } else if (UsingShadowDecl *OldPrev =
2439 getPreviousDeclForInstantiation(Shadow)) {
2440 PrevDecl = cast_or_null<UsingShadowDecl>(SemaRef.FindInstantiatedDecl(
2441 Shadow->getLocation(), OldPrev, TemplateArgs));
2442 }
2443
2444 UsingShadowDecl *InstShadow =
2445 SemaRef.BuildUsingShadowDecl(/*Scope*/nullptr, NewUD, InstTarget,
2446 PrevDecl);
2447 SemaRef.Context.setInstantiatedFromUsingShadowDecl(InstShadow, Shadow);
2448
2449 if (isFunctionScope)
2450 SemaRef.CurrentInstantiationScope->InstantiatedLocal(Shadow, InstShadow);
2451 }
2452
2453 return NewUD;
2454 }
2455
VisitUsingShadowDecl(UsingShadowDecl * D)2456 Decl *TemplateDeclInstantiator::VisitUsingShadowDecl(UsingShadowDecl *D) {
2457 // Ignore these; we handle them in bulk when processing the UsingDecl.
2458 return nullptr;
2459 }
2460
VisitConstructorUsingShadowDecl(ConstructorUsingShadowDecl * D)2461 Decl *TemplateDeclInstantiator::VisitConstructorUsingShadowDecl(
2462 ConstructorUsingShadowDecl *D) {
2463 // Ignore these; we handle them in bulk when processing the UsingDecl.
2464 return nullptr;
2465 }
2466
2467 Decl * TemplateDeclInstantiator
VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl * D)2468 ::VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D) {
2469 NestedNameSpecifierLoc QualifierLoc
2470 = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(),
2471 TemplateArgs);
2472 if (!QualifierLoc)
2473 return nullptr;
2474
2475 CXXScopeSpec SS;
2476 SS.Adopt(QualifierLoc);
2477
2478 // Since NameInfo refers to a typename, it cannot be a C++ special name.
2479 // Hence, no transformation is required for it.
2480 DeclarationNameInfo NameInfo(D->getDeclName(), D->getLocation());
2481 NamedDecl *UD =
2482 SemaRef.BuildUsingDeclaration(/*Scope*/ nullptr, D->getAccess(),
2483 D->getUsingLoc(), SS, NameInfo, nullptr,
2484 /*instantiation*/ true,
2485 /*typename*/ true, D->getTypenameLoc());
2486 if (UD)
2487 SemaRef.Context.setInstantiatedFromUsingDecl(cast<UsingDecl>(UD), D);
2488
2489 return UD;
2490 }
2491
2492 Decl * TemplateDeclInstantiator
VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl * D)2493 ::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
2494 NestedNameSpecifierLoc QualifierLoc
2495 = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(), TemplateArgs);
2496 if (!QualifierLoc)
2497 return nullptr;
2498
2499 CXXScopeSpec SS;
2500 SS.Adopt(QualifierLoc);
2501
2502 DeclarationNameInfo NameInfo
2503 = SemaRef.SubstDeclarationNameInfo(D->getNameInfo(), TemplateArgs);
2504
2505 NamedDecl *UD =
2506 SemaRef.BuildUsingDeclaration(/*Scope*/ nullptr, D->getAccess(),
2507 D->getUsingLoc(), SS, NameInfo, nullptr,
2508 /*instantiation*/ true,
2509 /*typename*/ false, SourceLocation());
2510 if (UD)
2511 SemaRef.Context.setInstantiatedFromUsingDecl(cast<UsingDecl>(UD), D);
2512
2513 return UD;
2514 }
2515
2516
VisitClassScopeFunctionSpecializationDecl(ClassScopeFunctionSpecializationDecl * Decl)2517 Decl *TemplateDeclInstantiator::VisitClassScopeFunctionSpecializationDecl(
2518 ClassScopeFunctionSpecializationDecl *Decl) {
2519 CXXMethodDecl *OldFD = Decl->getSpecialization();
2520 CXXMethodDecl *NewFD =
2521 cast_or_null<CXXMethodDecl>(VisitCXXMethodDecl(OldFD, nullptr, true));
2522 if (!NewFD)
2523 return nullptr;
2524
2525 LookupResult Previous(SemaRef, NewFD->getNameInfo(), Sema::LookupOrdinaryName,
2526 Sema::ForRedeclaration);
2527
2528 TemplateArgumentListInfo TemplateArgs;
2529 TemplateArgumentListInfo *TemplateArgsPtr = nullptr;
2530 if (Decl->hasExplicitTemplateArgs()) {
2531 TemplateArgs = Decl->templateArgs();
2532 TemplateArgsPtr = &TemplateArgs;
2533 }
2534
2535 SemaRef.LookupQualifiedName(Previous, SemaRef.CurContext);
2536 if (SemaRef.CheckFunctionTemplateSpecialization(NewFD, TemplateArgsPtr,
2537 Previous)) {
2538 NewFD->setInvalidDecl();
2539 return NewFD;
2540 }
2541
2542 // Associate the specialization with the pattern.
2543 FunctionDecl *Specialization = cast<FunctionDecl>(Previous.getFoundDecl());
2544 assert(Specialization && "Class scope Specialization is null");
2545 SemaRef.Context.setClassScopeSpecializationPattern(Specialization, OldFD);
2546
2547 return NewFD;
2548 }
2549
VisitOMPThreadPrivateDecl(OMPThreadPrivateDecl * D)2550 Decl *TemplateDeclInstantiator::VisitOMPThreadPrivateDecl(
2551 OMPThreadPrivateDecl *D) {
2552 SmallVector<Expr *, 5> Vars;
2553 for (auto *I : D->varlists()) {
2554 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
2555 assert(isa<DeclRefExpr>(Var) && "threadprivate arg is not a DeclRefExpr");
2556 Vars.push_back(Var);
2557 }
2558
2559 OMPThreadPrivateDecl *TD =
2560 SemaRef.CheckOMPThreadPrivateDecl(D->getLocation(), Vars);
2561
2562 TD->setAccess(AS_public);
2563 Owner->addDecl(TD);
2564
2565 return TD;
2566 }
2567
VisitOMPDeclareReductionDecl(OMPDeclareReductionDecl * D)2568 Decl *TemplateDeclInstantiator::VisitOMPDeclareReductionDecl(
2569 OMPDeclareReductionDecl *D) {
2570 // Instantiate type and check if it is allowed.
2571 QualType SubstReductionType = SemaRef.ActOnOpenMPDeclareReductionType(
2572 D->getLocation(),
2573 ParsedType::make(SemaRef.SubstType(D->getType(), TemplateArgs,
2574 D->getLocation(), DeclarationName())));
2575 if (SubstReductionType.isNull())
2576 return nullptr;
2577 bool IsCorrect = !SubstReductionType.isNull();
2578 // Create instantiated copy.
2579 std::pair<QualType, SourceLocation> ReductionTypes[] = {
2580 std::make_pair(SubstReductionType, D->getLocation())};
2581 auto *PrevDeclInScope = D->getPrevDeclInScope();
2582 if (PrevDeclInScope && !PrevDeclInScope->isInvalidDecl()) {
2583 PrevDeclInScope = cast<OMPDeclareReductionDecl>(
2584 SemaRef.CurrentInstantiationScope->findInstantiationOf(PrevDeclInScope)
2585 ->get<Decl *>());
2586 }
2587 auto DRD = SemaRef.ActOnOpenMPDeclareReductionDirectiveStart(
2588 /*S=*/nullptr, Owner, D->getDeclName(), ReductionTypes, D->getAccess(),
2589 PrevDeclInScope);
2590 auto *NewDRD = cast<OMPDeclareReductionDecl>(DRD.get().getSingleDecl());
2591 if (isDeclWithinFunction(NewDRD))
2592 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewDRD);
2593 Expr *SubstCombiner = nullptr;
2594 Expr *SubstInitializer = nullptr;
2595 // Combiners instantiation sequence.
2596 if (D->getCombiner()) {
2597 SemaRef.ActOnOpenMPDeclareReductionCombinerStart(
2598 /*S=*/nullptr, NewDRD);
2599 const char *Names[] = {"omp_in", "omp_out"};
2600 for (auto &Name : Names) {
2601 DeclarationName DN(&SemaRef.Context.Idents.get(Name));
2602 auto OldLookup = D->lookup(DN);
2603 auto Lookup = NewDRD->lookup(DN);
2604 if (!OldLookup.empty() && !Lookup.empty()) {
2605 assert(Lookup.size() == 1 && OldLookup.size() == 1);
2606 SemaRef.CurrentInstantiationScope->InstantiatedLocal(OldLookup.front(),
2607 Lookup.front());
2608 }
2609 }
2610 SubstCombiner = SemaRef.SubstExpr(D->getCombiner(), TemplateArgs).get();
2611 SemaRef.ActOnOpenMPDeclareReductionCombinerEnd(NewDRD, SubstCombiner);
2612 // Initializers instantiation sequence.
2613 if (D->getInitializer()) {
2614 SemaRef.ActOnOpenMPDeclareReductionInitializerStart(
2615 /*S=*/nullptr, NewDRD);
2616 const char *Names[] = {"omp_orig", "omp_priv"};
2617 for (auto &Name : Names) {
2618 DeclarationName DN(&SemaRef.Context.Idents.get(Name));
2619 auto OldLookup = D->lookup(DN);
2620 auto Lookup = NewDRD->lookup(DN);
2621 if (!OldLookup.empty() && !Lookup.empty()) {
2622 assert(Lookup.size() == 1 && OldLookup.size() == 1);
2623 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
2624 OldLookup.front(), Lookup.front());
2625 }
2626 }
2627 SubstInitializer =
2628 SemaRef.SubstExpr(D->getInitializer(), TemplateArgs).get();
2629 SemaRef.ActOnOpenMPDeclareReductionInitializerEnd(NewDRD,
2630 SubstInitializer);
2631 }
2632 IsCorrect = IsCorrect && SubstCombiner &&
2633 (!D->getInitializer() || SubstInitializer);
2634 } else
2635 IsCorrect = false;
2636
2637 (void)SemaRef.ActOnOpenMPDeclareReductionDirectiveEnd(/*S=*/nullptr, DRD,
2638 IsCorrect);
2639
2640 return NewDRD;
2641 }
2642
VisitOMPCapturedExprDecl(OMPCapturedExprDecl *)2643 Decl *TemplateDeclInstantiator::VisitOMPCapturedExprDecl(
2644 OMPCapturedExprDecl * /*D*/) {
2645 llvm_unreachable("Should not be met in templates");
2646 }
2647
VisitFunctionDecl(FunctionDecl * D)2648 Decl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D) {
2649 return VisitFunctionDecl(D, nullptr);
2650 }
2651
VisitCXXMethodDecl(CXXMethodDecl * D)2652 Decl *TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D) {
2653 return VisitCXXMethodDecl(D, nullptr);
2654 }
2655
VisitRecordDecl(RecordDecl * D)2656 Decl *TemplateDeclInstantiator::VisitRecordDecl(RecordDecl *D) {
2657 llvm_unreachable("There are only CXXRecordDecls in C++");
2658 }
2659
2660 Decl *
VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl * D)2661 TemplateDeclInstantiator::VisitClassTemplateSpecializationDecl(
2662 ClassTemplateSpecializationDecl *D) {
2663 // As a MS extension, we permit class-scope explicit specialization
2664 // of member class templates.
2665 ClassTemplateDecl *ClassTemplate = D->getSpecializedTemplate();
2666 assert(ClassTemplate->getDeclContext()->isRecord() &&
2667 D->getTemplateSpecializationKind() == TSK_ExplicitSpecialization &&
2668 "can only instantiate an explicit specialization "
2669 "for a member class template");
2670
2671 // Lookup the already-instantiated declaration in the instantiation
2672 // of the class template. FIXME: Diagnose or assert if this fails?
2673 DeclContext::lookup_result Found
2674 = Owner->lookup(ClassTemplate->getDeclName());
2675 if (Found.empty())
2676 return nullptr;
2677 ClassTemplateDecl *InstClassTemplate
2678 = dyn_cast<ClassTemplateDecl>(Found.front());
2679 if (!InstClassTemplate)
2680 return nullptr;
2681
2682 // Substitute into the template arguments of the class template explicit
2683 // specialization.
2684 TemplateSpecializationTypeLoc Loc = D->getTypeAsWritten()->getTypeLoc().
2685 castAs<TemplateSpecializationTypeLoc>();
2686 TemplateArgumentListInfo InstTemplateArgs(Loc.getLAngleLoc(),
2687 Loc.getRAngleLoc());
2688 SmallVector<TemplateArgumentLoc, 4> ArgLocs;
2689 for (unsigned I = 0; I != Loc.getNumArgs(); ++I)
2690 ArgLocs.push_back(Loc.getArgLoc(I));
2691 if (SemaRef.Subst(ArgLocs.data(), ArgLocs.size(),
2692 InstTemplateArgs, TemplateArgs))
2693 return nullptr;
2694
2695 // Check that the template argument list is well-formed for this
2696 // class template.
2697 SmallVector<TemplateArgument, 4> Converted;
2698 if (SemaRef.CheckTemplateArgumentList(InstClassTemplate,
2699 D->getLocation(),
2700 InstTemplateArgs,
2701 false,
2702 Converted))
2703 return nullptr;
2704
2705 // Figure out where to insert this class template explicit specialization
2706 // in the member template's set of class template explicit specializations.
2707 void *InsertPos = nullptr;
2708 ClassTemplateSpecializationDecl *PrevDecl =
2709 InstClassTemplate->findSpecialization(Converted, InsertPos);
2710
2711 // Check whether we've already seen a conflicting instantiation of this
2712 // declaration (for instance, if there was a prior implicit instantiation).
2713 bool Ignored;
2714 if (PrevDecl &&
2715 SemaRef.CheckSpecializationInstantiationRedecl(D->getLocation(),
2716 D->getSpecializationKind(),
2717 PrevDecl,
2718 PrevDecl->getSpecializationKind(),
2719 PrevDecl->getPointOfInstantiation(),
2720 Ignored))
2721 return nullptr;
2722
2723 // If PrevDecl was a definition and D is also a definition, diagnose.
2724 // This happens in cases like:
2725 //
2726 // template<typename T, typename U>
2727 // struct Outer {
2728 // template<typename X> struct Inner;
2729 // template<> struct Inner<T> {};
2730 // template<> struct Inner<U> {};
2731 // };
2732 //
2733 // Outer<int, int> outer; // error: the explicit specializations of Inner
2734 // // have the same signature.
2735 if (PrevDecl && PrevDecl->getDefinition() &&
2736 D->isThisDeclarationADefinition()) {
2737 SemaRef.Diag(D->getLocation(), diag::err_redefinition) << PrevDecl;
2738 SemaRef.Diag(PrevDecl->getDefinition()->getLocation(),
2739 diag::note_previous_definition);
2740 return nullptr;
2741 }
2742
2743 // Create the class template partial specialization declaration.
2744 ClassTemplateSpecializationDecl *InstD
2745 = ClassTemplateSpecializationDecl::Create(SemaRef.Context,
2746 D->getTagKind(),
2747 Owner,
2748 D->getLocStart(),
2749 D->getLocation(),
2750 InstClassTemplate,
2751 Converted,
2752 PrevDecl);
2753
2754 // Add this partial specialization to the set of class template partial
2755 // specializations.
2756 if (!PrevDecl)
2757 InstClassTemplate->AddSpecialization(InstD, InsertPos);
2758
2759 // Substitute the nested name specifier, if any.
2760 if (SubstQualifier(D, InstD))
2761 return nullptr;
2762
2763 // Build the canonical type that describes the converted template
2764 // arguments of the class template explicit specialization.
2765 QualType CanonType = SemaRef.Context.getTemplateSpecializationType(
2766 TemplateName(InstClassTemplate), Converted,
2767 SemaRef.Context.getRecordType(InstD));
2768
2769 // Build the fully-sugared type for this class template
2770 // specialization as the user wrote in the specialization
2771 // itself. This means that we'll pretty-print the type retrieved
2772 // from the specialization's declaration the way that the user
2773 // actually wrote the specialization, rather than formatting the
2774 // name based on the "canonical" representation used to store the
2775 // template arguments in the specialization.
2776 TypeSourceInfo *WrittenTy = SemaRef.Context.getTemplateSpecializationTypeInfo(
2777 TemplateName(InstClassTemplate), D->getLocation(), InstTemplateArgs,
2778 CanonType);
2779
2780 InstD->setAccess(D->getAccess());
2781 InstD->setInstantiationOfMemberClass(D, TSK_ImplicitInstantiation);
2782 InstD->setSpecializationKind(D->getSpecializationKind());
2783 InstD->setTypeAsWritten(WrittenTy);
2784 InstD->setExternLoc(D->getExternLoc());
2785 InstD->setTemplateKeywordLoc(D->getTemplateKeywordLoc());
2786
2787 Owner->addDecl(InstD);
2788
2789 // Instantiate the members of the class-scope explicit specialization eagerly.
2790 // We don't have support for lazy instantiation of an explicit specialization
2791 // yet, and MSVC eagerly instantiates in this case.
2792 if (D->isThisDeclarationADefinition() &&
2793 SemaRef.InstantiateClass(D->getLocation(), InstD, D, TemplateArgs,
2794 TSK_ImplicitInstantiation,
2795 /*Complain=*/true))
2796 return nullptr;
2797
2798 return InstD;
2799 }
2800
VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl * D)2801 Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl(
2802 VarTemplateSpecializationDecl *D) {
2803
2804 TemplateArgumentListInfo VarTemplateArgsInfo;
2805 VarTemplateDecl *VarTemplate = D->getSpecializedTemplate();
2806 assert(VarTemplate &&
2807 "A template specialization without specialized template?");
2808
2809 // Substitute the current template arguments.
2810 const TemplateArgumentListInfo &TemplateArgsInfo = D->getTemplateArgsInfo();
2811 VarTemplateArgsInfo.setLAngleLoc(TemplateArgsInfo.getLAngleLoc());
2812 VarTemplateArgsInfo.setRAngleLoc(TemplateArgsInfo.getRAngleLoc());
2813
2814 if (SemaRef.Subst(TemplateArgsInfo.getArgumentArray(),
2815 TemplateArgsInfo.size(), VarTemplateArgsInfo, TemplateArgs))
2816 return nullptr;
2817
2818 // Check that the template argument list is well-formed for this template.
2819 SmallVector<TemplateArgument, 4> Converted;
2820 if (SemaRef.CheckTemplateArgumentList(
2821 VarTemplate, VarTemplate->getLocStart(),
2822 const_cast<TemplateArgumentListInfo &>(VarTemplateArgsInfo), false,
2823 Converted))
2824 return nullptr;
2825
2826 // Find the variable template specialization declaration that
2827 // corresponds to these arguments.
2828 void *InsertPos = nullptr;
2829 if (VarTemplateSpecializationDecl *VarSpec = VarTemplate->findSpecialization(
2830 Converted, InsertPos))
2831 // If we already have a variable template specialization, return it.
2832 return VarSpec;
2833
2834 return VisitVarTemplateSpecializationDecl(VarTemplate, D, InsertPos,
2835 VarTemplateArgsInfo, Converted);
2836 }
2837
VisitVarTemplateSpecializationDecl(VarTemplateDecl * VarTemplate,VarDecl * D,void * InsertPos,const TemplateArgumentListInfo & TemplateArgsInfo,ArrayRef<TemplateArgument> Converted)2838 Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl(
2839 VarTemplateDecl *VarTemplate, VarDecl *D, void *InsertPos,
2840 const TemplateArgumentListInfo &TemplateArgsInfo,
2841 ArrayRef<TemplateArgument> Converted) {
2842
2843 // Do substitution on the type of the declaration
2844 TypeSourceInfo *DI =
2845 SemaRef.SubstType(D->getTypeSourceInfo(), TemplateArgs,
2846 D->getTypeSpecStartLoc(), D->getDeclName());
2847 if (!DI)
2848 return nullptr;
2849
2850 if (DI->getType()->isFunctionType()) {
2851 SemaRef.Diag(D->getLocation(), diag::err_variable_instantiates_to_function)
2852 << D->isStaticDataMember() << DI->getType();
2853 return nullptr;
2854 }
2855
2856 // Build the instantiated declaration
2857 VarTemplateSpecializationDecl *Var = VarTemplateSpecializationDecl::Create(
2858 SemaRef.Context, Owner, D->getInnerLocStart(), D->getLocation(),
2859 VarTemplate, DI->getType(), DI, D->getStorageClass(), Converted);
2860 Var->setTemplateArgsInfo(TemplateArgsInfo);
2861 if (InsertPos)
2862 VarTemplate->AddSpecialization(Var, InsertPos);
2863
2864 // Substitute the nested name specifier, if any.
2865 if (SubstQualifier(D, Var))
2866 return nullptr;
2867
2868 SemaRef.BuildVariableInstantiation(Var, D, TemplateArgs, LateAttrs,
2869 Owner, StartingScope);
2870
2871 return Var;
2872 }
2873
VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl * D)2874 Decl *TemplateDeclInstantiator::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D) {
2875 llvm_unreachable("@defs is not supported in Objective-C++");
2876 }
2877
VisitFriendTemplateDecl(FriendTemplateDecl * D)2878 Decl *TemplateDeclInstantiator::VisitFriendTemplateDecl(FriendTemplateDecl *D) {
2879 // FIXME: We need to be able to instantiate FriendTemplateDecls.
2880 unsigned DiagID = SemaRef.getDiagnostics().getCustomDiagID(
2881 DiagnosticsEngine::Error,
2882 "cannot instantiate %0 yet");
2883 SemaRef.Diag(D->getLocation(), DiagID)
2884 << D->getDeclKindName();
2885
2886 return nullptr;
2887 }
2888
VisitDecl(Decl * D)2889 Decl *TemplateDeclInstantiator::VisitDecl(Decl *D) {
2890 llvm_unreachable("Unexpected decl");
2891 }
2892
SubstDecl(Decl * D,DeclContext * Owner,const MultiLevelTemplateArgumentList & TemplateArgs)2893 Decl *Sema::SubstDecl(Decl *D, DeclContext *Owner,
2894 const MultiLevelTemplateArgumentList &TemplateArgs) {
2895 TemplateDeclInstantiator Instantiator(*this, Owner, TemplateArgs);
2896 if (D->isInvalidDecl())
2897 return nullptr;
2898
2899 return Instantiator.Visit(D);
2900 }
2901
2902 /// \brief Instantiates a nested template parameter list in the current
2903 /// instantiation context.
2904 ///
2905 /// \param L The parameter list to instantiate
2906 ///
2907 /// \returns NULL if there was an error
2908 TemplateParameterList *
SubstTemplateParams(TemplateParameterList * L)2909 TemplateDeclInstantiator::SubstTemplateParams(TemplateParameterList *L) {
2910 // Get errors for all the parameters before bailing out.
2911 bool Invalid = false;
2912
2913 unsigned N = L->size();
2914 typedef SmallVector<NamedDecl *, 8> ParamVector;
2915 ParamVector Params;
2916 Params.reserve(N);
2917 for (auto &P : *L) {
2918 NamedDecl *D = cast_or_null<NamedDecl>(Visit(P));
2919 Params.push_back(D);
2920 Invalid = Invalid || !D || D->isInvalidDecl();
2921 }
2922
2923 // Clean up if we had an error.
2924 if (Invalid)
2925 return nullptr;
2926
2927 TemplateParameterList *InstL
2928 = TemplateParameterList::Create(SemaRef.Context, L->getTemplateLoc(),
2929 L->getLAngleLoc(), Params,
2930 L->getRAngleLoc());
2931 return InstL;
2932 }
2933
2934 /// \brief Instantiate the declaration of a class template partial
2935 /// specialization.
2936 ///
2937 /// \param ClassTemplate the (instantiated) class template that is partially
2938 // specialized by the instantiation of \p PartialSpec.
2939 ///
2940 /// \param PartialSpec the (uninstantiated) class template partial
2941 /// specialization that we are instantiating.
2942 ///
2943 /// \returns The instantiated partial specialization, if successful; otherwise,
2944 /// NULL to indicate an error.
2945 ClassTemplatePartialSpecializationDecl *
InstantiateClassTemplatePartialSpecialization(ClassTemplateDecl * ClassTemplate,ClassTemplatePartialSpecializationDecl * PartialSpec)2946 TemplateDeclInstantiator::InstantiateClassTemplatePartialSpecialization(
2947 ClassTemplateDecl *ClassTemplate,
2948 ClassTemplatePartialSpecializationDecl *PartialSpec) {
2949 // Create a local instantiation scope for this class template partial
2950 // specialization, which will contain the instantiations of the template
2951 // parameters.
2952 LocalInstantiationScope Scope(SemaRef);
2953
2954 // Substitute into the template parameters of the class template partial
2955 // specialization.
2956 TemplateParameterList *TempParams = PartialSpec->getTemplateParameters();
2957 TemplateParameterList *InstParams = SubstTemplateParams(TempParams);
2958 if (!InstParams)
2959 return nullptr;
2960
2961 // Substitute into the template arguments of the class template partial
2962 // specialization.
2963 const ASTTemplateArgumentListInfo *TemplArgInfo
2964 = PartialSpec->getTemplateArgsAsWritten();
2965 TemplateArgumentListInfo InstTemplateArgs(TemplArgInfo->LAngleLoc,
2966 TemplArgInfo->RAngleLoc);
2967 if (SemaRef.Subst(TemplArgInfo->getTemplateArgs(),
2968 TemplArgInfo->NumTemplateArgs,
2969 InstTemplateArgs, TemplateArgs))
2970 return nullptr;
2971
2972 // Check that the template argument list is well-formed for this
2973 // class template.
2974 SmallVector<TemplateArgument, 4> Converted;
2975 if (SemaRef.CheckTemplateArgumentList(ClassTemplate,
2976 PartialSpec->getLocation(),
2977 InstTemplateArgs,
2978 false,
2979 Converted))
2980 return nullptr;
2981
2982 // Figure out where to insert this class template partial specialization
2983 // in the member template's set of class template partial specializations.
2984 void *InsertPos = nullptr;
2985 ClassTemplateSpecializationDecl *PrevDecl
2986 = ClassTemplate->findPartialSpecialization(Converted, InsertPos);
2987
2988 // Build the canonical type that describes the converted template
2989 // arguments of the class template partial specialization.
2990 QualType CanonType
2991 = SemaRef.Context.getTemplateSpecializationType(TemplateName(ClassTemplate),
2992 Converted);
2993
2994 // Build the fully-sugared type for this class template
2995 // specialization as the user wrote in the specialization
2996 // itself. This means that we'll pretty-print the type retrieved
2997 // from the specialization's declaration the way that the user
2998 // actually wrote the specialization, rather than formatting the
2999 // name based on the "canonical" representation used to store the
3000 // template arguments in the specialization.
3001 TypeSourceInfo *WrittenTy
3002 = SemaRef.Context.getTemplateSpecializationTypeInfo(
3003 TemplateName(ClassTemplate),
3004 PartialSpec->getLocation(),
3005 InstTemplateArgs,
3006 CanonType);
3007
3008 if (PrevDecl) {
3009 // We've already seen a partial specialization with the same template
3010 // parameters and template arguments. This can happen, for example, when
3011 // substituting the outer template arguments ends up causing two
3012 // class template partial specializations of a member class template
3013 // to have identical forms, e.g.,
3014 //
3015 // template<typename T, typename U>
3016 // struct Outer {
3017 // template<typename X, typename Y> struct Inner;
3018 // template<typename Y> struct Inner<T, Y>;
3019 // template<typename Y> struct Inner<U, Y>;
3020 // };
3021 //
3022 // Outer<int, int> outer; // error: the partial specializations of Inner
3023 // // have the same signature.
3024 SemaRef.Diag(PartialSpec->getLocation(), diag::err_partial_spec_redeclared)
3025 << WrittenTy->getType();
3026 SemaRef.Diag(PrevDecl->getLocation(), diag::note_prev_partial_spec_here)
3027 << SemaRef.Context.getTypeDeclType(PrevDecl);
3028 return nullptr;
3029 }
3030
3031
3032 // Create the class template partial specialization declaration.
3033 ClassTemplatePartialSpecializationDecl *InstPartialSpec
3034 = ClassTemplatePartialSpecializationDecl::Create(SemaRef.Context,
3035 PartialSpec->getTagKind(),
3036 Owner,
3037 PartialSpec->getLocStart(),
3038 PartialSpec->getLocation(),
3039 InstParams,
3040 ClassTemplate,
3041 Converted,
3042 InstTemplateArgs,
3043 CanonType,
3044 nullptr);
3045 // Substitute the nested name specifier, if any.
3046 if (SubstQualifier(PartialSpec, InstPartialSpec))
3047 return nullptr;
3048
3049 InstPartialSpec->setInstantiatedFromMember(PartialSpec);
3050 InstPartialSpec->setTypeAsWritten(WrittenTy);
3051
3052 // Add this partial specialization to the set of class template partial
3053 // specializations.
3054 ClassTemplate->AddPartialSpecialization(InstPartialSpec,
3055 /*InsertPos=*/nullptr);
3056 return InstPartialSpec;
3057 }
3058
3059 /// \brief Instantiate the declaration of a variable template partial
3060 /// specialization.
3061 ///
3062 /// \param VarTemplate the (instantiated) variable template that is partially
3063 /// specialized by the instantiation of \p PartialSpec.
3064 ///
3065 /// \param PartialSpec the (uninstantiated) variable template partial
3066 /// specialization that we are instantiating.
3067 ///
3068 /// \returns The instantiated partial specialization, if successful; otherwise,
3069 /// NULL to indicate an error.
3070 VarTemplatePartialSpecializationDecl *
InstantiateVarTemplatePartialSpecialization(VarTemplateDecl * VarTemplate,VarTemplatePartialSpecializationDecl * PartialSpec)3071 TemplateDeclInstantiator::InstantiateVarTemplatePartialSpecialization(
3072 VarTemplateDecl *VarTemplate,
3073 VarTemplatePartialSpecializationDecl *PartialSpec) {
3074 // Create a local instantiation scope for this variable template partial
3075 // specialization, which will contain the instantiations of the template
3076 // parameters.
3077 LocalInstantiationScope Scope(SemaRef);
3078
3079 // Substitute into the template parameters of the variable template partial
3080 // specialization.
3081 TemplateParameterList *TempParams = PartialSpec->getTemplateParameters();
3082 TemplateParameterList *InstParams = SubstTemplateParams(TempParams);
3083 if (!InstParams)
3084 return nullptr;
3085
3086 // Substitute into the template arguments of the variable template partial
3087 // specialization.
3088 const ASTTemplateArgumentListInfo *TemplArgInfo
3089 = PartialSpec->getTemplateArgsAsWritten();
3090 TemplateArgumentListInfo InstTemplateArgs(TemplArgInfo->LAngleLoc,
3091 TemplArgInfo->RAngleLoc);
3092 if (SemaRef.Subst(TemplArgInfo->getTemplateArgs(),
3093 TemplArgInfo->NumTemplateArgs,
3094 InstTemplateArgs, TemplateArgs))
3095 return nullptr;
3096
3097 // Check that the template argument list is well-formed for this
3098 // class template.
3099 SmallVector<TemplateArgument, 4> Converted;
3100 if (SemaRef.CheckTemplateArgumentList(VarTemplate, PartialSpec->getLocation(),
3101 InstTemplateArgs, false, Converted))
3102 return nullptr;
3103
3104 // Figure out where to insert this variable template partial specialization
3105 // in the member template's set of variable template partial specializations.
3106 void *InsertPos = nullptr;
3107 VarTemplateSpecializationDecl *PrevDecl =
3108 VarTemplate->findPartialSpecialization(Converted, InsertPos);
3109
3110 // Build the canonical type that describes the converted template
3111 // arguments of the variable template partial specialization.
3112 QualType CanonType = SemaRef.Context.getTemplateSpecializationType(
3113 TemplateName(VarTemplate), Converted);
3114
3115 // Build the fully-sugared type for this variable template
3116 // specialization as the user wrote in the specialization
3117 // itself. This means that we'll pretty-print the type retrieved
3118 // from the specialization's declaration the way that the user
3119 // actually wrote the specialization, rather than formatting the
3120 // name based on the "canonical" representation used to store the
3121 // template arguments in the specialization.
3122 TypeSourceInfo *WrittenTy = SemaRef.Context.getTemplateSpecializationTypeInfo(
3123 TemplateName(VarTemplate), PartialSpec->getLocation(), InstTemplateArgs,
3124 CanonType);
3125
3126 if (PrevDecl) {
3127 // We've already seen a partial specialization with the same template
3128 // parameters and template arguments. This can happen, for example, when
3129 // substituting the outer template arguments ends up causing two
3130 // variable template partial specializations of a member variable template
3131 // to have identical forms, e.g.,
3132 //
3133 // template<typename T, typename U>
3134 // struct Outer {
3135 // template<typename X, typename Y> pair<X,Y> p;
3136 // template<typename Y> pair<T, Y> p;
3137 // template<typename Y> pair<U, Y> p;
3138 // };
3139 //
3140 // Outer<int, int> outer; // error: the partial specializations of Inner
3141 // // have the same signature.
3142 SemaRef.Diag(PartialSpec->getLocation(),
3143 diag::err_var_partial_spec_redeclared)
3144 << WrittenTy->getType();
3145 SemaRef.Diag(PrevDecl->getLocation(),
3146 diag::note_var_prev_partial_spec_here);
3147 return nullptr;
3148 }
3149
3150 // Do substitution on the type of the declaration
3151 TypeSourceInfo *DI = SemaRef.SubstType(
3152 PartialSpec->getTypeSourceInfo(), TemplateArgs,
3153 PartialSpec->getTypeSpecStartLoc(), PartialSpec->getDeclName());
3154 if (!DI)
3155 return nullptr;
3156
3157 if (DI->getType()->isFunctionType()) {
3158 SemaRef.Diag(PartialSpec->getLocation(),
3159 diag::err_variable_instantiates_to_function)
3160 << PartialSpec->isStaticDataMember() << DI->getType();
3161 return nullptr;
3162 }
3163
3164 // Create the variable template partial specialization declaration.
3165 VarTemplatePartialSpecializationDecl *InstPartialSpec =
3166 VarTemplatePartialSpecializationDecl::Create(
3167 SemaRef.Context, Owner, PartialSpec->getInnerLocStart(),
3168 PartialSpec->getLocation(), InstParams, VarTemplate, DI->getType(),
3169 DI, PartialSpec->getStorageClass(), Converted, InstTemplateArgs);
3170
3171 // Substitute the nested name specifier, if any.
3172 if (SubstQualifier(PartialSpec, InstPartialSpec))
3173 return nullptr;
3174
3175 InstPartialSpec->setInstantiatedFromMember(PartialSpec);
3176 InstPartialSpec->setTypeAsWritten(WrittenTy);
3177
3178 // Add this partial specialization to the set of variable template partial
3179 // specializations. The instantiation of the initializer is not necessary.
3180 VarTemplate->AddPartialSpecialization(InstPartialSpec, /*InsertPos=*/nullptr);
3181
3182 SemaRef.BuildVariableInstantiation(InstPartialSpec, PartialSpec, TemplateArgs,
3183 LateAttrs, Owner, StartingScope);
3184
3185 return InstPartialSpec;
3186 }
3187
3188 TypeSourceInfo*
SubstFunctionType(FunctionDecl * D,SmallVectorImpl<ParmVarDecl * > & Params)3189 TemplateDeclInstantiator::SubstFunctionType(FunctionDecl *D,
3190 SmallVectorImpl<ParmVarDecl *> &Params) {
3191 TypeSourceInfo *OldTInfo = D->getTypeSourceInfo();
3192 assert(OldTInfo && "substituting function without type source info");
3193 assert(Params.empty() && "parameter vector is non-empty at start");
3194
3195 CXXRecordDecl *ThisContext = nullptr;
3196 unsigned ThisTypeQuals = 0;
3197 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
3198 ThisContext = cast<CXXRecordDecl>(Owner);
3199 ThisTypeQuals = Method->getTypeQualifiers();
3200 }
3201
3202 TypeSourceInfo *NewTInfo
3203 = SemaRef.SubstFunctionDeclType(OldTInfo, TemplateArgs,
3204 D->getTypeSpecStartLoc(),
3205 D->getDeclName(),
3206 ThisContext, ThisTypeQuals);
3207 if (!NewTInfo)
3208 return nullptr;
3209
3210 TypeLoc OldTL = OldTInfo->getTypeLoc().IgnoreParens();
3211 if (FunctionProtoTypeLoc OldProtoLoc = OldTL.getAs<FunctionProtoTypeLoc>()) {
3212 if (NewTInfo != OldTInfo) {
3213 // Get parameters from the new type info.
3214 TypeLoc NewTL = NewTInfo->getTypeLoc().IgnoreParens();
3215 FunctionProtoTypeLoc NewProtoLoc = NewTL.castAs<FunctionProtoTypeLoc>();
3216 unsigned NewIdx = 0;
3217 for (unsigned OldIdx = 0, NumOldParams = OldProtoLoc.getNumParams();
3218 OldIdx != NumOldParams; ++OldIdx) {
3219 ParmVarDecl *OldParam = OldProtoLoc.getParam(OldIdx);
3220 LocalInstantiationScope *Scope = SemaRef.CurrentInstantiationScope;
3221
3222 Optional<unsigned> NumArgumentsInExpansion;
3223 if (OldParam->isParameterPack())
3224 NumArgumentsInExpansion =
3225 SemaRef.getNumArgumentsInExpansion(OldParam->getType(),
3226 TemplateArgs);
3227 if (!NumArgumentsInExpansion) {
3228 // Simple case: normal parameter, or a parameter pack that's
3229 // instantiated to a (still-dependent) parameter pack.
3230 ParmVarDecl *NewParam = NewProtoLoc.getParam(NewIdx++);
3231 Params.push_back(NewParam);
3232 Scope->InstantiatedLocal(OldParam, NewParam);
3233 } else {
3234 // Parameter pack expansion: make the instantiation an argument pack.
3235 Scope->MakeInstantiatedLocalArgPack(OldParam);
3236 for (unsigned I = 0; I != *NumArgumentsInExpansion; ++I) {
3237 ParmVarDecl *NewParam = NewProtoLoc.getParam(NewIdx++);
3238 Params.push_back(NewParam);
3239 Scope->InstantiatedLocalPackArg(OldParam, NewParam);
3240 }
3241 }
3242 }
3243 } else {
3244 // The function type itself was not dependent and therefore no
3245 // substitution occurred. However, we still need to instantiate
3246 // the function parameters themselves.
3247 const FunctionProtoType *OldProto =
3248 cast<FunctionProtoType>(OldProtoLoc.getType());
3249 for (unsigned i = 0, i_end = OldProtoLoc.getNumParams(); i != i_end;
3250 ++i) {
3251 ParmVarDecl *OldParam = OldProtoLoc.getParam(i);
3252 if (!OldParam) {
3253 Params.push_back(SemaRef.BuildParmVarDeclForTypedef(
3254 D, D->getLocation(), OldProto->getParamType(i)));
3255 continue;
3256 }
3257
3258 ParmVarDecl *Parm =
3259 cast_or_null<ParmVarDecl>(VisitParmVarDecl(OldParam));
3260 if (!Parm)
3261 return nullptr;
3262 Params.push_back(Parm);
3263 }
3264 }
3265 } else {
3266 // If the type of this function, after ignoring parentheses, is not
3267 // *directly* a function type, then we're instantiating a function that
3268 // was declared via a typedef or with attributes, e.g.,
3269 //
3270 // typedef int functype(int, int);
3271 // functype func;
3272 // int __cdecl meth(int, int);
3273 //
3274 // In this case, we'll just go instantiate the ParmVarDecls that we
3275 // synthesized in the method declaration.
3276 SmallVector<QualType, 4> ParamTypes;
3277 Sema::ExtParameterInfoBuilder ExtParamInfos;
3278 if (SemaRef.SubstParmTypes(D->getLocation(), D->parameters(), nullptr,
3279 TemplateArgs, ParamTypes, &Params,
3280 ExtParamInfos))
3281 return nullptr;
3282 }
3283
3284 return NewTInfo;
3285 }
3286
3287 /// Introduce the instantiated function parameters into the local
3288 /// instantiation scope, and set the parameter names to those used
3289 /// in the template.
addInstantiatedParametersToScope(Sema & S,FunctionDecl * Function,const FunctionDecl * PatternDecl,LocalInstantiationScope & Scope,const MultiLevelTemplateArgumentList & TemplateArgs)3290 static bool addInstantiatedParametersToScope(Sema &S, FunctionDecl *Function,
3291 const FunctionDecl *PatternDecl,
3292 LocalInstantiationScope &Scope,
3293 const MultiLevelTemplateArgumentList &TemplateArgs) {
3294 unsigned FParamIdx = 0;
3295 for (unsigned I = 0, N = PatternDecl->getNumParams(); I != N; ++I) {
3296 const ParmVarDecl *PatternParam = PatternDecl->getParamDecl(I);
3297 if (!PatternParam->isParameterPack()) {
3298 // Simple case: not a parameter pack.
3299 assert(FParamIdx < Function->getNumParams());
3300 ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx);
3301 FunctionParam->setDeclName(PatternParam->getDeclName());
3302 // If the parameter's type is not dependent, update it to match the type
3303 // in the pattern. They can differ in top-level cv-qualifiers, and we want
3304 // the pattern's type here. If the type is dependent, they can't differ,
3305 // per core issue 1668. Substitute into the type from the pattern, in case
3306 // it's instantiation-dependent.
3307 // FIXME: Updating the type to work around this is at best fragile.
3308 if (!PatternDecl->getType()->isDependentType()) {
3309 QualType T = S.SubstType(PatternParam->getType(), TemplateArgs,
3310 FunctionParam->getLocation(),
3311 FunctionParam->getDeclName());
3312 if (T.isNull())
3313 return true;
3314 FunctionParam->setType(T);
3315 }
3316
3317 Scope.InstantiatedLocal(PatternParam, FunctionParam);
3318 ++FParamIdx;
3319 continue;
3320 }
3321
3322 // Expand the parameter pack.
3323 Scope.MakeInstantiatedLocalArgPack(PatternParam);
3324 Optional<unsigned> NumArgumentsInExpansion
3325 = S.getNumArgumentsInExpansion(PatternParam->getType(), TemplateArgs);
3326 assert(NumArgumentsInExpansion &&
3327 "should only be called when all template arguments are known");
3328 QualType PatternType =
3329 PatternParam->getType()->castAs<PackExpansionType>()->getPattern();
3330 for (unsigned Arg = 0; Arg < *NumArgumentsInExpansion; ++Arg) {
3331 ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx);
3332 FunctionParam->setDeclName(PatternParam->getDeclName());
3333 if (!PatternDecl->getType()->isDependentType()) {
3334 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(S, Arg);
3335 QualType T = S.SubstType(PatternType, TemplateArgs,
3336 FunctionParam->getLocation(),
3337 FunctionParam->getDeclName());
3338 if (T.isNull())
3339 return true;
3340 FunctionParam->setType(T);
3341 }
3342
3343 Scope.InstantiatedLocalPackArg(PatternParam, FunctionParam);
3344 ++FParamIdx;
3345 }
3346 }
3347
3348 return false;
3349 }
3350
InstantiateExceptionSpec(SourceLocation PointOfInstantiation,FunctionDecl * Decl)3351 void Sema::InstantiateExceptionSpec(SourceLocation PointOfInstantiation,
3352 FunctionDecl *Decl) {
3353 const FunctionProtoType *Proto = Decl->getType()->castAs<FunctionProtoType>();
3354 if (Proto->getExceptionSpecType() != EST_Uninstantiated)
3355 return;
3356
3357 InstantiatingTemplate Inst(*this, PointOfInstantiation, Decl,
3358 InstantiatingTemplate::ExceptionSpecification());
3359 if (Inst.isInvalid()) {
3360 // We hit the instantiation depth limit. Clear the exception specification
3361 // so that our callers don't have to cope with EST_Uninstantiated.
3362 UpdateExceptionSpec(Decl, EST_None);
3363 return;
3364 }
3365
3366 // Enter the scope of this instantiation. We don't use
3367 // PushDeclContext because we don't have a scope.
3368 Sema::ContextRAII savedContext(*this, Decl);
3369 LocalInstantiationScope Scope(*this);
3370
3371 MultiLevelTemplateArgumentList TemplateArgs =
3372 getTemplateInstantiationArgs(Decl, nullptr, /*RelativeToPrimary*/true);
3373
3374 FunctionDecl *Template = Proto->getExceptionSpecTemplate();
3375 if (addInstantiatedParametersToScope(*this, Decl, Template, Scope,
3376 TemplateArgs)) {
3377 UpdateExceptionSpec(Decl, EST_None);
3378 return;
3379 }
3380
3381 SubstExceptionSpec(Decl, Template->getType()->castAs<FunctionProtoType>(),
3382 TemplateArgs);
3383 }
3384
3385 /// \brief Initializes the common fields of an instantiation function
3386 /// declaration (New) from the corresponding fields of its template (Tmpl).
3387 ///
3388 /// \returns true if there was an error
3389 bool
InitFunctionInstantiation(FunctionDecl * New,FunctionDecl * Tmpl)3390 TemplateDeclInstantiator::InitFunctionInstantiation(FunctionDecl *New,
3391 FunctionDecl *Tmpl) {
3392 if (Tmpl->isDeleted())
3393 New->setDeletedAsWritten();
3394
3395 // Forward the mangling number from the template to the instantiated decl.
3396 SemaRef.Context.setManglingNumber(New,
3397 SemaRef.Context.getManglingNumber(Tmpl));
3398
3399 // If we are performing substituting explicitly-specified template arguments
3400 // or deduced template arguments into a function template and we reach this
3401 // point, we are now past the point where SFINAE applies and have committed
3402 // to keeping the new function template specialization. We therefore
3403 // convert the active template instantiation for the function template
3404 // into a template instantiation for this specific function template
3405 // specialization, which is not a SFINAE context, so that we diagnose any
3406 // further errors in the declaration itself.
3407 typedef Sema::ActiveTemplateInstantiation ActiveInstType;
3408 ActiveInstType &ActiveInst = SemaRef.ActiveTemplateInstantiations.back();
3409 if (ActiveInst.Kind == ActiveInstType::ExplicitTemplateArgumentSubstitution ||
3410 ActiveInst.Kind == ActiveInstType::DeducedTemplateArgumentSubstitution) {
3411 if (FunctionTemplateDecl *FunTmpl
3412 = dyn_cast<FunctionTemplateDecl>(ActiveInst.Entity)) {
3413 assert(FunTmpl->getTemplatedDecl() == Tmpl &&
3414 "Deduction from the wrong function template?");
3415 (void) FunTmpl;
3416 ActiveInst.Kind = ActiveInstType::TemplateInstantiation;
3417 ActiveInst.Entity = New;
3418 }
3419 }
3420
3421 const FunctionProtoType *Proto = Tmpl->getType()->getAs<FunctionProtoType>();
3422 assert(Proto && "Function template without prototype?");
3423
3424 if (Proto->hasExceptionSpec() || Proto->getNoReturnAttr()) {
3425 FunctionProtoType::ExtProtoInfo EPI = Proto->getExtProtoInfo();
3426
3427 // DR1330: In C++11, defer instantiation of a non-trivial
3428 // exception specification.
3429 // DR1484: Local classes and their members are instantiated along with the
3430 // containing function.
3431 if (SemaRef.getLangOpts().CPlusPlus11 &&
3432 EPI.ExceptionSpec.Type != EST_None &&
3433 EPI.ExceptionSpec.Type != EST_DynamicNone &&
3434 EPI.ExceptionSpec.Type != EST_BasicNoexcept &&
3435 !Tmpl->isLexicallyWithinFunctionOrMethod()) {
3436 FunctionDecl *ExceptionSpecTemplate = Tmpl;
3437 if (EPI.ExceptionSpec.Type == EST_Uninstantiated)
3438 ExceptionSpecTemplate = EPI.ExceptionSpec.SourceTemplate;
3439 ExceptionSpecificationType NewEST = EST_Uninstantiated;
3440 if (EPI.ExceptionSpec.Type == EST_Unevaluated)
3441 NewEST = EST_Unevaluated;
3442
3443 // Mark the function has having an uninstantiated exception specification.
3444 const FunctionProtoType *NewProto
3445 = New->getType()->getAs<FunctionProtoType>();
3446 assert(NewProto && "Template instantiation without function prototype?");
3447 EPI = NewProto->getExtProtoInfo();
3448 EPI.ExceptionSpec.Type = NewEST;
3449 EPI.ExceptionSpec.SourceDecl = New;
3450 EPI.ExceptionSpec.SourceTemplate = ExceptionSpecTemplate;
3451 New->setType(SemaRef.Context.getFunctionType(
3452 NewProto->getReturnType(), NewProto->getParamTypes(), EPI));
3453 } else {
3454 SemaRef.SubstExceptionSpec(New, Proto, TemplateArgs);
3455 }
3456 }
3457
3458 // Get the definition. Leaves the variable unchanged if undefined.
3459 const FunctionDecl *Definition = Tmpl;
3460 Tmpl->isDefined(Definition);
3461
3462 SemaRef.InstantiateAttrs(TemplateArgs, Definition, New,
3463 LateAttrs, StartingScope);
3464
3465 return false;
3466 }
3467
3468 /// \brief Initializes common fields of an instantiated method
3469 /// declaration (New) from the corresponding fields of its template
3470 /// (Tmpl).
3471 ///
3472 /// \returns true if there was an error
3473 bool
InitMethodInstantiation(CXXMethodDecl * New,CXXMethodDecl * Tmpl)3474 TemplateDeclInstantiator::InitMethodInstantiation(CXXMethodDecl *New,
3475 CXXMethodDecl *Tmpl) {
3476 if (InitFunctionInstantiation(New, Tmpl))
3477 return true;
3478
3479 New->setAccess(Tmpl->getAccess());
3480 if (Tmpl->isVirtualAsWritten())
3481 New->setVirtualAsWritten(true);
3482
3483 // FIXME: New needs a pointer to Tmpl
3484 return false;
3485 }
3486
3487 /// \brief Instantiate the definition of the given function from its
3488 /// template.
3489 ///
3490 /// \param PointOfInstantiation the point at which the instantiation was
3491 /// required. Note that this is not precisely a "point of instantiation"
3492 /// for the function, but it's close.
3493 ///
3494 /// \param Function the already-instantiated declaration of a
3495 /// function template specialization or member function of a class template
3496 /// specialization.
3497 ///
3498 /// \param Recursive if true, recursively instantiates any functions that
3499 /// are required by this instantiation.
3500 ///
3501 /// \param DefinitionRequired if true, then we are performing an explicit
3502 /// instantiation where the body of the function is required. Complain if
3503 /// there is no such body.
InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,FunctionDecl * Function,bool Recursive,bool DefinitionRequired,bool AtEndOfTU)3504 void Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation,
3505 FunctionDecl *Function,
3506 bool Recursive,
3507 bool DefinitionRequired,
3508 bool AtEndOfTU) {
3509 if (Function->isInvalidDecl() || Function->isDefined())
3510 return;
3511
3512 // Never instantiate an explicit specialization except if it is a class scope
3513 // explicit specialization.
3514 if (Function->getTemplateSpecializationKind() == TSK_ExplicitSpecialization &&
3515 !Function->getClassScopeSpecializationPattern())
3516 return;
3517
3518 // Find the function body that we'll be substituting.
3519 const FunctionDecl *PatternDecl = Function->getTemplateInstantiationPattern();
3520 assert(PatternDecl && "instantiating a non-template");
3521
3522 Stmt *Pattern = PatternDecl->getBody(PatternDecl);
3523 assert(PatternDecl && "template definition is not a template");
3524 if (!Pattern) {
3525 // Try to find a defaulted definition
3526 PatternDecl->isDefined(PatternDecl);
3527 }
3528 assert(PatternDecl && "template definition is not a template");
3529
3530 // Postpone late parsed template instantiations.
3531 if (PatternDecl->isLateTemplateParsed() &&
3532 !LateTemplateParser) {
3533 PendingInstantiations.push_back(
3534 std::make_pair(Function, PointOfInstantiation));
3535 return;
3536 }
3537
3538 // If we're performing recursive template instantiation, create our own
3539 // queue of pending implicit instantiations that we will instantiate later,
3540 // while we're still within our own instantiation context.
3541 // This has to happen before LateTemplateParser below is called, so that
3542 // it marks vtables used in late parsed templates as used.
3543 SavePendingLocalImplicitInstantiationsRAII
3544 SavedPendingLocalImplicitInstantiations(*this);
3545 SavePendingInstantiationsAndVTableUsesRAII
3546 SavePendingInstantiationsAndVTableUses(*this, /*Enabled=*/Recursive);
3547
3548 // Call the LateTemplateParser callback if there is a need to late parse
3549 // a templated function definition.
3550 if (!Pattern && PatternDecl->isLateTemplateParsed() &&
3551 LateTemplateParser) {
3552 // FIXME: Optimize to allow individual templates to be deserialized.
3553 if (PatternDecl->isFromASTFile())
3554 ExternalSource->ReadLateParsedTemplates(LateParsedTemplateMap);
3555
3556 LateParsedTemplate *LPT = LateParsedTemplateMap.lookup(PatternDecl);
3557 assert(LPT && "missing LateParsedTemplate");
3558 LateTemplateParser(OpaqueParser, *LPT);
3559 Pattern = PatternDecl->getBody(PatternDecl);
3560 }
3561
3562 // FIXME: Check that the definition is visible before trying to instantiate
3563 // it. This requires us to track the instantiation stack in order to know
3564 // which definitions should be visible.
3565
3566 if (!Pattern && !PatternDecl->isDefaulted()) {
3567 if (DefinitionRequired) {
3568 if (Function->getPrimaryTemplate())
3569 Diag(PointOfInstantiation,
3570 diag::err_explicit_instantiation_undefined_func_template)
3571 << Function->getPrimaryTemplate();
3572 else
3573 Diag(PointOfInstantiation,
3574 diag::err_explicit_instantiation_undefined_member)
3575 << 1 << Function->getDeclName() << Function->getDeclContext();
3576
3577 if (PatternDecl)
3578 Diag(PatternDecl->getLocation(),
3579 diag::note_explicit_instantiation_here);
3580 Function->setInvalidDecl();
3581 } else if (Function->getTemplateSpecializationKind()
3582 == TSK_ExplicitInstantiationDefinition) {
3583 assert(!Recursive);
3584 PendingInstantiations.push_back(
3585 std::make_pair(Function, PointOfInstantiation));
3586 } else if (Function->getTemplateSpecializationKind()
3587 == TSK_ImplicitInstantiation) {
3588 if (AtEndOfTU && !getDiagnostics().hasErrorOccurred()) {
3589 Diag(PointOfInstantiation, diag::warn_func_template_missing)
3590 << Function;
3591 Diag(PatternDecl->getLocation(), diag::note_forward_template_decl);
3592 if (getLangOpts().CPlusPlus11)
3593 Diag(PointOfInstantiation, diag::note_inst_declaration_hint)
3594 << Function;
3595 }
3596 }
3597
3598 return;
3599 }
3600
3601 // C++1y [temp.explicit]p10:
3602 // Except for inline functions, declarations with types deduced from their
3603 // initializer or return value, and class template specializations, other
3604 // explicit instantiation declarations have the effect of suppressing the
3605 // implicit instantiation of the entity to which they refer.
3606 if (Function->getTemplateSpecializationKind() ==
3607 TSK_ExplicitInstantiationDeclaration &&
3608 !PatternDecl->isInlined() &&
3609 !PatternDecl->getReturnType()->getContainedAutoType())
3610 return;
3611
3612 if (PatternDecl->isInlined()) {
3613 // Function, and all later redeclarations of it (from imported modules,
3614 // for instance), are now implicitly inline.
3615 for (auto *D = Function->getMostRecentDecl(); /**/;
3616 D = D->getPreviousDecl()) {
3617 D->setImplicitlyInline();
3618 if (D == Function)
3619 break;
3620 }
3621 }
3622
3623 InstantiatingTemplate Inst(*this, PointOfInstantiation, Function);
3624 if (Inst.isInvalid())
3625 return;
3626 PrettyDeclStackTraceEntry CrashInfo(*this, Function, SourceLocation(),
3627 "instantiating function definition");
3628
3629 // Copy the inner loc start from the pattern.
3630 Function->setInnerLocStart(PatternDecl->getInnerLocStart());
3631
3632 EnterExpressionEvaluationContext EvalContext(*this,
3633 Sema::PotentiallyEvaluated);
3634
3635 // Introduce a new scope where local variable instantiations will be
3636 // recorded, unless we're actually a member function within a local
3637 // class, in which case we need to merge our results with the parent
3638 // scope (of the enclosing function).
3639 bool MergeWithParentScope = false;
3640 if (CXXRecordDecl *Rec = dyn_cast<CXXRecordDecl>(Function->getDeclContext()))
3641 MergeWithParentScope = Rec->isLocalClass();
3642
3643 LocalInstantiationScope Scope(*this, MergeWithParentScope);
3644
3645 if (PatternDecl->isDefaulted())
3646 SetDeclDefaulted(Function, PatternDecl->getLocation());
3647 else {
3648 MultiLevelTemplateArgumentList TemplateArgs =
3649 getTemplateInstantiationArgs(Function, nullptr, false, PatternDecl);
3650
3651 // Substitute into the qualifier; we can get a substitution failure here
3652 // through evil use of alias templates.
3653 // FIXME: Is CurContext correct for this? Should we go to the (instantiation
3654 // of the) lexical context of the pattern?
3655 SubstQualifier(*this, PatternDecl, Function, TemplateArgs);
3656
3657 ActOnStartOfFunctionDef(nullptr, Function);
3658
3659 // Enter the scope of this instantiation. We don't use
3660 // PushDeclContext because we don't have a scope.
3661 Sema::ContextRAII savedContext(*this, Function);
3662
3663 if (addInstantiatedParametersToScope(*this, Function, PatternDecl, Scope,
3664 TemplateArgs))
3665 return;
3666
3667 // If this is a constructor, instantiate the member initializers.
3668 if (const CXXConstructorDecl *Ctor =
3669 dyn_cast<CXXConstructorDecl>(PatternDecl)) {
3670 InstantiateMemInitializers(cast<CXXConstructorDecl>(Function), Ctor,
3671 TemplateArgs);
3672 }
3673
3674 // Instantiate the function body.
3675 StmtResult Body = SubstStmt(Pattern, TemplateArgs);
3676
3677 if (Body.isInvalid())
3678 Function->setInvalidDecl();
3679
3680 ActOnFinishFunctionBody(Function, Body.get(),
3681 /*IsInstantiation=*/true);
3682
3683 PerformDependentDiagnostics(PatternDecl, TemplateArgs);
3684
3685 if (auto *Listener = getASTMutationListener())
3686 Listener->FunctionDefinitionInstantiated(Function);
3687
3688 savedContext.pop();
3689 }
3690
3691 DeclGroupRef DG(Function);
3692 Consumer.HandleTopLevelDecl(DG);
3693
3694 // This class may have local implicit instantiations that need to be
3695 // instantiation within this scope.
3696 PerformPendingInstantiations(/*LocalOnly=*/true);
3697 Scope.Exit();
3698
3699 if (Recursive) {
3700 // Define any pending vtables.
3701 DefineUsedVTables();
3702
3703 // Instantiate any pending implicit instantiations found during the
3704 // instantiation of this template.
3705 PerformPendingInstantiations();
3706
3707 // PendingInstantiations and VTableUses are restored through
3708 // SavePendingInstantiationsAndVTableUses's destructor.
3709 }
3710 }
3711
BuildVarTemplateInstantiation(VarTemplateDecl * VarTemplate,VarDecl * FromVar,const TemplateArgumentList & TemplateArgList,const TemplateArgumentListInfo & TemplateArgsInfo,SmallVectorImpl<TemplateArgument> & Converted,SourceLocation PointOfInstantiation,void * InsertPos,LateInstantiatedAttrVec * LateAttrs,LocalInstantiationScope * StartingScope)3712 VarTemplateSpecializationDecl *Sema::BuildVarTemplateInstantiation(
3713 VarTemplateDecl *VarTemplate, VarDecl *FromVar,
3714 const TemplateArgumentList &TemplateArgList,
3715 const TemplateArgumentListInfo &TemplateArgsInfo,
3716 SmallVectorImpl<TemplateArgument> &Converted,
3717 SourceLocation PointOfInstantiation, void *InsertPos,
3718 LateInstantiatedAttrVec *LateAttrs,
3719 LocalInstantiationScope *StartingScope) {
3720 if (FromVar->isInvalidDecl())
3721 return nullptr;
3722
3723 InstantiatingTemplate Inst(*this, PointOfInstantiation, FromVar);
3724 if (Inst.isInvalid())
3725 return nullptr;
3726
3727 MultiLevelTemplateArgumentList TemplateArgLists;
3728 TemplateArgLists.addOuterTemplateArguments(&TemplateArgList);
3729
3730 // Instantiate the first declaration of the variable template: for a partial
3731 // specialization of a static data member template, the first declaration may
3732 // or may not be the declaration in the class; if it's in the class, we want
3733 // to instantiate a member in the class (a declaration), and if it's outside,
3734 // we want to instantiate a definition.
3735 //
3736 // If we're instantiating an explicitly-specialized member template or member
3737 // partial specialization, don't do this. The member specialization completely
3738 // replaces the original declaration in this case.
3739 bool IsMemberSpec = false;
3740 if (VarTemplatePartialSpecializationDecl *PartialSpec =
3741 dyn_cast<VarTemplatePartialSpecializationDecl>(FromVar))
3742 IsMemberSpec = PartialSpec->isMemberSpecialization();
3743 else if (VarTemplateDecl *FromTemplate = FromVar->getDescribedVarTemplate())
3744 IsMemberSpec = FromTemplate->isMemberSpecialization();
3745 if (!IsMemberSpec)
3746 FromVar = FromVar->getFirstDecl();
3747
3748 MultiLevelTemplateArgumentList MultiLevelList(TemplateArgList);
3749 TemplateDeclInstantiator Instantiator(*this, FromVar->getDeclContext(),
3750 MultiLevelList);
3751
3752 // TODO: Set LateAttrs and StartingScope ...
3753
3754 return cast_or_null<VarTemplateSpecializationDecl>(
3755 Instantiator.VisitVarTemplateSpecializationDecl(
3756 VarTemplate, FromVar, InsertPos, TemplateArgsInfo, Converted));
3757 }
3758
3759 /// \brief Instantiates a variable template specialization by completing it
3760 /// with appropriate type information and initializer.
CompleteVarTemplateSpecializationDecl(VarTemplateSpecializationDecl * VarSpec,VarDecl * PatternDecl,const MultiLevelTemplateArgumentList & TemplateArgs)3761 VarTemplateSpecializationDecl *Sema::CompleteVarTemplateSpecializationDecl(
3762 VarTemplateSpecializationDecl *VarSpec, VarDecl *PatternDecl,
3763 const MultiLevelTemplateArgumentList &TemplateArgs) {
3764
3765 // Do substitution on the type of the declaration
3766 TypeSourceInfo *DI =
3767 SubstType(PatternDecl->getTypeSourceInfo(), TemplateArgs,
3768 PatternDecl->getTypeSpecStartLoc(), PatternDecl->getDeclName());
3769 if (!DI)
3770 return nullptr;
3771
3772 // Update the type of this variable template specialization.
3773 VarSpec->setType(DI->getType());
3774
3775 // Instantiate the initializer.
3776 InstantiateVariableInitializer(VarSpec, PatternDecl, TemplateArgs);
3777
3778 return VarSpec;
3779 }
3780
3781 /// BuildVariableInstantiation - Used after a new variable has been created.
3782 /// Sets basic variable data and decides whether to postpone the
3783 /// variable instantiation.
BuildVariableInstantiation(VarDecl * NewVar,VarDecl * OldVar,const MultiLevelTemplateArgumentList & TemplateArgs,LateInstantiatedAttrVec * LateAttrs,DeclContext * Owner,LocalInstantiationScope * StartingScope,bool InstantiatingVarTemplate)3784 void Sema::BuildVariableInstantiation(
3785 VarDecl *NewVar, VarDecl *OldVar,
3786 const MultiLevelTemplateArgumentList &TemplateArgs,
3787 LateInstantiatedAttrVec *LateAttrs, DeclContext *Owner,
3788 LocalInstantiationScope *StartingScope,
3789 bool InstantiatingVarTemplate) {
3790
3791 // If we are instantiating a local extern declaration, the
3792 // instantiation belongs lexically to the containing function.
3793 // If we are instantiating a static data member defined
3794 // out-of-line, the instantiation will have the same lexical
3795 // context (which will be a namespace scope) as the template.
3796 if (OldVar->isLocalExternDecl()) {
3797 NewVar->setLocalExternDecl();
3798 NewVar->setLexicalDeclContext(Owner);
3799 } else if (OldVar->isOutOfLine())
3800 NewVar->setLexicalDeclContext(OldVar->getLexicalDeclContext());
3801 NewVar->setTSCSpec(OldVar->getTSCSpec());
3802 NewVar->setInitStyle(OldVar->getInitStyle());
3803 NewVar->setCXXForRangeDecl(OldVar->isCXXForRangeDecl());
3804 NewVar->setConstexpr(OldVar->isConstexpr());
3805 NewVar->setInitCapture(OldVar->isInitCapture());
3806 NewVar->setPreviousDeclInSameBlockScope(
3807 OldVar->isPreviousDeclInSameBlockScope());
3808 NewVar->setAccess(OldVar->getAccess());
3809
3810 if (!OldVar->isStaticDataMember()) {
3811 if (OldVar->isUsed(false))
3812 NewVar->setIsUsed();
3813 NewVar->setReferenced(OldVar->isReferenced());
3814 }
3815
3816 InstantiateAttrs(TemplateArgs, OldVar, NewVar, LateAttrs, StartingScope);
3817
3818 LookupResult Previous(
3819 *this, NewVar->getDeclName(), NewVar->getLocation(),
3820 NewVar->isLocalExternDecl() ? Sema::LookupRedeclarationWithLinkage
3821 : Sema::LookupOrdinaryName,
3822 Sema::ForRedeclaration);
3823
3824 if (NewVar->isLocalExternDecl() && OldVar->getPreviousDecl() &&
3825 (!OldVar->getPreviousDecl()->getDeclContext()->isDependentContext() ||
3826 OldVar->getPreviousDecl()->getDeclContext()==OldVar->getDeclContext())) {
3827 // We have a previous declaration. Use that one, so we merge with the
3828 // right type.
3829 if (NamedDecl *NewPrev = FindInstantiatedDecl(
3830 NewVar->getLocation(), OldVar->getPreviousDecl(), TemplateArgs))
3831 Previous.addDecl(NewPrev);
3832 } else if (!isa<VarTemplateSpecializationDecl>(NewVar) &&
3833 OldVar->hasLinkage())
3834 LookupQualifiedName(Previous, NewVar->getDeclContext(), false);
3835 CheckVariableDeclaration(NewVar, Previous);
3836
3837 if (!InstantiatingVarTemplate) {
3838 NewVar->getLexicalDeclContext()->addHiddenDecl(NewVar);
3839 if (!NewVar->isLocalExternDecl() || !NewVar->getPreviousDecl())
3840 NewVar->getDeclContext()->makeDeclVisibleInContext(NewVar);
3841 }
3842
3843 if (!OldVar->isOutOfLine()) {
3844 if (NewVar->getDeclContext()->isFunctionOrMethod())
3845 CurrentInstantiationScope->InstantiatedLocal(OldVar, NewVar);
3846 }
3847
3848 // Link instantiations of static data members back to the template from
3849 // which they were instantiated.
3850 if (NewVar->isStaticDataMember() && !InstantiatingVarTemplate)
3851 NewVar->setInstantiationOfStaticDataMember(OldVar,
3852 TSK_ImplicitInstantiation);
3853
3854 // Forward the mangling number from the template to the instantiated decl.
3855 Context.setManglingNumber(NewVar, Context.getManglingNumber(OldVar));
3856 Context.setStaticLocalNumber(NewVar, Context.getStaticLocalNumber(OldVar));
3857
3858 // Delay instantiation of the initializer for variable templates or inline
3859 // static data members until a definition of the variable is needed. We need
3860 // it right away if the type contains 'auto'.
3861 if ((!isa<VarTemplateSpecializationDecl>(NewVar) &&
3862 !InstantiatingVarTemplate &&
3863 !(OldVar->isInline() && OldVar->isThisDeclarationADefinition())) ||
3864 NewVar->getType()->isUndeducedType())
3865 InstantiateVariableInitializer(NewVar, OldVar, TemplateArgs);
3866
3867 // Diagnose unused local variables with dependent types, where the diagnostic
3868 // will have been deferred.
3869 if (!NewVar->isInvalidDecl() &&
3870 NewVar->getDeclContext()->isFunctionOrMethod() &&
3871 OldVar->getType()->isDependentType())
3872 DiagnoseUnusedDecl(NewVar);
3873 }
3874
3875 /// \brief Instantiate the initializer of a variable.
InstantiateVariableInitializer(VarDecl * Var,VarDecl * OldVar,const MultiLevelTemplateArgumentList & TemplateArgs)3876 void Sema::InstantiateVariableInitializer(
3877 VarDecl *Var, VarDecl *OldVar,
3878 const MultiLevelTemplateArgumentList &TemplateArgs) {
3879 // We propagate the 'inline' flag with the initializer, because it
3880 // would otherwise imply that the variable is a definition for a
3881 // non-static data member.
3882 if (OldVar->isInlineSpecified())
3883 Var->setInlineSpecified();
3884 else if (OldVar->isInline())
3885 Var->setImplicitlyInline();
3886
3887 if (Var->getAnyInitializer())
3888 // We already have an initializer in the class.
3889 return;
3890
3891 if (OldVar->getInit()) {
3892 if (Var->isStaticDataMember() && !OldVar->isOutOfLine())
3893 PushExpressionEvaluationContext(Sema::ConstantEvaluated, OldVar);
3894 else
3895 PushExpressionEvaluationContext(Sema::PotentiallyEvaluated, OldVar);
3896
3897 // Instantiate the initializer.
3898 ExprResult Init;
3899
3900 {
3901 ContextRAII SwitchContext(*this, Var->getDeclContext());
3902 Init = SubstInitializer(OldVar->getInit(), TemplateArgs,
3903 OldVar->getInitStyle() == VarDecl::CallInit);
3904 }
3905
3906 if (!Init.isInvalid()) {
3907 bool TypeMayContainAuto = true;
3908 Expr *InitExpr = Init.get();
3909
3910 if (Var->hasAttr<DLLImportAttr>() &&
3911 (!InitExpr ||
3912 !InitExpr->isConstantInitializer(getASTContext(), false))) {
3913 // Do not dynamically initialize dllimport variables.
3914 } else if (InitExpr) {
3915 bool DirectInit = OldVar->isDirectInit();
3916 AddInitializerToDecl(Var, InitExpr, DirectInit, TypeMayContainAuto);
3917 } else
3918 ActOnUninitializedDecl(Var, TypeMayContainAuto);
3919 } else {
3920 // FIXME: Not too happy about invalidating the declaration
3921 // because of a bogus initializer.
3922 Var->setInvalidDecl();
3923 }
3924
3925 PopExpressionEvaluationContext();
3926 } else if ((!Var->isStaticDataMember() || Var->isOutOfLine()) &&
3927 !Var->isCXXForRangeDecl())
3928 ActOnUninitializedDecl(Var, false);
3929 }
3930
3931 /// \brief Instantiate the definition of the given variable from its
3932 /// template.
3933 ///
3934 /// \param PointOfInstantiation the point at which the instantiation was
3935 /// required. Note that this is not precisely a "point of instantiation"
3936 /// for the function, but it's close.
3937 ///
3938 /// \param Var the already-instantiated declaration of a static member
3939 /// variable of a class template specialization.
3940 ///
3941 /// \param Recursive if true, recursively instantiates any functions that
3942 /// are required by this instantiation.
3943 ///
3944 /// \param DefinitionRequired if true, then we are performing an explicit
3945 /// instantiation where an out-of-line definition of the member variable
3946 /// is required. Complain if there is no such definition.
InstantiateStaticDataMemberDefinition(SourceLocation PointOfInstantiation,VarDecl * Var,bool Recursive,bool DefinitionRequired)3947 void Sema::InstantiateStaticDataMemberDefinition(
3948 SourceLocation PointOfInstantiation,
3949 VarDecl *Var,
3950 bool Recursive,
3951 bool DefinitionRequired) {
3952 InstantiateVariableDefinition(PointOfInstantiation, Var, Recursive,
3953 DefinitionRequired);
3954 }
3955
InstantiateVariableDefinition(SourceLocation PointOfInstantiation,VarDecl * Var,bool Recursive,bool DefinitionRequired,bool AtEndOfTU)3956 void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
3957 VarDecl *Var, bool Recursive,
3958 bool DefinitionRequired, bool AtEndOfTU) {
3959 if (Var->isInvalidDecl())
3960 return;
3961
3962 VarTemplateSpecializationDecl *VarSpec =
3963 dyn_cast<VarTemplateSpecializationDecl>(Var);
3964 VarDecl *PatternDecl = nullptr, *Def = nullptr;
3965 MultiLevelTemplateArgumentList TemplateArgs =
3966 getTemplateInstantiationArgs(Var);
3967
3968 if (VarSpec) {
3969 // If this is a variable template specialization, make sure that it is
3970 // non-dependent, then find its instantiation pattern.
3971 bool InstantiationDependent = false;
3972 assert(!TemplateSpecializationType::anyDependentTemplateArguments(
3973 VarSpec->getTemplateArgsInfo(), InstantiationDependent) &&
3974 "Only instantiate variable template specializations that are "
3975 "not type-dependent");
3976 (void)InstantiationDependent;
3977
3978 // Find the variable initialization that we'll be substituting. If the
3979 // pattern was instantiated from a member template, look back further to
3980 // find the real pattern.
3981 assert(VarSpec->getSpecializedTemplate() &&
3982 "Specialization without specialized template?");
3983 llvm::PointerUnion<VarTemplateDecl *,
3984 VarTemplatePartialSpecializationDecl *> PatternPtr =
3985 VarSpec->getSpecializedTemplateOrPartial();
3986 if (PatternPtr.is<VarTemplatePartialSpecializationDecl *>()) {
3987 VarTemplatePartialSpecializationDecl *Tmpl =
3988 PatternPtr.get<VarTemplatePartialSpecializationDecl *>();
3989 while (VarTemplatePartialSpecializationDecl *From =
3990 Tmpl->getInstantiatedFromMember()) {
3991 if (Tmpl->isMemberSpecialization())
3992 break;
3993
3994 Tmpl = From;
3995 }
3996 PatternDecl = Tmpl;
3997 } else {
3998 VarTemplateDecl *Tmpl = PatternPtr.get<VarTemplateDecl *>();
3999 while (VarTemplateDecl *From =
4000 Tmpl->getInstantiatedFromMemberTemplate()) {
4001 if (Tmpl->isMemberSpecialization())
4002 break;
4003
4004 Tmpl = From;
4005 }
4006 PatternDecl = Tmpl->getTemplatedDecl();
4007 }
4008
4009 // If this is a static data member template, there might be an
4010 // uninstantiated initializer on the declaration. If so, instantiate
4011 // it now.
4012 if (PatternDecl->isStaticDataMember() &&
4013 (PatternDecl = PatternDecl->getFirstDecl())->hasInit() &&
4014 !Var->hasInit()) {
4015 // FIXME: Factor out the duplicated instantiation context setup/tear down
4016 // code here.
4017 InstantiatingTemplate Inst(*this, PointOfInstantiation, Var);
4018 if (Inst.isInvalid())
4019 return;
4020 PrettyDeclStackTraceEntry CrashInfo(*this, Var, SourceLocation(),
4021 "instantiating variable initializer");
4022
4023 // If we're performing recursive template instantiation, create our own
4024 // queue of pending implicit instantiations that we will instantiate
4025 // later, while we're still within our own instantiation context.
4026 SavePendingInstantiationsAndVTableUsesRAII
4027 SavePendingInstantiationsAndVTableUses(*this, /*Enabled=*/Recursive);
4028
4029 LocalInstantiationScope Local(*this);
4030
4031 // Enter the scope of this instantiation. We don't use
4032 // PushDeclContext because we don't have a scope.
4033 ContextRAII PreviousContext(*this, Var->getDeclContext());
4034 InstantiateVariableInitializer(Var, PatternDecl, TemplateArgs);
4035 PreviousContext.pop();
4036
4037 // FIXME: Need to inform the ASTConsumer that we instantiated the
4038 // initializer?
4039
4040 // This variable may have local implicit instantiations that need to be
4041 // instantiated within this scope.
4042 PerformPendingInstantiations(/*LocalOnly=*/true);
4043
4044 Local.Exit();
4045
4046 if (Recursive) {
4047 // Define any newly required vtables.
4048 DefineUsedVTables();
4049
4050 // Instantiate any pending implicit instantiations found during the
4051 // instantiation of this template.
4052 PerformPendingInstantiations();
4053
4054 // PendingInstantiations and VTableUses are restored through
4055 // SavePendingInstantiationsAndVTableUses's destructor.
4056 }
4057 }
4058
4059 // Find actual definition
4060 Def = PatternDecl->getDefinition(getASTContext());
4061 } else {
4062 // If this is a static data member, find its out-of-line definition.
4063 assert(Var->isStaticDataMember() && "not a static data member?");
4064 PatternDecl = Var->getInstantiatedFromStaticDataMember();
4065
4066 assert(PatternDecl && "data member was not instantiated from a template?");
4067 assert(PatternDecl->isStaticDataMember() && "not a static data member?");
4068 Def = PatternDecl->getDefinition();
4069 }
4070
4071 // FIXME: Check that the definition is visible before trying to instantiate
4072 // it. This requires us to track the instantiation stack in order to know
4073 // which definitions should be visible.
4074
4075 // If we don't have a definition of the variable template, we won't perform
4076 // any instantiation. Rather, we rely on the user to instantiate this
4077 // definition (or provide a specialization for it) in another translation
4078 // unit.
4079 if (!Def) {
4080 if (DefinitionRequired) {
4081 if (VarSpec)
4082 Diag(PointOfInstantiation,
4083 diag::err_explicit_instantiation_undefined_var_template) << Var;
4084 else
4085 Diag(PointOfInstantiation,
4086 diag::err_explicit_instantiation_undefined_member)
4087 << 2 << Var->getDeclName() << Var->getDeclContext();
4088 Diag(PatternDecl->getLocation(),
4089 diag::note_explicit_instantiation_here);
4090 if (VarSpec)
4091 Var->setInvalidDecl();
4092 } else if (Var->getTemplateSpecializationKind()
4093 == TSK_ExplicitInstantiationDefinition) {
4094 PendingInstantiations.push_back(
4095 std::make_pair(Var, PointOfInstantiation));
4096 } else if (Var->getTemplateSpecializationKind()
4097 == TSK_ImplicitInstantiation) {
4098 // Warn about missing definition at the end of translation unit.
4099 if (AtEndOfTU && !getDiagnostics().hasErrorOccurred()) {
4100 Diag(PointOfInstantiation, diag::warn_var_template_missing)
4101 << Var;
4102 Diag(PatternDecl->getLocation(), diag::note_forward_template_decl);
4103 if (getLangOpts().CPlusPlus11)
4104 Diag(PointOfInstantiation, diag::note_inst_declaration_hint) << Var;
4105 }
4106 }
4107
4108 return;
4109 }
4110
4111 TemplateSpecializationKind TSK = Var->getTemplateSpecializationKind();
4112
4113 // Never instantiate an explicit specialization.
4114 if (TSK == TSK_ExplicitSpecialization)
4115 return;
4116
4117 // C++11 [temp.explicit]p10:
4118 // Except for inline functions, [...] explicit instantiation declarations
4119 // have the effect of suppressing the implicit instantiation of the entity
4120 // to which they refer.
4121 if (TSK == TSK_ExplicitInstantiationDeclaration)
4122 return;
4123
4124 // Make sure to pass the instantiated variable to the consumer at the end.
4125 struct PassToConsumerRAII {
4126 ASTConsumer &Consumer;
4127 VarDecl *Var;
4128
4129 PassToConsumerRAII(ASTConsumer &Consumer, VarDecl *Var)
4130 : Consumer(Consumer), Var(Var) { }
4131
4132 ~PassToConsumerRAII() {
4133 Consumer.HandleCXXStaticMemberVarInstantiation(Var);
4134 }
4135 } PassToConsumerRAII(Consumer, Var);
4136
4137 // If we already have a definition, we're done.
4138 if (VarDecl *Def = Var->getDefinition()) {
4139 // We may be explicitly instantiating something we've already implicitly
4140 // instantiated.
4141 Def->setTemplateSpecializationKind(Var->getTemplateSpecializationKind(),
4142 PointOfInstantiation);
4143 return;
4144 }
4145
4146 InstantiatingTemplate Inst(*this, PointOfInstantiation, Var);
4147 if (Inst.isInvalid())
4148 return;
4149 PrettyDeclStackTraceEntry CrashInfo(*this, Var, SourceLocation(),
4150 "instantiating variable definition");
4151
4152 // If we're performing recursive template instantiation, create our own
4153 // queue of pending implicit instantiations that we will instantiate later,
4154 // while we're still within our own instantiation context.
4155 SavePendingLocalImplicitInstantiationsRAII
4156 SavedPendingLocalImplicitInstantiations(*this);
4157 SavePendingInstantiationsAndVTableUsesRAII
4158 SavePendingInstantiationsAndVTableUses(*this, /*Enabled=*/Recursive);
4159
4160 // Enter the scope of this instantiation. We don't use
4161 // PushDeclContext because we don't have a scope.
4162 ContextRAII PreviousContext(*this, Var->getDeclContext());
4163 LocalInstantiationScope Local(*this);
4164
4165 VarDecl *OldVar = Var;
4166 if (Def->isStaticDataMember() && !Def->isOutOfLine()) {
4167 // We're instantiating an inline static data member whose definition was
4168 // provided inside the class.
4169 // FIXME: Update record?
4170 InstantiateVariableInitializer(Var, Def, TemplateArgs);
4171 } else if (!VarSpec) {
4172 Var = cast_or_null<VarDecl>(SubstDecl(Def, Var->getDeclContext(),
4173 TemplateArgs));
4174 } else if (Var->isStaticDataMember() &&
4175 Var->getLexicalDeclContext()->isRecord()) {
4176 // We need to instantiate the definition of a static data member template,
4177 // and all we have is the in-class declaration of it. Instantiate a separate
4178 // declaration of the definition.
4179 TemplateDeclInstantiator Instantiator(*this, Var->getDeclContext(),
4180 TemplateArgs);
4181 Var = cast_or_null<VarDecl>(Instantiator.VisitVarTemplateSpecializationDecl(
4182 VarSpec->getSpecializedTemplate(), Def, nullptr,
4183 VarSpec->getTemplateArgsInfo(), VarSpec->getTemplateArgs().asArray()));
4184 if (Var) {
4185 llvm::PointerUnion<VarTemplateDecl *,
4186 VarTemplatePartialSpecializationDecl *> PatternPtr =
4187 VarSpec->getSpecializedTemplateOrPartial();
4188 if (VarTemplatePartialSpecializationDecl *Partial =
4189 PatternPtr.dyn_cast<VarTemplatePartialSpecializationDecl *>())
4190 cast<VarTemplateSpecializationDecl>(Var)->setInstantiationOf(
4191 Partial, &VarSpec->getTemplateInstantiationArgs());
4192
4193 // Merge the definition with the declaration.
4194 LookupResult R(*this, Var->getDeclName(), Var->getLocation(),
4195 LookupOrdinaryName, ForRedeclaration);
4196 R.addDecl(OldVar);
4197 MergeVarDecl(Var, R);
4198
4199 // Attach the initializer.
4200 InstantiateVariableInitializer(Var, Def, TemplateArgs);
4201 }
4202 } else
4203 // Complete the existing variable's definition with an appropriately
4204 // substituted type and initializer.
4205 Var = CompleteVarTemplateSpecializationDecl(VarSpec, Def, TemplateArgs);
4206
4207 PreviousContext.pop();
4208
4209 if (Var) {
4210 PassToConsumerRAII.Var = Var;
4211 Var->setTemplateSpecializationKind(OldVar->getTemplateSpecializationKind(),
4212 OldVar->getPointOfInstantiation());
4213 }
4214
4215 // This variable may have local implicit instantiations that need to be
4216 // instantiated within this scope.
4217 PerformPendingInstantiations(/*LocalOnly=*/true);
4218
4219 Local.Exit();
4220
4221 if (Recursive) {
4222 // Define any newly required vtables.
4223 DefineUsedVTables();
4224
4225 // Instantiate any pending implicit instantiations found during the
4226 // instantiation of this template.
4227 PerformPendingInstantiations();
4228
4229 // PendingInstantiations and VTableUses are restored through
4230 // SavePendingInstantiationsAndVTableUses's destructor.
4231 }
4232 }
4233
4234 void
InstantiateMemInitializers(CXXConstructorDecl * New,const CXXConstructorDecl * Tmpl,const MultiLevelTemplateArgumentList & TemplateArgs)4235 Sema::InstantiateMemInitializers(CXXConstructorDecl *New,
4236 const CXXConstructorDecl *Tmpl,
4237 const MultiLevelTemplateArgumentList &TemplateArgs) {
4238
4239 SmallVector<CXXCtorInitializer*, 4> NewInits;
4240 bool AnyErrors = Tmpl->isInvalidDecl();
4241
4242 // Instantiate all the initializers.
4243 for (const auto *Init : Tmpl->inits()) {
4244 // Only instantiate written initializers, let Sema re-construct implicit
4245 // ones.
4246 if (!Init->isWritten())
4247 continue;
4248
4249 SourceLocation EllipsisLoc;
4250
4251 if (Init->isPackExpansion()) {
4252 // This is a pack expansion. We should expand it now.
4253 TypeLoc BaseTL = Init->getTypeSourceInfo()->getTypeLoc();
4254 SmallVector<UnexpandedParameterPack, 4> Unexpanded;
4255 collectUnexpandedParameterPacks(BaseTL, Unexpanded);
4256 collectUnexpandedParameterPacks(Init->getInit(), Unexpanded);
4257 bool ShouldExpand = false;
4258 bool RetainExpansion = false;
4259 Optional<unsigned> NumExpansions;
4260 if (CheckParameterPacksForExpansion(Init->getEllipsisLoc(),
4261 BaseTL.getSourceRange(),
4262 Unexpanded,
4263 TemplateArgs, ShouldExpand,
4264 RetainExpansion,
4265 NumExpansions)) {
4266 AnyErrors = true;
4267 New->setInvalidDecl();
4268 continue;
4269 }
4270 assert(ShouldExpand && "Partial instantiation of base initializer?");
4271
4272 // Loop over all of the arguments in the argument pack(s),
4273 for (unsigned I = 0; I != *NumExpansions; ++I) {
4274 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(*this, I);
4275
4276 // Instantiate the initializer.
4277 ExprResult TempInit = SubstInitializer(Init->getInit(), TemplateArgs,
4278 /*CXXDirectInit=*/true);
4279 if (TempInit.isInvalid()) {
4280 AnyErrors = true;
4281 break;
4282 }
4283
4284 // Instantiate the base type.
4285 TypeSourceInfo *BaseTInfo = SubstType(Init->getTypeSourceInfo(),
4286 TemplateArgs,
4287 Init->getSourceLocation(),
4288 New->getDeclName());
4289 if (!BaseTInfo) {
4290 AnyErrors = true;
4291 break;
4292 }
4293
4294 // Build the initializer.
4295 MemInitResult NewInit = BuildBaseInitializer(BaseTInfo->getType(),
4296 BaseTInfo, TempInit.get(),
4297 New->getParent(),
4298 SourceLocation());
4299 if (NewInit.isInvalid()) {
4300 AnyErrors = true;
4301 break;
4302 }
4303
4304 NewInits.push_back(NewInit.get());
4305 }
4306
4307 continue;
4308 }
4309
4310 // Instantiate the initializer.
4311 ExprResult TempInit = SubstInitializer(Init->getInit(), TemplateArgs,
4312 /*CXXDirectInit=*/true);
4313 if (TempInit.isInvalid()) {
4314 AnyErrors = true;
4315 continue;
4316 }
4317
4318 MemInitResult NewInit;
4319 if (Init->isDelegatingInitializer() || Init->isBaseInitializer()) {
4320 TypeSourceInfo *TInfo = SubstType(Init->getTypeSourceInfo(),
4321 TemplateArgs,
4322 Init->getSourceLocation(),
4323 New->getDeclName());
4324 if (!TInfo) {
4325 AnyErrors = true;
4326 New->setInvalidDecl();
4327 continue;
4328 }
4329
4330 if (Init->isBaseInitializer())
4331 NewInit = BuildBaseInitializer(TInfo->getType(), TInfo, TempInit.get(),
4332 New->getParent(), EllipsisLoc);
4333 else
4334 NewInit = BuildDelegatingInitializer(TInfo, TempInit.get(),
4335 cast<CXXRecordDecl>(CurContext->getParent()));
4336 } else if (Init->isMemberInitializer()) {
4337 FieldDecl *Member = cast_or_null<FieldDecl>(FindInstantiatedDecl(
4338 Init->getMemberLocation(),
4339 Init->getMember(),
4340 TemplateArgs));
4341 if (!Member) {
4342 AnyErrors = true;
4343 New->setInvalidDecl();
4344 continue;
4345 }
4346
4347 NewInit = BuildMemberInitializer(Member, TempInit.get(),
4348 Init->getSourceLocation());
4349 } else if (Init->isIndirectMemberInitializer()) {
4350 IndirectFieldDecl *IndirectMember =
4351 cast_or_null<IndirectFieldDecl>(FindInstantiatedDecl(
4352 Init->getMemberLocation(),
4353 Init->getIndirectMember(), TemplateArgs));
4354
4355 if (!IndirectMember) {
4356 AnyErrors = true;
4357 New->setInvalidDecl();
4358 continue;
4359 }
4360
4361 NewInit = BuildMemberInitializer(IndirectMember, TempInit.get(),
4362 Init->getSourceLocation());
4363 }
4364
4365 if (NewInit.isInvalid()) {
4366 AnyErrors = true;
4367 New->setInvalidDecl();
4368 } else {
4369 NewInits.push_back(NewInit.get());
4370 }
4371 }
4372
4373 // Assign all the initializers to the new constructor.
4374 ActOnMemInitializers(New,
4375 /*FIXME: ColonLoc */
4376 SourceLocation(),
4377 NewInits,
4378 AnyErrors);
4379 }
4380
4381 // TODO: this could be templated if the various decl types used the
4382 // same method name.
isInstantiationOf(ClassTemplateDecl * Pattern,ClassTemplateDecl * Instance)4383 static bool isInstantiationOf(ClassTemplateDecl *Pattern,
4384 ClassTemplateDecl *Instance) {
4385 Pattern = Pattern->getCanonicalDecl();
4386
4387 do {
4388 Instance = Instance->getCanonicalDecl();
4389 if (Pattern == Instance) return true;
4390 Instance = Instance->getInstantiatedFromMemberTemplate();
4391 } while (Instance);
4392
4393 return false;
4394 }
4395
isInstantiationOf(FunctionTemplateDecl * Pattern,FunctionTemplateDecl * Instance)4396 static bool isInstantiationOf(FunctionTemplateDecl *Pattern,
4397 FunctionTemplateDecl *Instance) {
4398 Pattern = Pattern->getCanonicalDecl();
4399
4400 do {
4401 Instance = Instance->getCanonicalDecl();
4402 if (Pattern == Instance) return true;
4403 Instance = Instance->getInstantiatedFromMemberTemplate();
4404 } while (Instance);
4405
4406 return false;
4407 }
4408
4409 static bool
isInstantiationOf(ClassTemplatePartialSpecializationDecl * Pattern,ClassTemplatePartialSpecializationDecl * Instance)4410 isInstantiationOf(ClassTemplatePartialSpecializationDecl *Pattern,
4411 ClassTemplatePartialSpecializationDecl *Instance) {
4412 Pattern
4413 = cast<ClassTemplatePartialSpecializationDecl>(Pattern->getCanonicalDecl());
4414 do {
4415 Instance = cast<ClassTemplatePartialSpecializationDecl>(
4416 Instance->getCanonicalDecl());
4417 if (Pattern == Instance)
4418 return true;
4419 Instance = Instance->getInstantiatedFromMember();
4420 } while (Instance);
4421
4422 return false;
4423 }
4424
isInstantiationOf(CXXRecordDecl * Pattern,CXXRecordDecl * Instance)4425 static bool isInstantiationOf(CXXRecordDecl *Pattern,
4426 CXXRecordDecl *Instance) {
4427 Pattern = Pattern->getCanonicalDecl();
4428
4429 do {
4430 Instance = Instance->getCanonicalDecl();
4431 if (Pattern == Instance) return true;
4432 Instance = Instance->getInstantiatedFromMemberClass();
4433 } while (Instance);
4434
4435 return false;
4436 }
4437
isInstantiationOf(FunctionDecl * Pattern,FunctionDecl * Instance)4438 static bool isInstantiationOf(FunctionDecl *Pattern,
4439 FunctionDecl *Instance) {
4440 Pattern = Pattern->getCanonicalDecl();
4441
4442 do {
4443 Instance = Instance->getCanonicalDecl();
4444 if (Pattern == Instance) return true;
4445 Instance = Instance->getInstantiatedFromMemberFunction();
4446 } while (Instance);
4447
4448 return false;
4449 }
4450
isInstantiationOf(EnumDecl * Pattern,EnumDecl * Instance)4451 static bool isInstantiationOf(EnumDecl *Pattern,
4452 EnumDecl *Instance) {
4453 Pattern = Pattern->getCanonicalDecl();
4454
4455 do {
4456 Instance = Instance->getCanonicalDecl();
4457 if (Pattern == Instance) return true;
4458 Instance = Instance->getInstantiatedFromMemberEnum();
4459 } while (Instance);
4460
4461 return false;
4462 }
4463
isInstantiationOf(UsingShadowDecl * Pattern,UsingShadowDecl * Instance,ASTContext & C)4464 static bool isInstantiationOf(UsingShadowDecl *Pattern,
4465 UsingShadowDecl *Instance,
4466 ASTContext &C) {
4467 return declaresSameEntity(C.getInstantiatedFromUsingShadowDecl(Instance),
4468 Pattern);
4469 }
4470
isInstantiationOf(UsingDecl * Pattern,UsingDecl * Instance,ASTContext & C)4471 static bool isInstantiationOf(UsingDecl *Pattern,
4472 UsingDecl *Instance,
4473 ASTContext &C) {
4474 return declaresSameEntity(C.getInstantiatedFromUsingDecl(Instance), Pattern);
4475 }
4476
isInstantiationOf(UnresolvedUsingValueDecl * Pattern,UsingDecl * Instance,ASTContext & C)4477 static bool isInstantiationOf(UnresolvedUsingValueDecl *Pattern,
4478 UsingDecl *Instance,
4479 ASTContext &C) {
4480 return declaresSameEntity(C.getInstantiatedFromUsingDecl(Instance), Pattern);
4481 }
4482
isInstantiationOf(UnresolvedUsingTypenameDecl * Pattern,UsingDecl * Instance,ASTContext & C)4483 static bool isInstantiationOf(UnresolvedUsingTypenameDecl *Pattern,
4484 UsingDecl *Instance,
4485 ASTContext &C) {
4486 return declaresSameEntity(C.getInstantiatedFromUsingDecl(Instance), Pattern);
4487 }
4488
isInstantiationOfStaticDataMember(VarDecl * Pattern,VarDecl * Instance)4489 static bool isInstantiationOfStaticDataMember(VarDecl *Pattern,
4490 VarDecl *Instance) {
4491 assert(Instance->isStaticDataMember());
4492
4493 Pattern = Pattern->getCanonicalDecl();
4494
4495 do {
4496 Instance = Instance->getCanonicalDecl();
4497 if (Pattern == Instance) return true;
4498 Instance = Instance->getInstantiatedFromStaticDataMember();
4499 } while (Instance);
4500
4501 return false;
4502 }
4503
4504 // Other is the prospective instantiation
4505 // D is the prospective pattern
isInstantiationOf(ASTContext & Ctx,NamedDecl * D,Decl * Other)4506 static bool isInstantiationOf(ASTContext &Ctx, NamedDecl *D, Decl *Other) {
4507 if (D->getKind() != Other->getKind()) {
4508 if (UnresolvedUsingTypenameDecl *UUD
4509 = dyn_cast<UnresolvedUsingTypenameDecl>(D)) {
4510 if (UsingDecl *UD = dyn_cast<UsingDecl>(Other)) {
4511 return isInstantiationOf(UUD, UD, Ctx);
4512 }
4513 }
4514
4515 if (UnresolvedUsingValueDecl *UUD
4516 = dyn_cast<UnresolvedUsingValueDecl>(D)) {
4517 if (UsingDecl *UD = dyn_cast<UsingDecl>(Other)) {
4518 return isInstantiationOf(UUD, UD, Ctx);
4519 }
4520 }
4521
4522 return false;
4523 }
4524
4525 if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(Other))
4526 return isInstantiationOf(cast<CXXRecordDecl>(D), Record);
4527
4528 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Other))
4529 return isInstantiationOf(cast<FunctionDecl>(D), Function);
4530
4531 if (EnumDecl *Enum = dyn_cast<EnumDecl>(Other))
4532 return isInstantiationOf(cast<EnumDecl>(D), Enum);
4533
4534 if (VarDecl *Var = dyn_cast<VarDecl>(Other))
4535 if (Var->isStaticDataMember())
4536 return isInstantiationOfStaticDataMember(cast<VarDecl>(D), Var);
4537
4538 if (ClassTemplateDecl *Temp = dyn_cast<ClassTemplateDecl>(Other))
4539 return isInstantiationOf(cast<ClassTemplateDecl>(D), Temp);
4540
4541 if (FunctionTemplateDecl *Temp = dyn_cast<FunctionTemplateDecl>(Other))
4542 return isInstantiationOf(cast<FunctionTemplateDecl>(D), Temp);
4543
4544 if (ClassTemplatePartialSpecializationDecl *PartialSpec
4545 = dyn_cast<ClassTemplatePartialSpecializationDecl>(Other))
4546 return isInstantiationOf(cast<ClassTemplatePartialSpecializationDecl>(D),
4547 PartialSpec);
4548
4549 if (FieldDecl *Field = dyn_cast<FieldDecl>(Other)) {
4550 if (!Field->getDeclName()) {
4551 // This is an unnamed field.
4552 return declaresSameEntity(Ctx.getInstantiatedFromUnnamedFieldDecl(Field),
4553 cast<FieldDecl>(D));
4554 }
4555 }
4556
4557 if (UsingDecl *Using = dyn_cast<UsingDecl>(Other))
4558 return isInstantiationOf(cast<UsingDecl>(D), Using, Ctx);
4559
4560 if (UsingShadowDecl *Shadow = dyn_cast<UsingShadowDecl>(Other))
4561 return isInstantiationOf(cast<UsingShadowDecl>(D), Shadow, Ctx);
4562
4563 return D->getDeclName() && isa<NamedDecl>(Other) &&
4564 D->getDeclName() == cast<NamedDecl>(Other)->getDeclName();
4565 }
4566
4567 template<typename ForwardIterator>
findInstantiationOf(ASTContext & Ctx,NamedDecl * D,ForwardIterator first,ForwardIterator last)4568 static NamedDecl *findInstantiationOf(ASTContext &Ctx,
4569 NamedDecl *D,
4570 ForwardIterator first,
4571 ForwardIterator last) {
4572 for (; first != last; ++first)
4573 if (isInstantiationOf(Ctx, D, *first))
4574 return cast<NamedDecl>(*first);
4575
4576 return nullptr;
4577 }
4578
4579 /// \brief Finds the instantiation of the given declaration context
4580 /// within the current instantiation.
4581 ///
4582 /// \returns NULL if there was an error
FindInstantiatedContext(SourceLocation Loc,DeclContext * DC,const MultiLevelTemplateArgumentList & TemplateArgs)4583 DeclContext *Sema::FindInstantiatedContext(SourceLocation Loc, DeclContext* DC,
4584 const MultiLevelTemplateArgumentList &TemplateArgs) {
4585 if (NamedDecl *D = dyn_cast<NamedDecl>(DC)) {
4586 Decl* ID = FindInstantiatedDecl(Loc, D, TemplateArgs);
4587 return cast_or_null<DeclContext>(ID);
4588 } else return DC;
4589 }
4590
4591 /// \brief Find the instantiation of the given declaration within the
4592 /// current instantiation.
4593 ///
4594 /// This routine is intended to be used when \p D is a declaration
4595 /// referenced from within a template, that needs to mapped into the
4596 /// corresponding declaration within an instantiation. For example,
4597 /// given:
4598 ///
4599 /// \code
4600 /// template<typename T>
4601 /// struct X {
4602 /// enum Kind {
4603 /// KnownValue = sizeof(T)
4604 /// };
4605 ///
4606 /// bool getKind() const { return KnownValue; }
4607 /// };
4608 ///
4609 /// template struct X<int>;
4610 /// \endcode
4611 ///
4612 /// In the instantiation of <tt>X<int>::getKind()</tt>, we need to map the
4613 /// \p EnumConstantDecl for \p KnownValue (which refers to
4614 /// <tt>X<T>::<Kind>::KnownValue</tt>) to its instantiation
4615 /// (<tt>X<int>::<Kind>::KnownValue</tt>). \p FindInstantiatedDecl performs
4616 /// this mapping from within the instantiation of <tt>X<int></tt>.
FindInstantiatedDecl(SourceLocation Loc,NamedDecl * D,const MultiLevelTemplateArgumentList & TemplateArgs)4617 NamedDecl *Sema::FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D,
4618 const MultiLevelTemplateArgumentList &TemplateArgs) {
4619 DeclContext *ParentDC = D->getDeclContext();
4620 // FIXME: Parmeters of pointer to functions (y below) that are themselves
4621 // parameters (p below) can have their ParentDC set to the translation-unit
4622 // - thus we can not consistently check if the ParentDC of such a parameter
4623 // is Dependent or/and a FunctionOrMethod.
4624 // For e.g. this code, during Template argument deduction tries to
4625 // find an instantiated decl for (T y) when the ParentDC for y is
4626 // the translation unit.
4627 // e.g. template <class T> void Foo(auto (*p)(T y) -> decltype(y())) {}
4628 // float baz(float(*)()) { return 0.0; }
4629 // Foo(baz);
4630 // The better fix here is perhaps to ensure that a ParmVarDecl, by the time
4631 // it gets here, always has a FunctionOrMethod as its ParentDC??
4632 // For now:
4633 // - as long as we have a ParmVarDecl whose parent is non-dependent and
4634 // whose type is not instantiation dependent, do nothing to the decl
4635 // - otherwise find its instantiated decl.
4636 if (isa<ParmVarDecl>(D) && !ParentDC->isDependentContext() &&
4637 !cast<ParmVarDecl>(D)->getType()->isInstantiationDependentType())
4638 return D;
4639 if (isa<ParmVarDecl>(D) || isa<NonTypeTemplateParmDecl>(D) ||
4640 isa<TemplateTypeParmDecl>(D) || isa<TemplateTemplateParmDecl>(D) ||
4641 (ParentDC->isFunctionOrMethod() && ParentDC->isDependentContext()) ||
4642 (isa<CXXRecordDecl>(D) && cast<CXXRecordDecl>(D)->isLambda())) {
4643 // D is a local of some kind. Look into the map of local
4644 // declarations to their instantiations.
4645 if (CurrentInstantiationScope) {
4646 if (auto Found = CurrentInstantiationScope->findInstantiationOf(D)) {
4647 if (Decl *FD = Found->dyn_cast<Decl *>())
4648 return cast<NamedDecl>(FD);
4649
4650 int PackIdx = ArgumentPackSubstitutionIndex;
4651 assert(PackIdx != -1 &&
4652 "found declaration pack but not pack expanding");
4653 typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack;
4654 return cast<NamedDecl>((*Found->get<DeclArgumentPack *>())[PackIdx]);
4655 }
4656 }
4657
4658 // If we're performing a partial substitution during template argument
4659 // deduction, we may not have values for template parameters yet. They
4660 // just map to themselves.
4661 if (isa<NonTypeTemplateParmDecl>(D) || isa<TemplateTypeParmDecl>(D) ||
4662 isa<TemplateTemplateParmDecl>(D))
4663 return D;
4664
4665 if (D->isInvalidDecl())
4666 return nullptr;
4667
4668 // Normally this function only searches for already instantiated declaration
4669 // however we have to make an exclusion for local types used before
4670 // definition as in the code:
4671 //
4672 // template<typename T> void f1() {
4673 // void g1(struct x1);
4674 // struct x1 {};
4675 // }
4676 //
4677 // In this case instantiation of the type of 'g1' requires definition of
4678 // 'x1', which is defined later. Error recovery may produce an enum used
4679 // before definition. In these cases we need to instantiate relevant
4680 // declarations here.
4681 bool NeedInstantiate = false;
4682 if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D))
4683 NeedInstantiate = RD->isLocalClass();
4684 else
4685 NeedInstantiate = isa<EnumDecl>(D);
4686 if (NeedInstantiate) {
4687 Decl *Inst = SubstDecl(D, CurContext, TemplateArgs);
4688 CurrentInstantiationScope->InstantiatedLocal(D, Inst);
4689 return cast<TypeDecl>(Inst);
4690 }
4691
4692 // If we didn't find the decl, then we must have a label decl that hasn't
4693 // been found yet. Lazily instantiate it and return it now.
4694 assert(isa<LabelDecl>(D));
4695
4696 Decl *Inst = SubstDecl(D, CurContext, TemplateArgs);
4697 assert(Inst && "Failed to instantiate label??");
4698
4699 CurrentInstantiationScope->InstantiatedLocal(D, Inst);
4700 return cast<LabelDecl>(Inst);
4701 }
4702
4703 // For variable template specializations, update those that are still
4704 // type-dependent.
4705 if (VarTemplateSpecializationDecl *VarSpec =
4706 dyn_cast<VarTemplateSpecializationDecl>(D)) {
4707 bool InstantiationDependent = false;
4708 const TemplateArgumentListInfo &VarTemplateArgs =
4709 VarSpec->getTemplateArgsInfo();
4710 if (TemplateSpecializationType::anyDependentTemplateArguments(
4711 VarTemplateArgs, InstantiationDependent))
4712 D = cast<NamedDecl>(
4713 SubstDecl(D, VarSpec->getDeclContext(), TemplateArgs));
4714 return D;
4715 }
4716
4717 if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(D)) {
4718 if (!Record->isDependentContext())
4719 return D;
4720
4721 // Determine whether this record is the "templated" declaration describing
4722 // a class template or class template partial specialization.
4723 ClassTemplateDecl *ClassTemplate = Record->getDescribedClassTemplate();
4724 if (ClassTemplate)
4725 ClassTemplate = ClassTemplate->getCanonicalDecl();
4726 else if (ClassTemplatePartialSpecializationDecl *PartialSpec
4727 = dyn_cast<ClassTemplatePartialSpecializationDecl>(Record))
4728 ClassTemplate = PartialSpec->getSpecializedTemplate()->getCanonicalDecl();
4729
4730 // Walk the current context to find either the record or an instantiation of
4731 // it.
4732 DeclContext *DC = CurContext;
4733 while (!DC->isFileContext()) {
4734 // If we're performing substitution while we're inside the template
4735 // definition, we'll find our own context. We're done.
4736 if (DC->Equals(Record))
4737 return Record;
4738
4739 if (CXXRecordDecl *InstRecord = dyn_cast<CXXRecordDecl>(DC)) {
4740 // Check whether we're in the process of instantiating a class template
4741 // specialization of the template we're mapping.
4742 if (ClassTemplateSpecializationDecl *InstSpec
4743 = dyn_cast<ClassTemplateSpecializationDecl>(InstRecord)){
4744 ClassTemplateDecl *SpecTemplate = InstSpec->getSpecializedTemplate();
4745 if (ClassTemplate && isInstantiationOf(ClassTemplate, SpecTemplate))
4746 return InstRecord;
4747 }
4748
4749 // Check whether we're in the process of instantiating a member class.
4750 if (isInstantiationOf(Record, InstRecord))
4751 return InstRecord;
4752 }
4753
4754 // Move to the outer template scope.
4755 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(DC)) {
4756 if (FD->getFriendObjectKind() && FD->getDeclContext()->isFileContext()){
4757 DC = FD->getLexicalDeclContext();
4758 continue;
4759 }
4760 }
4761
4762 DC = DC->getParent();
4763 }
4764
4765 // Fall through to deal with other dependent record types (e.g.,
4766 // anonymous unions in class templates).
4767 }
4768
4769 if (!ParentDC->isDependentContext())
4770 return D;
4771
4772 ParentDC = FindInstantiatedContext(Loc, ParentDC, TemplateArgs);
4773 if (!ParentDC)
4774 return nullptr;
4775
4776 if (ParentDC != D->getDeclContext()) {
4777 // We performed some kind of instantiation in the parent context,
4778 // so now we need to look into the instantiated parent context to
4779 // find the instantiation of the declaration D.
4780
4781 // If our context used to be dependent, we may need to instantiate
4782 // it before performing lookup into that context.
4783 bool IsBeingInstantiated = false;
4784 if (CXXRecordDecl *Spec = dyn_cast<CXXRecordDecl>(ParentDC)) {
4785 if (!Spec->isDependentContext()) {
4786 QualType T = Context.getTypeDeclType(Spec);
4787 const RecordType *Tag = T->getAs<RecordType>();
4788 assert(Tag && "type of non-dependent record is not a RecordType");
4789 if (Tag->isBeingDefined())
4790 IsBeingInstantiated = true;
4791 if (!Tag->isBeingDefined() &&
4792 RequireCompleteType(Loc, T, diag::err_incomplete_type))
4793 return nullptr;
4794
4795 ParentDC = Tag->getDecl();
4796 }
4797 }
4798
4799 NamedDecl *Result = nullptr;
4800 if (D->getDeclName()) {
4801 DeclContext::lookup_result Found = ParentDC->lookup(D->getDeclName());
4802 Result = findInstantiationOf(Context, D, Found.begin(), Found.end());
4803 } else {
4804 // Since we don't have a name for the entity we're looking for,
4805 // our only option is to walk through all of the declarations to
4806 // find that name. This will occur in a few cases:
4807 //
4808 // - anonymous struct/union within a template
4809 // - unnamed class/struct/union/enum within a template
4810 //
4811 // FIXME: Find a better way to find these instantiations!
4812 Result = findInstantiationOf(Context, D,
4813 ParentDC->decls_begin(),
4814 ParentDC->decls_end());
4815 }
4816
4817 if (!Result) {
4818 if (isa<UsingShadowDecl>(D)) {
4819 // UsingShadowDecls can instantiate to nothing because of using hiding.
4820 } else if (Diags.hasErrorOccurred()) {
4821 // We've already complained about something, so most likely this
4822 // declaration failed to instantiate. There's no point in complaining
4823 // further, since this is normal in invalid code.
4824 } else if (IsBeingInstantiated) {
4825 // The class in which this member exists is currently being
4826 // instantiated, and we haven't gotten around to instantiating this
4827 // member yet. This can happen when the code uses forward declarations
4828 // of member classes, and introduces ordering dependencies via
4829 // template instantiation.
4830 Diag(Loc, diag::err_member_not_yet_instantiated)
4831 << D->getDeclName()
4832 << Context.getTypeDeclType(cast<CXXRecordDecl>(ParentDC));
4833 Diag(D->getLocation(), diag::note_non_instantiated_member_here);
4834 } else if (EnumConstantDecl *ED = dyn_cast<EnumConstantDecl>(D)) {
4835 // This enumeration constant was found when the template was defined,
4836 // but can't be found in the instantiation. This can happen if an
4837 // unscoped enumeration member is explicitly specialized.
4838 EnumDecl *Enum = cast<EnumDecl>(ED->getLexicalDeclContext());
4839 EnumDecl *Spec = cast<EnumDecl>(FindInstantiatedDecl(Loc, Enum,
4840 TemplateArgs));
4841 assert(Spec->getTemplateSpecializationKind() ==
4842 TSK_ExplicitSpecialization);
4843 Diag(Loc, diag::err_enumerator_does_not_exist)
4844 << D->getDeclName()
4845 << Context.getTypeDeclType(cast<TypeDecl>(Spec->getDeclContext()));
4846 Diag(Spec->getLocation(), diag::note_enum_specialized_here)
4847 << Context.getTypeDeclType(Spec);
4848 } else {
4849 // We should have found something, but didn't.
4850 llvm_unreachable("Unable to find instantiation of declaration!");
4851 }
4852 }
4853
4854 D = Result;
4855 }
4856
4857 return D;
4858 }
4859
4860 /// \brief Performs template instantiation for all implicit template
4861 /// instantiations we have seen until this point.
PerformPendingInstantiations(bool LocalOnly)4862 void Sema::PerformPendingInstantiations(bool LocalOnly) {
4863 while (!PendingLocalImplicitInstantiations.empty() ||
4864 (!LocalOnly && !PendingInstantiations.empty())) {
4865 PendingImplicitInstantiation Inst;
4866
4867 if (PendingLocalImplicitInstantiations.empty()) {
4868 Inst = PendingInstantiations.front();
4869 PendingInstantiations.pop_front();
4870 } else {
4871 Inst = PendingLocalImplicitInstantiations.front();
4872 PendingLocalImplicitInstantiations.pop_front();
4873 }
4874
4875 // Instantiate function definitions
4876 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Inst.first)) {
4877 bool DefinitionRequired = Function->getTemplateSpecializationKind() ==
4878 TSK_ExplicitInstantiationDefinition;
4879 InstantiateFunctionDefinition(/*FIXME:*/Inst.second, Function, true,
4880 DefinitionRequired, true);
4881 continue;
4882 }
4883
4884 // Instantiate variable definitions
4885 VarDecl *Var = cast<VarDecl>(Inst.first);
4886
4887 assert((Var->isStaticDataMember() ||
4888 isa<VarTemplateSpecializationDecl>(Var)) &&
4889 "Not a static data member, nor a variable template"
4890 " specialization?");
4891
4892 // Don't try to instantiate declarations if the most recent redeclaration
4893 // is invalid.
4894 if (Var->getMostRecentDecl()->isInvalidDecl())
4895 continue;
4896
4897 // Check if the most recent declaration has changed the specialization kind
4898 // and removed the need for implicit instantiation.
4899 switch (Var->getMostRecentDecl()->getTemplateSpecializationKind()) {
4900 case TSK_Undeclared:
4901 llvm_unreachable("Cannot instantitiate an undeclared specialization.");
4902 case TSK_ExplicitInstantiationDeclaration:
4903 case TSK_ExplicitSpecialization:
4904 continue; // No longer need to instantiate this type.
4905 case TSK_ExplicitInstantiationDefinition:
4906 // We only need an instantiation if the pending instantiation *is* the
4907 // explicit instantiation.
4908 if (Var != Var->getMostRecentDecl()) continue;
4909 case TSK_ImplicitInstantiation:
4910 break;
4911 }
4912
4913 PrettyDeclStackTraceEntry CrashInfo(*this, Var, SourceLocation(),
4914 "instantiating variable definition");
4915 bool DefinitionRequired = Var->getTemplateSpecializationKind() ==
4916 TSK_ExplicitInstantiationDefinition;
4917
4918 // Instantiate static data member definitions or variable template
4919 // specializations.
4920 InstantiateVariableDefinition(/*FIXME:*/ Inst.second, Var, true,
4921 DefinitionRequired, true);
4922 }
4923 }
4924
PerformDependentDiagnostics(const DeclContext * Pattern,const MultiLevelTemplateArgumentList & TemplateArgs)4925 void Sema::PerformDependentDiagnostics(const DeclContext *Pattern,
4926 const MultiLevelTemplateArgumentList &TemplateArgs) {
4927 for (auto DD : Pattern->ddiags()) {
4928 switch (DD->getKind()) {
4929 case DependentDiagnostic::Access:
4930 HandleDependentAccessCheck(*DD, TemplateArgs);
4931 break;
4932 }
4933 }
4934 }
4935