• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===------- SemaTemplateInstantiate.cpp - C++ Template 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.
10 //
11 //===----------------------------------------------------------------------===/
12 
13 #include "clang/Sema/SemaInternal.h"
14 #include "TreeTransform.h"
15 #include "clang/AST/ASTConsumer.h"
16 #include "clang/AST/ASTContext.h"
17 #include "clang/AST/DeclTemplate.h"
18 #include "clang/AST/Expr.h"
19 #include "clang/Basic/LangOptions.h"
20 #include "clang/Sema/DeclSpec.h"
21 #include "clang/Sema/Initialization.h"
22 #include "clang/Sema/Lookup.h"
23 #include "clang/Sema/Template.h"
24 #include "clang/Sema/TemplateDeduction.h"
25 
26 using namespace clang;
27 using namespace sema;
28 
29 //===----------------------------------------------------------------------===/
30 // Template Instantiation Support
31 //===----------------------------------------------------------------------===/
32 
33 /// \brief Retrieve the template argument list(s) that should be used to
34 /// instantiate the definition of the given declaration.
35 ///
36 /// \param D the declaration for which we are computing template instantiation
37 /// arguments.
38 ///
39 /// \param Innermost if non-NULL, the innermost template argument list.
40 ///
41 /// \param RelativeToPrimary true if we should get the template
42 /// arguments relative to the primary template, even when we're
43 /// dealing with a specialization. This is only relevant for function
44 /// template specializations.
45 ///
46 /// \param Pattern If non-NULL, indicates the pattern from which we will be
47 /// instantiating the definition of the given declaration, \p D. This is
48 /// used to determine the proper set of template instantiation arguments for
49 /// friend function template specializations.
50 MultiLevelTemplateArgumentList
getTemplateInstantiationArgs(NamedDecl * D,const TemplateArgumentList * Innermost,bool RelativeToPrimary,const FunctionDecl * Pattern)51 Sema::getTemplateInstantiationArgs(NamedDecl *D,
52                                    const TemplateArgumentList *Innermost,
53                                    bool RelativeToPrimary,
54                                    const FunctionDecl *Pattern) {
55   // Accumulate the set of template argument lists in this structure.
56   MultiLevelTemplateArgumentList Result;
57 
58   if (Innermost)
59     Result.addOuterTemplateArguments(Innermost);
60 
61   DeclContext *Ctx = dyn_cast<DeclContext>(D);
62   if (!Ctx) {
63     Ctx = D->getDeclContext();
64 
65     // If we have a template template parameter with translation unit context,
66     // then we're performing substitution into a default template argument of
67     // this template template parameter before we've constructed the template
68     // that will own this template template parameter. In this case, we
69     // use empty template parameter lists for all of the outer templates
70     // to avoid performing any substitutions.
71     if (Ctx->isTranslationUnit()) {
72       if (TemplateTemplateParmDecl *TTP
73                                       = dyn_cast<TemplateTemplateParmDecl>(D)) {
74         for (unsigned I = 0, N = TTP->getDepth() + 1; I != N; ++I)
75           Result.addOuterTemplateArguments(0, 0);
76         return Result;
77       }
78     }
79   }
80 
81   while (!Ctx->isFileContext()) {
82     // Add template arguments from a class template instantiation.
83     if (ClassTemplateSpecializationDecl *Spec
84           = dyn_cast<ClassTemplateSpecializationDecl>(Ctx)) {
85       // We're done when we hit an explicit specialization.
86       if (Spec->getSpecializationKind() == TSK_ExplicitSpecialization &&
87           !isa<ClassTemplatePartialSpecializationDecl>(Spec))
88         break;
89 
90       Result.addOuterTemplateArguments(&Spec->getTemplateInstantiationArgs());
91 
92       // If this class template specialization was instantiated from a
93       // specialized member that is a class template, we're done.
94       assert(Spec->getSpecializedTemplate() && "No class template?");
95       if (Spec->getSpecializedTemplate()->isMemberSpecialization())
96         break;
97     }
98     // Add template arguments from a function template specialization.
99     else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Ctx)) {
100       if (!RelativeToPrimary &&
101           (Function->getTemplateSpecializationKind() ==
102                                                   TSK_ExplicitSpecialization &&
103            !Function->getClassScopeSpecializationPattern()))
104         break;
105 
106       if (const TemplateArgumentList *TemplateArgs
107             = Function->getTemplateSpecializationArgs()) {
108         // Add the template arguments for this specialization.
109         Result.addOuterTemplateArguments(TemplateArgs);
110 
111         // If this function was instantiated from a specialized member that is
112         // a function template, we're done.
113         assert(Function->getPrimaryTemplate() && "No function template?");
114         if (Function->getPrimaryTemplate()->isMemberSpecialization())
115           break;
116       } else if (FunctionTemplateDecl *FunTmpl
117                                    = Function->getDescribedFunctionTemplate()) {
118         // Add the "injected" template arguments.
119         std::pair<const TemplateArgument *, unsigned>
120           Injected = FunTmpl->getInjectedTemplateArgs();
121         Result.addOuterTemplateArguments(Injected.first, Injected.second);
122       }
123 
124       // If this is a friend declaration and it declares an entity at
125       // namespace scope, take arguments from its lexical parent
126       // instead of its semantic parent, unless of course the pattern we're
127       // instantiating actually comes from the file's context!
128       if (Function->getFriendObjectKind() &&
129           Function->getDeclContext()->isFileContext() &&
130           (!Pattern || !Pattern->getLexicalDeclContext()->isFileContext())) {
131         Ctx = Function->getLexicalDeclContext();
132         RelativeToPrimary = false;
133         continue;
134       }
135     } else if (CXXRecordDecl *Rec = dyn_cast<CXXRecordDecl>(Ctx)) {
136       if (ClassTemplateDecl *ClassTemplate = Rec->getDescribedClassTemplate()) {
137         QualType T = ClassTemplate->getInjectedClassNameSpecialization();
138         const TemplateSpecializationType *TST
139           = cast<TemplateSpecializationType>(Context.getCanonicalType(T));
140         Result.addOuterTemplateArguments(TST->getArgs(), TST->getNumArgs());
141         if (ClassTemplate->isMemberSpecialization())
142           break;
143       }
144     }
145 
146     Ctx = Ctx->getParent();
147     RelativeToPrimary = false;
148   }
149 
150   return Result;
151 }
152 
isInstantiationRecord() const153 bool Sema::ActiveTemplateInstantiation::isInstantiationRecord() const {
154   switch (Kind) {
155   case TemplateInstantiation:
156   case ExceptionSpecInstantiation:
157   case DefaultTemplateArgumentInstantiation:
158   case DefaultFunctionArgumentInstantiation:
159   case ExplicitTemplateArgumentSubstitution:
160   case DeducedTemplateArgumentSubstitution:
161   case PriorTemplateArgumentSubstitution:
162     return true;
163 
164   case DefaultTemplateArgumentChecking:
165     return false;
166   }
167 
168   llvm_unreachable("Invalid InstantiationKind!");
169 }
170 
171 Sema::InstantiatingTemplate::
InstantiatingTemplate(Sema & SemaRef,SourceLocation PointOfInstantiation,Decl * Entity,SourceRange InstantiationRange)172 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
173                       Decl *Entity,
174                       SourceRange InstantiationRange)
175   : SemaRef(SemaRef),
176     SavedInNonInstantiationSFINAEContext(
177                                         SemaRef.InNonInstantiationSFINAEContext)
178 {
179   Invalid = CheckInstantiationDepth(PointOfInstantiation,
180                                     InstantiationRange);
181   if (!Invalid) {
182     ActiveTemplateInstantiation Inst;
183     Inst.Kind = ActiveTemplateInstantiation::TemplateInstantiation;
184     Inst.PointOfInstantiation = PointOfInstantiation;
185     Inst.Entity = Entity;
186     Inst.TemplateArgs = 0;
187     Inst.NumTemplateArgs = 0;
188     Inst.InstantiationRange = InstantiationRange;
189     SemaRef.InNonInstantiationSFINAEContext = false;
190     SemaRef.ActiveTemplateInstantiations.push_back(Inst);
191   }
192 }
193 
194 Sema::InstantiatingTemplate::
InstantiatingTemplate(Sema & SemaRef,SourceLocation PointOfInstantiation,FunctionDecl * Entity,ExceptionSpecification,SourceRange InstantiationRange)195 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
196                       FunctionDecl *Entity, ExceptionSpecification,
197                       SourceRange InstantiationRange)
198   : SemaRef(SemaRef),
199     SavedInNonInstantiationSFINAEContext(
200                                         SemaRef.InNonInstantiationSFINAEContext)
201 {
202   Invalid = CheckInstantiationDepth(PointOfInstantiation,
203                                     InstantiationRange);
204   if (!Invalid) {
205     ActiveTemplateInstantiation Inst;
206     Inst.Kind = ActiveTemplateInstantiation::ExceptionSpecInstantiation;
207     Inst.PointOfInstantiation = PointOfInstantiation;
208     Inst.Entity = Entity;
209     Inst.TemplateArgs = 0;
210     Inst.NumTemplateArgs = 0;
211     Inst.InstantiationRange = InstantiationRange;
212     SemaRef.InNonInstantiationSFINAEContext = false;
213     SemaRef.ActiveTemplateInstantiations.push_back(Inst);
214   }
215 }
216 
217 Sema::InstantiatingTemplate::
InstantiatingTemplate(Sema & SemaRef,SourceLocation PointOfInstantiation,TemplateDecl * Template,ArrayRef<TemplateArgument> TemplateArgs,SourceRange InstantiationRange)218 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
219                       TemplateDecl *Template,
220                       ArrayRef<TemplateArgument> TemplateArgs,
221                       SourceRange InstantiationRange)
222   : SemaRef(SemaRef),
223     SavedInNonInstantiationSFINAEContext(
224                                      SemaRef.InNonInstantiationSFINAEContext)
225 {
226   Invalid = CheckInstantiationDepth(PointOfInstantiation,
227                                     InstantiationRange);
228   if (!Invalid) {
229     ActiveTemplateInstantiation Inst;
230     Inst.Kind
231       = ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation;
232     Inst.PointOfInstantiation = PointOfInstantiation;
233     Inst.Entity = Template;
234     Inst.TemplateArgs = TemplateArgs.data();
235     Inst.NumTemplateArgs = TemplateArgs.size();
236     Inst.InstantiationRange = InstantiationRange;
237     SemaRef.InNonInstantiationSFINAEContext = false;
238     SemaRef.ActiveTemplateInstantiations.push_back(Inst);
239   }
240 }
241 
242 Sema::InstantiatingTemplate::
InstantiatingTemplate(Sema & SemaRef,SourceLocation PointOfInstantiation,FunctionTemplateDecl * FunctionTemplate,ArrayRef<TemplateArgument> TemplateArgs,ActiveTemplateInstantiation::InstantiationKind Kind,sema::TemplateDeductionInfo & DeductionInfo,SourceRange InstantiationRange)243 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
244                       FunctionTemplateDecl *FunctionTemplate,
245                       ArrayRef<TemplateArgument> TemplateArgs,
246                       ActiveTemplateInstantiation::InstantiationKind Kind,
247                       sema::TemplateDeductionInfo &DeductionInfo,
248                       SourceRange InstantiationRange)
249   : SemaRef(SemaRef),
250     SavedInNonInstantiationSFINAEContext(
251                                      SemaRef.InNonInstantiationSFINAEContext)
252 {
253   Invalid = CheckInstantiationDepth(PointOfInstantiation, InstantiationRange);
254   if (!Invalid) {
255     ActiveTemplateInstantiation Inst;
256     Inst.Kind = Kind;
257     Inst.PointOfInstantiation = PointOfInstantiation;
258     Inst.Entity = FunctionTemplate;
259     Inst.TemplateArgs = TemplateArgs.data();
260     Inst.NumTemplateArgs = TemplateArgs.size();
261     Inst.DeductionInfo = &DeductionInfo;
262     Inst.InstantiationRange = InstantiationRange;
263     SemaRef.InNonInstantiationSFINAEContext = false;
264     SemaRef.ActiveTemplateInstantiations.push_back(Inst);
265 
266     if (!Inst.isInstantiationRecord())
267       ++SemaRef.NonInstantiationEntries;
268   }
269 }
270 
271 Sema::InstantiatingTemplate::
InstantiatingTemplate(Sema & SemaRef,SourceLocation PointOfInstantiation,ClassTemplatePartialSpecializationDecl * PartialSpec,ArrayRef<TemplateArgument> TemplateArgs,sema::TemplateDeductionInfo & DeductionInfo,SourceRange InstantiationRange)272 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
273                       ClassTemplatePartialSpecializationDecl *PartialSpec,
274                       ArrayRef<TemplateArgument> TemplateArgs,
275                       sema::TemplateDeductionInfo &DeductionInfo,
276                       SourceRange InstantiationRange)
277   : SemaRef(SemaRef),
278     SavedInNonInstantiationSFINAEContext(
279                                      SemaRef.InNonInstantiationSFINAEContext)
280 {
281   Invalid = CheckInstantiationDepth(PointOfInstantiation, InstantiationRange);
282   if (!Invalid) {
283     ActiveTemplateInstantiation Inst;
284     Inst.Kind = ActiveTemplateInstantiation::DeducedTemplateArgumentSubstitution;
285     Inst.PointOfInstantiation = PointOfInstantiation;
286     Inst.Entity = PartialSpec;
287     Inst.TemplateArgs = TemplateArgs.data();
288     Inst.NumTemplateArgs = TemplateArgs.size();
289     Inst.DeductionInfo = &DeductionInfo;
290     Inst.InstantiationRange = InstantiationRange;
291     SemaRef.InNonInstantiationSFINAEContext = false;
292     SemaRef.ActiveTemplateInstantiations.push_back(Inst);
293   }
294 }
295 
296 Sema::InstantiatingTemplate::
InstantiatingTemplate(Sema & SemaRef,SourceLocation PointOfInstantiation,ParmVarDecl * Param,ArrayRef<TemplateArgument> TemplateArgs,SourceRange InstantiationRange)297 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
298                       ParmVarDecl *Param,
299                       ArrayRef<TemplateArgument> TemplateArgs,
300                       SourceRange InstantiationRange)
301   : SemaRef(SemaRef),
302     SavedInNonInstantiationSFINAEContext(
303                                      SemaRef.InNonInstantiationSFINAEContext)
304 {
305   Invalid = CheckInstantiationDepth(PointOfInstantiation, InstantiationRange);
306   if (!Invalid) {
307     ActiveTemplateInstantiation Inst;
308     Inst.Kind
309       = ActiveTemplateInstantiation::DefaultFunctionArgumentInstantiation;
310     Inst.PointOfInstantiation = PointOfInstantiation;
311     Inst.Entity = Param;
312     Inst.TemplateArgs = TemplateArgs.data();
313     Inst.NumTemplateArgs = TemplateArgs.size();
314     Inst.InstantiationRange = InstantiationRange;
315     SemaRef.InNonInstantiationSFINAEContext = false;
316     SemaRef.ActiveTemplateInstantiations.push_back(Inst);
317   }
318 }
319 
320 Sema::InstantiatingTemplate::
InstantiatingTemplate(Sema & SemaRef,SourceLocation PointOfInstantiation,NamedDecl * Template,NonTypeTemplateParmDecl * Param,ArrayRef<TemplateArgument> TemplateArgs,SourceRange InstantiationRange)321 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
322                       NamedDecl *Template, NonTypeTemplateParmDecl *Param,
323                       ArrayRef<TemplateArgument> TemplateArgs,
324                       SourceRange InstantiationRange)
325   : SemaRef(SemaRef),
326     SavedInNonInstantiationSFINAEContext(
327                                      SemaRef.InNonInstantiationSFINAEContext)
328 {
329   Invalid = CheckInstantiationDepth(PointOfInstantiation, InstantiationRange);
330   if (!Invalid) {
331     ActiveTemplateInstantiation Inst;
332     Inst.Kind = ActiveTemplateInstantiation::PriorTemplateArgumentSubstitution;
333     Inst.PointOfInstantiation = PointOfInstantiation;
334     Inst.Template = Template;
335     Inst.Entity = Param;
336     Inst.TemplateArgs = TemplateArgs.data();
337     Inst.NumTemplateArgs = TemplateArgs.size();
338     Inst.InstantiationRange = InstantiationRange;
339     SemaRef.InNonInstantiationSFINAEContext = false;
340     SemaRef.ActiveTemplateInstantiations.push_back(Inst);
341   }
342 }
343 
344 Sema::InstantiatingTemplate::
InstantiatingTemplate(Sema & SemaRef,SourceLocation PointOfInstantiation,NamedDecl * Template,TemplateTemplateParmDecl * Param,ArrayRef<TemplateArgument> TemplateArgs,SourceRange InstantiationRange)345 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
346                       NamedDecl *Template, TemplateTemplateParmDecl *Param,
347                       ArrayRef<TemplateArgument> TemplateArgs,
348                       SourceRange InstantiationRange)
349   : SemaRef(SemaRef),
350     SavedInNonInstantiationSFINAEContext(
351                                      SemaRef.InNonInstantiationSFINAEContext)
352 {
353   Invalid = CheckInstantiationDepth(PointOfInstantiation, InstantiationRange);
354   if (!Invalid) {
355     ActiveTemplateInstantiation Inst;
356     Inst.Kind = ActiveTemplateInstantiation::PriorTemplateArgumentSubstitution;
357     Inst.PointOfInstantiation = PointOfInstantiation;
358     Inst.Template = Template;
359     Inst.Entity = Param;
360     Inst.TemplateArgs = TemplateArgs.data();
361     Inst.NumTemplateArgs = TemplateArgs.size();
362     Inst.InstantiationRange = InstantiationRange;
363     SemaRef.InNonInstantiationSFINAEContext = false;
364     SemaRef.ActiveTemplateInstantiations.push_back(Inst);
365   }
366 }
367 
368 Sema::InstantiatingTemplate::
InstantiatingTemplate(Sema & SemaRef,SourceLocation PointOfInstantiation,TemplateDecl * Template,NamedDecl * Param,ArrayRef<TemplateArgument> TemplateArgs,SourceRange InstantiationRange)369 InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
370                       TemplateDecl *Template, NamedDecl *Param,
371                       ArrayRef<TemplateArgument> TemplateArgs,
372                       SourceRange InstantiationRange)
373   : SemaRef(SemaRef),
374     SavedInNonInstantiationSFINAEContext(
375                                      SemaRef.InNonInstantiationSFINAEContext)
376 {
377   Invalid = false;
378 
379   ActiveTemplateInstantiation Inst;
380   Inst.Kind = ActiveTemplateInstantiation::DefaultTemplateArgumentChecking;
381   Inst.PointOfInstantiation = PointOfInstantiation;
382   Inst.Template = Template;
383   Inst.Entity = Param;
384   Inst.TemplateArgs = TemplateArgs.data();
385   Inst.NumTemplateArgs = TemplateArgs.size();
386   Inst.InstantiationRange = InstantiationRange;
387   SemaRef.InNonInstantiationSFINAEContext = false;
388   SemaRef.ActiveTemplateInstantiations.push_back(Inst);
389 
390   assert(!Inst.isInstantiationRecord());
391   ++SemaRef.NonInstantiationEntries;
392 }
393 
Clear()394 void Sema::InstantiatingTemplate::Clear() {
395   if (!Invalid) {
396     if (!SemaRef.ActiveTemplateInstantiations.back().isInstantiationRecord()) {
397       assert(SemaRef.NonInstantiationEntries > 0);
398       --SemaRef.NonInstantiationEntries;
399     }
400     SemaRef.InNonInstantiationSFINAEContext
401       = SavedInNonInstantiationSFINAEContext;
402     SemaRef.ActiveTemplateInstantiations.pop_back();
403     Invalid = true;
404   }
405 }
406 
CheckInstantiationDepth(SourceLocation PointOfInstantiation,SourceRange InstantiationRange)407 bool Sema::InstantiatingTemplate::CheckInstantiationDepth(
408                                         SourceLocation PointOfInstantiation,
409                                            SourceRange InstantiationRange) {
410   assert(SemaRef.NonInstantiationEntries <=
411                                    SemaRef.ActiveTemplateInstantiations.size());
412   if ((SemaRef.ActiveTemplateInstantiations.size() -
413           SemaRef.NonInstantiationEntries)
414         <= SemaRef.getLangOpts().InstantiationDepth)
415     return false;
416 
417   SemaRef.Diag(PointOfInstantiation,
418                diag::err_template_recursion_depth_exceeded)
419     << SemaRef.getLangOpts().InstantiationDepth
420     << InstantiationRange;
421   SemaRef.Diag(PointOfInstantiation, diag::note_template_recursion_depth)
422     << SemaRef.getLangOpts().InstantiationDepth;
423   return true;
424 }
425 
426 /// \brief Prints the current instantiation stack through a series of
427 /// notes.
PrintInstantiationStack()428 void Sema::PrintInstantiationStack() {
429   // Determine which template instantiations to skip, if any.
430   unsigned SkipStart = ActiveTemplateInstantiations.size(), SkipEnd = SkipStart;
431   unsigned Limit = Diags.getTemplateBacktraceLimit();
432   if (Limit && Limit < ActiveTemplateInstantiations.size()) {
433     SkipStart = Limit / 2 + Limit % 2;
434     SkipEnd = ActiveTemplateInstantiations.size() - Limit / 2;
435   }
436 
437   // FIXME: In all of these cases, we need to show the template arguments
438   unsigned InstantiationIdx = 0;
439   for (SmallVector<ActiveTemplateInstantiation, 16>::reverse_iterator
440          Active = ActiveTemplateInstantiations.rbegin(),
441          ActiveEnd = ActiveTemplateInstantiations.rend();
442        Active != ActiveEnd;
443        ++Active, ++InstantiationIdx) {
444     // Skip this instantiation?
445     if (InstantiationIdx >= SkipStart && InstantiationIdx < SkipEnd) {
446       if (InstantiationIdx == SkipStart) {
447         // Note that we're skipping instantiations.
448         Diags.Report(Active->PointOfInstantiation,
449                      diag::note_instantiation_contexts_suppressed)
450           << unsigned(ActiveTemplateInstantiations.size() - Limit);
451       }
452       continue;
453     }
454 
455     switch (Active->Kind) {
456     case ActiveTemplateInstantiation::TemplateInstantiation: {
457       Decl *D = Active->Entity;
458       if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(D)) {
459         unsigned DiagID = diag::note_template_member_class_here;
460         if (isa<ClassTemplateSpecializationDecl>(Record))
461           DiagID = diag::note_template_class_instantiation_here;
462         Diags.Report(Active->PointOfInstantiation, DiagID)
463           << Context.getTypeDeclType(Record)
464           << Active->InstantiationRange;
465       } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
466         unsigned DiagID;
467         if (Function->getPrimaryTemplate())
468           DiagID = diag::note_function_template_spec_here;
469         else
470           DiagID = diag::note_template_member_function_here;
471         Diags.Report(Active->PointOfInstantiation, DiagID)
472           << Function
473           << Active->InstantiationRange;
474       } else if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
475         Diags.Report(Active->PointOfInstantiation,
476                      diag::note_template_static_data_member_def_here)
477           << VD
478           << Active->InstantiationRange;
479       } else if (EnumDecl *ED = dyn_cast<EnumDecl>(D)) {
480         Diags.Report(Active->PointOfInstantiation,
481                      diag::note_template_enum_def_here)
482           << ED
483           << Active->InstantiationRange;
484       } else {
485         Diags.Report(Active->PointOfInstantiation,
486                      diag::note_template_type_alias_instantiation_here)
487           << cast<TypeAliasTemplateDecl>(D)
488           << Active->InstantiationRange;
489       }
490       break;
491     }
492 
493     case ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation: {
494       TemplateDecl *Template = cast<TemplateDecl>(Active->Entity);
495       SmallVector<char, 128> TemplateArgsStr;
496       llvm::raw_svector_ostream OS(TemplateArgsStr);
497       Template->printName(OS);
498       TemplateSpecializationType::PrintTemplateArgumentList(OS,
499                                                          Active->TemplateArgs,
500                                                       Active->NumTemplateArgs,
501                                                       getPrintingPolicy());
502       Diags.Report(Active->PointOfInstantiation,
503                    diag::note_default_arg_instantiation_here)
504         << OS.str()
505         << Active->InstantiationRange;
506       break;
507     }
508 
509     case ActiveTemplateInstantiation::ExplicitTemplateArgumentSubstitution: {
510       FunctionTemplateDecl *FnTmpl = cast<FunctionTemplateDecl>(Active->Entity);
511       Diags.Report(Active->PointOfInstantiation,
512                    diag::note_explicit_template_arg_substitution_here)
513         << FnTmpl
514         << getTemplateArgumentBindingsText(FnTmpl->getTemplateParameters(),
515                                            Active->TemplateArgs,
516                                            Active->NumTemplateArgs)
517         << Active->InstantiationRange;
518       break;
519     }
520 
521     case ActiveTemplateInstantiation::DeducedTemplateArgumentSubstitution:
522       if (ClassTemplatePartialSpecializationDecl *PartialSpec =
523             dyn_cast<ClassTemplatePartialSpecializationDecl>(Active->Entity)) {
524         Diags.Report(Active->PointOfInstantiation,
525                      diag::note_partial_spec_deduct_instantiation_here)
526           << Context.getTypeDeclType(PartialSpec)
527           << getTemplateArgumentBindingsText(
528                                          PartialSpec->getTemplateParameters(),
529                                              Active->TemplateArgs,
530                                              Active->NumTemplateArgs)
531           << Active->InstantiationRange;
532       } else {
533         FunctionTemplateDecl *FnTmpl
534           = cast<FunctionTemplateDecl>(Active->Entity);
535         Diags.Report(Active->PointOfInstantiation,
536                      diag::note_function_template_deduction_instantiation_here)
537           << FnTmpl
538           << getTemplateArgumentBindingsText(FnTmpl->getTemplateParameters(),
539                                              Active->TemplateArgs,
540                                              Active->NumTemplateArgs)
541           << Active->InstantiationRange;
542       }
543       break;
544 
545     case ActiveTemplateInstantiation::DefaultFunctionArgumentInstantiation: {
546       ParmVarDecl *Param = cast<ParmVarDecl>(Active->Entity);
547       FunctionDecl *FD = cast<FunctionDecl>(Param->getDeclContext());
548 
549       SmallVector<char, 128> TemplateArgsStr;
550       llvm::raw_svector_ostream OS(TemplateArgsStr);
551       FD->printName(OS);
552       TemplateSpecializationType::PrintTemplateArgumentList(OS,
553                                                          Active->TemplateArgs,
554                                                       Active->NumTemplateArgs,
555                                                       getPrintingPolicy());
556       Diags.Report(Active->PointOfInstantiation,
557                    diag::note_default_function_arg_instantiation_here)
558         << OS.str()
559         << Active->InstantiationRange;
560       break;
561     }
562 
563     case ActiveTemplateInstantiation::PriorTemplateArgumentSubstitution: {
564       NamedDecl *Parm = cast<NamedDecl>(Active->Entity);
565       std::string Name;
566       if (!Parm->getName().empty())
567         Name = std::string(" '") + Parm->getName().str() + "'";
568 
569       TemplateParameterList *TemplateParams = 0;
570       if (TemplateDecl *Template = dyn_cast<TemplateDecl>(Active->Template))
571         TemplateParams = Template->getTemplateParameters();
572       else
573         TemplateParams =
574           cast<ClassTemplatePartialSpecializationDecl>(Active->Template)
575                                                       ->getTemplateParameters();
576       Diags.Report(Active->PointOfInstantiation,
577                    diag::note_prior_template_arg_substitution)
578         << isa<TemplateTemplateParmDecl>(Parm)
579         << Name
580         << getTemplateArgumentBindingsText(TemplateParams,
581                                            Active->TemplateArgs,
582                                            Active->NumTemplateArgs)
583         << Active->InstantiationRange;
584       break;
585     }
586 
587     case ActiveTemplateInstantiation::DefaultTemplateArgumentChecking: {
588       TemplateParameterList *TemplateParams = 0;
589       if (TemplateDecl *Template = dyn_cast<TemplateDecl>(Active->Template))
590         TemplateParams = Template->getTemplateParameters();
591       else
592         TemplateParams =
593           cast<ClassTemplatePartialSpecializationDecl>(Active->Template)
594                                                       ->getTemplateParameters();
595 
596       Diags.Report(Active->PointOfInstantiation,
597                    diag::note_template_default_arg_checking)
598         << getTemplateArgumentBindingsText(TemplateParams,
599                                            Active->TemplateArgs,
600                                            Active->NumTemplateArgs)
601         << Active->InstantiationRange;
602       break;
603     }
604 
605     case ActiveTemplateInstantiation::ExceptionSpecInstantiation:
606       Diags.Report(Active->PointOfInstantiation,
607                    diag::note_template_exception_spec_instantiation_here)
608         << cast<FunctionDecl>(Active->Entity)
609         << Active->InstantiationRange;
610       break;
611     }
612   }
613 }
614 
isSFINAEContext() const615 Optional<TemplateDeductionInfo *> Sema::isSFINAEContext() const {
616   if (InNonInstantiationSFINAEContext)
617     return Optional<TemplateDeductionInfo *>(0);
618 
619   for (SmallVector<ActiveTemplateInstantiation, 16>::const_reverse_iterator
620          Active = ActiveTemplateInstantiations.rbegin(),
621          ActiveEnd = ActiveTemplateInstantiations.rend();
622        Active != ActiveEnd;
623        ++Active)
624   {
625     switch(Active->Kind) {
626     case ActiveTemplateInstantiation::TemplateInstantiation:
627       // An instantiation of an alias template may or may not be a SFINAE
628       // context, depending on what else is on the stack.
629       if (isa<TypeAliasTemplateDecl>(Active->Entity))
630         break;
631       // Fall through.
632     case ActiveTemplateInstantiation::DefaultFunctionArgumentInstantiation:
633     case ActiveTemplateInstantiation::ExceptionSpecInstantiation:
634       // This is a template instantiation, so there is no SFINAE.
635       return None;
636 
637     case ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation:
638     case ActiveTemplateInstantiation::PriorTemplateArgumentSubstitution:
639     case ActiveTemplateInstantiation::DefaultTemplateArgumentChecking:
640       // A default template argument instantiation and substitution into
641       // template parameters with arguments for prior parameters may or may
642       // not be a SFINAE context; look further up the stack.
643       break;
644 
645     case ActiveTemplateInstantiation::ExplicitTemplateArgumentSubstitution:
646     case ActiveTemplateInstantiation::DeducedTemplateArgumentSubstitution:
647       // We're either substitution explicitly-specified template arguments
648       // or deduced template arguments, so SFINAE applies.
649       assert(Active->DeductionInfo && "Missing deduction info pointer");
650       return Active->DeductionInfo;
651     }
652   }
653 
654   return None;
655 }
656 
657 /// \brief Retrieve the depth and index of a parameter pack.
658 static std::pair<unsigned, unsigned>
getDepthAndIndex(NamedDecl * ND)659 getDepthAndIndex(NamedDecl *ND) {
660   if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(ND))
661     return std::make_pair(TTP->getDepth(), TTP->getIndex());
662 
663   if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(ND))
664     return std::make_pair(NTTP->getDepth(), NTTP->getIndex());
665 
666   TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(ND);
667   return std::make_pair(TTP->getDepth(), TTP->getIndex());
668 }
669 
670 //===----------------------------------------------------------------------===/
671 // Template Instantiation for Types
672 //===----------------------------------------------------------------------===/
673 namespace {
674   class TemplateInstantiator : public TreeTransform<TemplateInstantiator> {
675     const MultiLevelTemplateArgumentList &TemplateArgs;
676     SourceLocation Loc;
677     DeclarationName Entity;
678 
679   public:
680     typedef TreeTransform<TemplateInstantiator> inherited;
681 
TemplateInstantiator(Sema & SemaRef,const MultiLevelTemplateArgumentList & TemplateArgs,SourceLocation Loc,DeclarationName Entity)682     TemplateInstantiator(Sema &SemaRef,
683                          const MultiLevelTemplateArgumentList &TemplateArgs,
684                          SourceLocation Loc,
685                          DeclarationName Entity)
686       : inherited(SemaRef), TemplateArgs(TemplateArgs), Loc(Loc),
687         Entity(Entity) { }
688 
689     /// \brief Determine whether the given type \p T has already been
690     /// transformed.
691     ///
692     /// For the purposes of template instantiation, a type has already been
693     /// transformed if it is NULL or if it is not dependent.
694     bool AlreadyTransformed(QualType T);
695 
696     /// \brief Returns the location of the entity being instantiated, if known.
getBaseLocation()697     SourceLocation getBaseLocation() { return Loc; }
698 
699     /// \brief Returns the name of the entity being instantiated, if any.
getBaseEntity()700     DeclarationName getBaseEntity() { return Entity; }
701 
702     /// \brief Sets the "base" location and entity when that
703     /// information is known based on another transformation.
setBase(SourceLocation Loc,DeclarationName Entity)704     void setBase(SourceLocation Loc, DeclarationName Entity) {
705       this->Loc = Loc;
706       this->Entity = Entity;
707     }
708 
TryExpandParameterPacks(SourceLocation EllipsisLoc,SourceRange PatternRange,llvm::ArrayRef<UnexpandedParameterPack> Unexpanded,bool & ShouldExpand,bool & RetainExpansion,Optional<unsigned> & NumExpansions)709     bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
710                                  SourceRange PatternRange,
711                              llvm::ArrayRef<UnexpandedParameterPack> Unexpanded,
712                                  bool &ShouldExpand,
713                                  bool &RetainExpansion,
714                                  Optional<unsigned> &NumExpansions) {
715       return getSema().CheckParameterPacksForExpansion(EllipsisLoc,
716                                                        PatternRange, Unexpanded,
717                                                        TemplateArgs,
718                                                        ShouldExpand,
719                                                        RetainExpansion,
720                                                        NumExpansions);
721     }
722 
ExpandingFunctionParameterPack(ParmVarDecl * Pack)723     void ExpandingFunctionParameterPack(ParmVarDecl *Pack) {
724       SemaRef.CurrentInstantiationScope->MakeInstantiatedLocalArgPack(Pack);
725     }
726 
ForgetPartiallySubstitutedPack()727     TemplateArgument ForgetPartiallySubstitutedPack() {
728       TemplateArgument Result;
729       if (NamedDecl *PartialPack
730             = SemaRef.CurrentInstantiationScope->getPartiallySubstitutedPack()){
731         MultiLevelTemplateArgumentList &TemplateArgs
732           = const_cast<MultiLevelTemplateArgumentList &>(this->TemplateArgs);
733         unsigned Depth, Index;
734         llvm::tie(Depth, Index) = getDepthAndIndex(PartialPack);
735         if (TemplateArgs.hasTemplateArgument(Depth, Index)) {
736           Result = TemplateArgs(Depth, Index);
737           TemplateArgs.setArgument(Depth, Index, TemplateArgument());
738         }
739       }
740 
741       return Result;
742     }
743 
RememberPartiallySubstitutedPack(TemplateArgument Arg)744     void RememberPartiallySubstitutedPack(TemplateArgument Arg) {
745       if (Arg.isNull())
746         return;
747 
748       if (NamedDecl *PartialPack
749             = SemaRef.CurrentInstantiationScope->getPartiallySubstitutedPack()){
750         MultiLevelTemplateArgumentList &TemplateArgs
751         = const_cast<MultiLevelTemplateArgumentList &>(this->TemplateArgs);
752         unsigned Depth, Index;
753         llvm::tie(Depth, Index) = getDepthAndIndex(PartialPack);
754         TemplateArgs.setArgument(Depth, Index, Arg);
755       }
756     }
757 
758     /// \brief Transform the given declaration by instantiating a reference to
759     /// this declaration.
760     Decl *TransformDecl(SourceLocation Loc, Decl *D);
761 
transformAttrs(Decl * Old,Decl * New)762     void transformAttrs(Decl *Old, Decl *New) {
763       SemaRef.InstantiateAttrs(TemplateArgs, Old, New);
764     }
765 
transformedLocalDecl(Decl * Old,Decl * New)766     void transformedLocalDecl(Decl *Old, Decl *New) {
767       SemaRef.CurrentInstantiationScope->InstantiatedLocal(Old, New);
768     }
769 
770     /// \brief Transform the definition of the given declaration by
771     /// instantiating it.
772     Decl *TransformDefinition(SourceLocation Loc, Decl *D);
773 
774     /// \brief Transform the first qualifier within a scope by instantiating the
775     /// declaration.
776     NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc);
777 
778     /// \brief Rebuild the exception declaration and register the declaration
779     /// as an instantiated local.
780     VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
781                                   TypeSourceInfo *Declarator,
782                                   SourceLocation StartLoc,
783                                   SourceLocation NameLoc,
784                                   IdentifierInfo *Name);
785 
786     /// \brief Rebuild the Objective-C exception declaration and register the
787     /// declaration as an instantiated local.
788     VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
789                                       TypeSourceInfo *TSInfo, QualType T);
790 
791     /// \brief Check for tag mismatches when instantiating an
792     /// elaborated type.
793     QualType RebuildElaboratedType(SourceLocation KeywordLoc,
794                                    ElaboratedTypeKeyword Keyword,
795                                    NestedNameSpecifierLoc QualifierLoc,
796                                    QualType T);
797 
798     TemplateName TransformTemplateName(CXXScopeSpec &SS,
799                                        TemplateName Name,
800                                        SourceLocation NameLoc,
801                                        QualType ObjectType = QualType(),
802                                        NamedDecl *FirstQualifierInScope = 0);
803 
804     ExprResult TransformPredefinedExpr(PredefinedExpr *E);
805     ExprResult TransformDeclRefExpr(DeclRefExpr *E);
806     ExprResult TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E);
807 
808     ExprResult TransformTemplateParmRefExpr(DeclRefExpr *E,
809                                             NonTypeTemplateParmDecl *D);
810     ExprResult TransformSubstNonTypeTemplateParmPackExpr(
811                                            SubstNonTypeTemplateParmPackExpr *E);
812 
813     /// \brief Rebuild a DeclRefExpr for a ParmVarDecl reference.
814     ExprResult RebuildParmVarDeclRefExpr(ParmVarDecl *PD, SourceLocation Loc);
815 
816     /// \brief Transform a reference to a function parameter pack.
817     ExprResult TransformFunctionParmPackRefExpr(DeclRefExpr *E,
818                                                 ParmVarDecl *PD);
819 
820     /// \brief Transform a FunctionParmPackExpr which was built when we couldn't
821     /// expand a function parameter pack reference which refers to an expanded
822     /// pack.
823     ExprResult TransformFunctionParmPackExpr(FunctionParmPackExpr *E);
824 
825     QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
826                                         FunctionProtoTypeLoc TL);
827     QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
828                                         FunctionProtoTypeLoc TL,
829                                         CXXRecordDecl *ThisContext,
830                                         unsigned ThisTypeQuals);
831 
832     ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
833                                             int indexAdjustment,
834                                             Optional<unsigned> NumExpansions,
835                                             bool ExpectParameterPack);
836 
837     /// \brief Transforms a template type parameter type by performing
838     /// substitution of the corresponding template type argument.
839     QualType TransformTemplateTypeParmType(TypeLocBuilder &TLB,
840                                            TemplateTypeParmTypeLoc TL);
841 
842     /// \brief Transforms an already-substituted template type parameter pack
843     /// into either itself (if we aren't substituting into its pack expansion)
844     /// or the appropriate substituted argument.
845     QualType TransformSubstTemplateTypeParmPackType(TypeLocBuilder &TLB,
846                                            SubstTemplateTypeParmPackTypeLoc TL);
847 
TransformCallExpr(CallExpr * CE)848     ExprResult TransformCallExpr(CallExpr *CE) {
849       getSema().CallsUndergoingInstantiation.push_back(CE);
850       ExprResult Result =
851           TreeTransform<TemplateInstantiator>::TransformCallExpr(CE);
852       getSema().CallsUndergoingInstantiation.pop_back();
853       return Result;
854     }
855 
TransformLambdaExpr(LambdaExpr * E)856     ExprResult TransformLambdaExpr(LambdaExpr *E) {
857       LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true);
858       return TreeTransform<TemplateInstantiator>::TransformLambdaExpr(E);
859     }
860 
TransformLambdaScope(LambdaExpr * E,CXXMethodDecl * CallOperator)861     ExprResult TransformLambdaScope(LambdaExpr *E,
862                                     CXXMethodDecl *CallOperator) {
863       CallOperator->setInstantiationOfMemberFunction(E->getCallOperator(),
864                                                      TSK_ImplicitInstantiation);
865       return TreeTransform<TemplateInstantiator>::
866          TransformLambdaScope(E, CallOperator);
867     }
868 
869   private:
870     ExprResult transformNonTypeTemplateParmRef(NonTypeTemplateParmDecl *parm,
871                                                SourceLocation loc,
872                                                TemplateArgument arg);
873   };
874 }
875 
AlreadyTransformed(QualType T)876 bool TemplateInstantiator::AlreadyTransformed(QualType T) {
877   if (T.isNull())
878     return true;
879 
880   if (T->isInstantiationDependentType() || T->isVariablyModifiedType())
881     return false;
882 
883   getSema().MarkDeclarationsReferencedInType(Loc, T);
884   return true;
885 }
886 
TransformDecl(SourceLocation Loc,Decl * D)887 Decl *TemplateInstantiator::TransformDecl(SourceLocation Loc, Decl *D) {
888   if (!D)
889     return 0;
890 
891   if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(D)) {
892     if (TTP->getDepth() < TemplateArgs.getNumLevels()) {
893       // If the corresponding template argument is NULL or non-existent, it's
894       // because we are performing instantiation from explicitly-specified
895       // template arguments in a function template, but there were some
896       // arguments left unspecified.
897       if (!TemplateArgs.hasTemplateArgument(TTP->getDepth(),
898                                             TTP->getPosition()))
899         return D;
900 
901       TemplateArgument Arg = TemplateArgs(TTP->getDepth(), TTP->getPosition());
902 
903       if (TTP->isParameterPack()) {
904         assert(Arg.getKind() == TemplateArgument::Pack &&
905                "Missing argument pack");
906 
907         assert(getSema().ArgumentPackSubstitutionIndex >= 0);
908         assert(getSema().ArgumentPackSubstitutionIndex < (int)Arg.pack_size());
909         Arg = Arg.pack_begin()[getSema().ArgumentPackSubstitutionIndex];
910       }
911 
912       TemplateName Template = Arg.getAsTemplate();
913       assert(!Template.isNull() && Template.getAsTemplateDecl() &&
914              "Wrong kind of template template argument");
915       return Template.getAsTemplateDecl();
916     }
917 
918     // Fall through to find the instantiated declaration for this template
919     // template parameter.
920   }
921 
922   return SemaRef.FindInstantiatedDecl(Loc, cast<NamedDecl>(D), TemplateArgs);
923 }
924 
TransformDefinition(SourceLocation Loc,Decl * D)925 Decl *TemplateInstantiator::TransformDefinition(SourceLocation Loc, Decl *D) {
926   Decl *Inst = getSema().SubstDecl(D, getSema().CurContext, TemplateArgs);
927   if (!Inst)
928     return 0;
929 
930   getSema().CurrentInstantiationScope->InstantiatedLocal(D, Inst);
931   return Inst;
932 }
933 
934 NamedDecl *
TransformFirstQualifierInScope(NamedDecl * D,SourceLocation Loc)935 TemplateInstantiator::TransformFirstQualifierInScope(NamedDecl *D,
936                                                      SourceLocation Loc) {
937   // If the first part of the nested-name-specifier was a template type
938   // parameter, instantiate that type parameter down to a tag type.
939   if (TemplateTypeParmDecl *TTPD = dyn_cast_or_null<TemplateTypeParmDecl>(D)) {
940     const TemplateTypeParmType *TTP
941       = cast<TemplateTypeParmType>(getSema().Context.getTypeDeclType(TTPD));
942 
943     if (TTP->getDepth() < TemplateArgs.getNumLevels()) {
944       // FIXME: This needs testing w/ member access expressions.
945       TemplateArgument Arg = TemplateArgs(TTP->getDepth(), TTP->getIndex());
946 
947       if (TTP->isParameterPack()) {
948         assert(Arg.getKind() == TemplateArgument::Pack &&
949                "Missing argument pack");
950 
951         if (getSema().ArgumentPackSubstitutionIndex == -1)
952           return 0;
953 
954         assert(getSema().ArgumentPackSubstitutionIndex < (int)Arg.pack_size());
955         Arg = Arg.pack_begin()[getSema().ArgumentPackSubstitutionIndex];
956       }
957 
958       QualType T = Arg.getAsType();
959       if (T.isNull())
960         return cast_or_null<NamedDecl>(TransformDecl(Loc, D));
961 
962       if (const TagType *Tag = T->getAs<TagType>())
963         return Tag->getDecl();
964 
965       // The resulting type is not a tag; complain.
966       getSema().Diag(Loc, diag::err_nested_name_spec_non_tag) << T;
967       return 0;
968     }
969   }
970 
971   return cast_or_null<NamedDecl>(TransformDecl(Loc, D));
972 }
973 
974 VarDecl *
RebuildExceptionDecl(VarDecl * ExceptionDecl,TypeSourceInfo * Declarator,SourceLocation StartLoc,SourceLocation NameLoc,IdentifierInfo * Name)975 TemplateInstantiator::RebuildExceptionDecl(VarDecl *ExceptionDecl,
976                                            TypeSourceInfo *Declarator,
977                                            SourceLocation StartLoc,
978                                            SourceLocation NameLoc,
979                                            IdentifierInfo *Name) {
980   VarDecl *Var = inherited::RebuildExceptionDecl(ExceptionDecl, Declarator,
981                                                  StartLoc, NameLoc, Name);
982   if (Var)
983     getSema().CurrentInstantiationScope->InstantiatedLocal(ExceptionDecl, Var);
984   return Var;
985 }
986 
RebuildObjCExceptionDecl(VarDecl * ExceptionDecl,TypeSourceInfo * TSInfo,QualType T)987 VarDecl *TemplateInstantiator::RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
988                                                         TypeSourceInfo *TSInfo,
989                                                         QualType T) {
990   VarDecl *Var = inherited::RebuildObjCExceptionDecl(ExceptionDecl, TSInfo, T);
991   if (Var)
992     getSema().CurrentInstantiationScope->InstantiatedLocal(ExceptionDecl, Var);
993   return Var;
994 }
995 
996 QualType
RebuildElaboratedType(SourceLocation KeywordLoc,ElaboratedTypeKeyword Keyword,NestedNameSpecifierLoc QualifierLoc,QualType T)997 TemplateInstantiator::RebuildElaboratedType(SourceLocation KeywordLoc,
998                                             ElaboratedTypeKeyword Keyword,
999                                             NestedNameSpecifierLoc QualifierLoc,
1000                                             QualType T) {
1001   if (const TagType *TT = T->getAs<TagType>()) {
1002     TagDecl* TD = TT->getDecl();
1003 
1004     SourceLocation TagLocation = KeywordLoc;
1005 
1006     IdentifierInfo *Id = TD->getIdentifier();
1007 
1008     // TODO: should we even warn on struct/class mismatches for this?  Seems
1009     // like it's likely to produce a lot of spurious errors.
1010     if (Id && Keyword != ETK_None && Keyword != ETK_Typename) {
1011       TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1012       if (!SemaRef.isAcceptableTagRedeclaration(TD, Kind, /*isDefinition*/false,
1013                                                 TagLocation, *Id)) {
1014         SemaRef.Diag(TagLocation, diag::err_use_with_wrong_tag)
1015           << Id
1016           << FixItHint::CreateReplacement(SourceRange(TagLocation),
1017                                           TD->getKindName());
1018         SemaRef.Diag(TD->getLocation(), diag::note_previous_use);
1019       }
1020     }
1021   }
1022 
1023   return TreeTransform<TemplateInstantiator>::RebuildElaboratedType(KeywordLoc,
1024                                                                     Keyword,
1025                                                                   QualifierLoc,
1026                                                                     T);
1027 }
1028 
TransformTemplateName(CXXScopeSpec & SS,TemplateName Name,SourceLocation NameLoc,QualType ObjectType,NamedDecl * FirstQualifierInScope)1029 TemplateName TemplateInstantiator::TransformTemplateName(CXXScopeSpec &SS,
1030                                                          TemplateName Name,
1031                                                          SourceLocation NameLoc,
1032                                                          QualType ObjectType,
1033                                              NamedDecl *FirstQualifierInScope) {
1034   if (TemplateTemplateParmDecl *TTP
1035        = dyn_cast_or_null<TemplateTemplateParmDecl>(Name.getAsTemplateDecl())) {
1036     if (TTP->getDepth() < TemplateArgs.getNumLevels()) {
1037       // If the corresponding template argument is NULL or non-existent, it's
1038       // because we are performing instantiation from explicitly-specified
1039       // template arguments in a function template, but there were some
1040       // arguments left unspecified.
1041       if (!TemplateArgs.hasTemplateArgument(TTP->getDepth(),
1042                                             TTP->getPosition()))
1043         return Name;
1044 
1045       TemplateArgument Arg = TemplateArgs(TTP->getDepth(), TTP->getPosition());
1046 
1047       if (TTP->isParameterPack()) {
1048         assert(Arg.getKind() == TemplateArgument::Pack &&
1049                "Missing argument pack");
1050 
1051         if (getSema().ArgumentPackSubstitutionIndex == -1) {
1052           // We have the template argument pack to substitute, but we're not
1053           // actually expanding the enclosing pack expansion yet. So, just
1054           // keep the entire argument pack.
1055           return getSema().Context.getSubstTemplateTemplateParmPack(TTP, Arg);
1056         }
1057 
1058         assert(getSema().ArgumentPackSubstitutionIndex < (int)Arg.pack_size());
1059         Arg = Arg.pack_begin()[getSema().ArgumentPackSubstitutionIndex];
1060       }
1061 
1062       TemplateName Template = Arg.getAsTemplate();
1063       assert(!Template.isNull() && "Null template template argument");
1064 
1065       // We don't ever want to substitute for a qualified template name, since
1066       // the qualifier is handled separately. So, look through the qualified
1067       // template name to its underlying declaration.
1068       if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
1069         Template = TemplateName(QTN->getTemplateDecl());
1070 
1071       Template = getSema().Context.getSubstTemplateTemplateParm(TTP, Template);
1072       return Template;
1073     }
1074   }
1075 
1076   if (SubstTemplateTemplateParmPackStorage *SubstPack
1077       = Name.getAsSubstTemplateTemplateParmPack()) {
1078     if (getSema().ArgumentPackSubstitutionIndex == -1)
1079       return Name;
1080 
1081     const TemplateArgument &ArgPack = SubstPack->getArgumentPack();
1082     assert(getSema().ArgumentPackSubstitutionIndex < (int)ArgPack.pack_size() &&
1083            "Pack substitution index out-of-range");
1084     return ArgPack.pack_begin()[getSema().ArgumentPackSubstitutionIndex]
1085     .getAsTemplate();
1086   }
1087 
1088   return inherited::TransformTemplateName(SS, Name, NameLoc, ObjectType,
1089                                           FirstQualifierInScope);
1090 }
1091 
1092 ExprResult
TransformPredefinedExpr(PredefinedExpr * E)1093 TemplateInstantiator::TransformPredefinedExpr(PredefinedExpr *E) {
1094   if (!E->isTypeDependent())
1095     return SemaRef.Owned(E);
1096 
1097   FunctionDecl *currentDecl = getSema().getCurFunctionDecl();
1098   assert(currentDecl && "Must have current function declaration when "
1099                         "instantiating.");
1100 
1101   PredefinedExpr::IdentType IT = E->getIdentType();
1102 
1103   unsigned Length = PredefinedExpr::ComputeName(IT, currentDecl).length();
1104 
1105   llvm::APInt LengthI(32, Length + 1);
1106   QualType ResTy;
1107   if (IT == PredefinedExpr::LFunction)
1108     ResTy = getSema().Context.WCharTy.withConst();
1109   else
1110     ResTy = getSema().Context.CharTy.withConst();
1111   ResTy = getSema().Context.getConstantArrayType(ResTy, LengthI,
1112                                                  ArrayType::Normal, 0);
1113   PredefinedExpr *PE =
1114     new (getSema().Context) PredefinedExpr(E->getLocation(), ResTy, IT);
1115   return getSema().Owned(PE);
1116 }
1117 
1118 ExprResult
TransformTemplateParmRefExpr(DeclRefExpr * E,NonTypeTemplateParmDecl * NTTP)1119 TemplateInstantiator::TransformTemplateParmRefExpr(DeclRefExpr *E,
1120                                                NonTypeTemplateParmDecl *NTTP) {
1121   // If the corresponding template argument is NULL or non-existent, it's
1122   // because we are performing instantiation from explicitly-specified
1123   // template arguments in a function template, but there were some
1124   // arguments left unspecified.
1125   if (!TemplateArgs.hasTemplateArgument(NTTP->getDepth(),
1126                                         NTTP->getPosition()))
1127     return SemaRef.Owned(E);
1128 
1129   TemplateArgument Arg = TemplateArgs(NTTP->getDepth(), NTTP->getPosition());
1130   if (NTTP->isParameterPack()) {
1131     assert(Arg.getKind() == TemplateArgument::Pack &&
1132            "Missing argument pack");
1133 
1134     if (getSema().ArgumentPackSubstitutionIndex == -1) {
1135       // We have an argument pack, but we can't select a particular argument
1136       // out of it yet. Therefore, we'll build an expression to hold on to that
1137       // argument pack.
1138       QualType TargetType = SemaRef.SubstType(NTTP->getType(), TemplateArgs,
1139                                               E->getLocation(),
1140                                               NTTP->getDeclName());
1141       if (TargetType.isNull())
1142         return ExprError();
1143 
1144       return new (SemaRef.Context) SubstNonTypeTemplateParmPackExpr(TargetType,
1145                                                                     NTTP,
1146                                                               E->getLocation(),
1147                                                                     Arg);
1148     }
1149 
1150     assert(getSema().ArgumentPackSubstitutionIndex < (int)Arg.pack_size());
1151     Arg = Arg.pack_begin()[getSema().ArgumentPackSubstitutionIndex];
1152   }
1153 
1154   return transformNonTypeTemplateParmRef(NTTP, E->getLocation(), Arg);
1155 }
1156 
transformNonTypeTemplateParmRef(NonTypeTemplateParmDecl * parm,SourceLocation loc,TemplateArgument arg)1157 ExprResult TemplateInstantiator::transformNonTypeTemplateParmRef(
1158                                                  NonTypeTemplateParmDecl *parm,
1159                                                  SourceLocation loc,
1160                                                  TemplateArgument arg) {
1161   ExprResult result;
1162   QualType type;
1163 
1164   // If the argument is a pack expansion, the parameter must actually be a
1165   // parameter pack, and we should substitute the pattern itself, producing
1166   // an expression which contains an unexpanded parameter pack.
1167   if (arg.isPackExpansion()) {
1168     assert(parm->isParameterPack() && "pack expansion for non-pack");
1169     arg = arg.getPackExpansionPattern();
1170   }
1171 
1172   // The template argument itself might be an expression, in which
1173   // case we just return that expression.
1174   if (arg.getKind() == TemplateArgument::Expression) {
1175     Expr *argExpr = arg.getAsExpr();
1176     result = SemaRef.Owned(argExpr);
1177     type = argExpr->getType();
1178 
1179   } else if (arg.getKind() == TemplateArgument::Declaration ||
1180              arg.getKind() == TemplateArgument::NullPtr) {
1181     ValueDecl *VD;
1182     if (arg.getKind() == TemplateArgument::Declaration) {
1183       VD = cast<ValueDecl>(arg.getAsDecl());
1184 
1185       // Find the instantiation of the template argument.  This is
1186       // required for nested templates.
1187       VD = cast_or_null<ValueDecl>(
1188              getSema().FindInstantiatedDecl(loc, VD, TemplateArgs));
1189       if (!VD)
1190         return ExprError();
1191     } else {
1192       // Propagate NULL template argument.
1193       VD = 0;
1194     }
1195 
1196     // Derive the type we want the substituted decl to have.  This had
1197     // better be non-dependent, or these checks will have serious problems.
1198     if (parm->isExpandedParameterPack()) {
1199       type = parm->getExpansionType(SemaRef.ArgumentPackSubstitutionIndex);
1200     } else if (parm->isParameterPack() &&
1201                isa<PackExpansionType>(parm->getType())) {
1202       type = SemaRef.SubstType(
1203                         cast<PackExpansionType>(parm->getType())->getPattern(),
1204                                      TemplateArgs, loc, parm->getDeclName());
1205     } else {
1206       type = SemaRef.SubstType(parm->getType(), TemplateArgs,
1207                                loc, parm->getDeclName());
1208     }
1209     assert(!type.isNull() && "type substitution failed for param type");
1210     assert(!type->isDependentType() && "param type still dependent");
1211     result = SemaRef.BuildExpressionFromDeclTemplateArgument(arg, type, loc);
1212 
1213     if (!result.isInvalid()) type = result.get()->getType();
1214   } else {
1215     result = SemaRef.BuildExpressionFromIntegralTemplateArgument(arg, loc);
1216 
1217     // Note that this type can be different from the type of 'result',
1218     // e.g. if it's an enum type.
1219     type = arg.getIntegralType();
1220   }
1221   if (result.isInvalid()) return ExprError();
1222 
1223   Expr *resultExpr = result.take();
1224   return SemaRef.Owned(new (SemaRef.Context)
1225                 SubstNonTypeTemplateParmExpr(type,
1226                                              resultExpr->getValueKind(),
1227                                              loc, parm, resultExpr));
1228 }
1229 
1230 ExprResult
TransformSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr * E)1231 TemplateInstantiator::TransformSubstNonTypeTemplateParmPackExpr(
1232                                           SubstNonTypeTemplateParmPackExpr *E) {
1233   if (getSema().ArgumentPackSubstitutionIndex == -1) {
1234     // We aren't expanding the parameter pack, so just return ourselves.
1235     return getSema().Owned(E);
1236   }
1237 
1238   const TemplateArgument &ArgPack = E->getArgumentPack();
1239   unsigned Index = (unsigned)getSema().ArgumentPackSubstitutionIndex;
1240   assert(Index < ArgPack.pack_size() && "Substitution index out-of-range");
1241 
1242   const TemplateArgument &Arg = ArgPack.pack_begin()[Index];
1243   return transformNonTypeTemplateParmRef(E->getParameterPack(),
1244                                          E->getParameterPackLocation(),
1245                                          Arg);
1246 }
1247 
1248 ExprResult
RebuildParmVarDeclRefExpr(ParmVarDecl * PD,SourceLocation Loc)1249 TemplateInstantiator::RebuildParmVarDeclRefExpr(ParmVarDecl *PD,
1250                                                 SourceLocation Loc) {
1251   DeclarationNameInfo NameInfo(PD->getDeclName(), Loc);
1252   return getSema().BuildDeclarationNameExpr(CXXScopeSpec(), NameInfo, PD);
1253 }
1254 
1255 ExprResult
TransformFunctionParmPackExpr(FunctionParmPackExpr * E)1256 TemplateInstantiator::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
1257   if (getSema().ArgumentPackSubstitutionIndex != -1) {
1258     // We can expand this parameter pack now.
1259     ParmVarDecl *D = E->getExpansion(getSema().ArgumentPackSubstitutionIndex);
1260     ValueDecl *VD = cast_or_null<ValueDecl>(TransformDecl(E->getExprLoc(), D));
1261     if (!VD)
1262       return ExprError();
1263     return RebuildParmVarDeclRefExpr(cast<ParmVarDecl>(VD), E->getExprLoc());
1264   }
1265 
1266   QualType T = TransformType(E->getType());
1267   if (T.isNull())
1268     return ExprError();
1269 
1270   // Transform each of the parameter expansions into the corresponding
1271   // parameters in the instantiation of the function decl.
1272   SmallVector<Decl *, 8> Parms;
1273   Parms.reserve(E->getNumExpansions());
1274   for (FunctionParmPackExpr::iterator I = E->begin(), End = E->end();
1275        I != End; ++I) {
1276     ParmVarDecl *D =
1277         cast_or_null<ParmVarDecl>(TransformDecl(E->getExprLoc(), *I));
1278     if (!D)
1279       return ExprError();
1280     Parms.push_back(D);
1281   }
1282 
1283   return FunctionParmPackExpr::Create(getSema().Context, T,
1284                                       E->getParameterPack(),
1285                                       E->getParameterPackLocation(), Parms);
1286 }
1287 
1288 ExprResult
TransformFunctionParmPackRefExpr(DeclRefExpr * E,ParmVarDecl * PD)1289 TemplateInstantiator::TransformFunctionParmPackRefExpr(DeclRefExpr *E,
1290                                                        ParmVarDecl *PD) {
1291   typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack;
1292   llvm::PointerUnion<Decl *, DeclArgumentPack *> *Found
1293     = getSema().CurrentInstantiationScope->findInstantiationOf(PD);
1294   assert(Found && "no instantiation for parameter pack");
1295 
1296   Decl *TransformedDecl;
1297   if (DeclArgumentPack *Pack = Found->dyn_cast<DeclArgumentPack *>()) {
1298     // If this is a reference to a function parameter pack which we can substitute
1299     // but can't yet expand, build a FunctionParmPackExpr for it.
1300     if (getSema().ArgumentPackSubstitutionIndex == -1) {
1301       QualType T = TransformType(E->getType());
1302       if (T.isNull())
1303         return ExprError();
1304       return FunctionParmPackExpr::Create(getSema().Context, T, PD,
1305                                           E->getExprLoc(), *Pack);
1306     }
1307 
1308     TransformedDecl = (*Pack)[getSema().ArgumentPackSubstitutionIndex];
1309   } else {
1310     TransformedDecl = Found->get<Decl*>();
1311   }
1312 
1313   // We have either an unexpanded pack or a specific expansion.
1314   return RebuildParmVarDeclRefExpr(cast<ParmVarDecl>(TransformedDecl),
1315                                    E->getExprLoc());
1316 }
1317 
1318 ExprResult
TransformDeclRefExpr(DeclRefExpr * E)1319 TemplateInstantiator::TransformDeclRefExpr(DeclRefExpr *E) {
1320   NamedDecl *D = E->getDecl();
1321 
1322   // Handle references to non-type template parameters and non-type template
1323   // parameter packs.
1324   if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
1325     if (NTTP->getDepth() < TemplateArgs.getNumLevels())
1326       return TransformTemplateParmRefExpr(E, NTTP);
1327 
1328     // We have a non-type template parameter that isn't fully substituted;
1329     // FindInstantiatedDecl will find it in the local instantiation scope.
1330   }
1331 
1332   // Handle references to function parameter packs.
1333   if (ParmVarDecl *PD = dyn_cast<ParmVarDecl>(D))
1334     if (PD->isParameterPack())
1335       return TransformFunctionParmPackRefExpr(E, PD);
1336 
1337   return TreeTransform<TemplateInstantiator>::TransformDeclRefExpr(E);
1338 }
1339 
TransformCXXDefaultArgExpr(CXXDefaultArgExpr * E)1340 ExprResult TemplateInstantiator::TransformCXXDefaultArgExpr(
1341     CXXDefaultArgExpr *E) {
1342   assert(!cast<FunctionDecl>(E->getParam()->getDeclContext())->
1343              getDescribedFunctionTemplate() &&
1344          "Default arg expressions are never formed in dependent cases.");
1345   return SemaRef.BuildCXXDefaultArgExpr(E->getUsedLocation(),
1346                            cast<FunctionDecl>(E->getParam()->getDeclContext()),
1347                                         E->getParam());
1348 }
1349 
TransformFunctionProtoType(TypeLocBuilder & TLB,FunctionProtoTypeLoc TL)1350 QualType TemplateInstantiator::TransformFunctionProtoType(TypeLocBuilder &TLB,
1351                                                       FunctionProtoTypeLoc TL) {
1352   // We need a local instantiation scope for this function prototype.
1353   LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true);
1354   return inherited::TransformFunctionProtoType(TLB, TL);
1355 }
1356 
TransformFunctionProtoType(TypeLocBuilder & TLB,FunctionProtoTypeLoc TL,CXXRecordDecl * ThisContext,unsigned ThisTypeQuals)1357 QualType TemplateInstantiator::TransformFunctionProtoType(TypeLocBuilder &TLB,
1358                                  FunctionProtoTypeLoc TL,
1359                                  CXXRecordDecl *ThisContext,
1360                                  unsigned ThisTypeQuals) {
1361   // We need a local instantiation scope for this function prototype.
1362   LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true);
1363   return inherited::TransformFunctionProtoType(TLB, TL, ThisContext,
1364                                                ThisTypeQuals);
1365 }
1366 
1367 ParmVarDecl *
TransformFunctionTypeParam(ParmVarDecl * OldParm,int indexAdjustment,Optional<unsigned> NumExpansions,bool ExpectParameterPack)1368 TemplateInstantiator::TransformFunctionTypeParam(ParmVarDecl *OldParm,
1369                                                  int indexAdjustment,
1370                                                Optional<unsigned> NumExpansions,
1371                                                  bool ExpectParameterPack) {
1372   return SemaRef.SubstParmVarDecl(OldParm, TemplateArgs, indexAdjustment,
1373                                   NumExpansions, ExpectParameterPack);
1374 }
1375 
1376 QualType
TransformTemplateTypeParmType(TypeLocBuilder & TLB,TemplateTypeParmTypeLoc TL)1377 TemplateInstantiator::TransformTemplateTypeParmType(TypeLocBuilder &TLB,
1378                                                 TemplateTypeParmTypeLoc TL) {
1379   const TemplateTypeParmType *T = TL.getTypePtr();
1380   if (T->getDepth() < TemplateArgs.getNumLevels()) {
1381     // Replace the template type parameter with its corresponding
1382     // template argument.
1383 
1384     // If the corresponding template argument is NULL or doesn't exist, it's
1385     // because we are performing instantiation from explicitly-specified
1386     // template arguments in a function template class, but there were some
1387     // arguments left unspecified.
1388     if (!TemplateArgs.hasTemplateArgument(T->getDepth(), T->getIndex())) {
1389       TemplateTypeParmTypeLoc NewTL
1390         = TLB.push<TemplateTypeParmTypeLoc>(TL.getType());
1391       NewTL.setNameLoc(TL.getNameLoc());
1392       return TL.getType();
1393     }
1394 
1395     TemplateArgument Arg = TemplateArgs(T->getDepth(), T->getIndex());
1396 
1397     if (T->isParameterPack()) {
1398       assert(Arg.getKind() == TemplateArgument::Pack &&
1399              "Missing argument pack");
1400 
1401       if (getSema().ArgumentPackSubstitutionIndex == -1) {
1402         // We have the template argument pack, but we're not expanding the
1403         // enclosing pack expansion yet. Just save the template argument
1404         // pack for later substitution.
1405         QualType Result
1406           = getSema().Context.getSubstTemplateTypeParmPackType(T, Arg);
1407         SubstTemplateTypeParmPackTypeLoc NewTL
1408           = TLB.push<SubstTemplateTypeParmPackTypeLoc>(Result);
1409         NewTL.setNameLoc(TL.getNameLoc());
1410         return Result;
1411       }
1412 
1413       assert(getSema().ArgumentPackSubstitutionIndex < (int)Arg.pack_size());
1414       Arg = Arg.pack_begin()[getSema().ArgumentPackSubstitutionIndex];
1415     }
1416 
1417     assert(Arg.getKind() == TemplateArgument::Type &&
1418            "Template argument kind mismatch");
1419 
1420     QualType Replacement = Arg.getAsType();
1421 
1422     // TODO: only do this uniquing once, at the start of instantiation.
1423     QualType Result
1424       = getSema().Context.getSubstTemplateTypeParmType(T, Replacement);
1425     SubstTemplateTypeParmTypeLoc NewTL
1426       = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
1427     NewTL.setNameLoc(TL.getNameLoc());
1428     return Result;
1429   }
1430 
1431   // The template type parameter comes from an inner template (e.g.,
1432   // the template parameter list of a member template inside the
1433   // template we are instantiating). Create a new template type
1434   // parameter with the template "level" reduced by one.
1435   TemplateTypeParmDecl *NewTTPDecl = 0;
1436   if (TemplateTypeParmDecl *OldTTPDecl = T->getDecl())
1437     NewTTPDecl = cast_or_null<TemplateTypeParmDecl>(
1438                                   TransformDecl(TL.getNameLoc(), OldTTPDecl));
1439 
1440   QualType Result
1441     = getSema().Context.getTemplateTypeParmType(T->getDepth()
1442                                                  - TemplateArgs.getNumLevels(),
1443                                                 T->getIndex(),
1444                                                 T->isParameterPack(),
1445                                                 NewTTPDecl);
1446   TemplateTypeParmTypeLoc NewTL = TLB.push<TemplateTypeParmTypeLoc>(Result);
1447   NewTL.setNameLoc(TL.getNameLoc());
1448   return Result;
1449 }
1450 
1451 QualType
TransformSubstTemplateTypeParmPackType(TypeLocBuilder & TLB,SubstTemplateTypeParmPackTypeLoc TL)1452 TemplateInstantiator::TransformSubstTemplateTypeParmPackType(
1453                                                             TypeLocBuilder &TLB,
1454                                          SubstTemplateTypeParmPackTypeLoc TL) {
1455   if (getSema().ArgumentPackSubstitutionIndex == -1) {
1456     // We aren't expanding the parameter pack, so just return ourselves.
1457     SubstTemplateTypeParmPackTypeLoc NewTL
1458       = TLB.push<SubstTemplateTypeParmPackTypeLoc>(TL.getType());
1459     NewTL.setNameLoc(TL.getNameLoc());
1460     return TL.getType();
1461   }
1462 
1463   const TemplateArgument &ArgPack = TL.getTypePtr()->getArgumentPack();
1464   unsigned Index = (unsigned)getSema().ArgumentPackSubstitutionIndex;
1465   assert(Index < ArgPack.pack_size() && "Substitution index out-of-range");
1466 
1467   QualType Result = ArgPack.pack_begin()[Index].getAsType();
1468   Result = getSema().Context.getSubstTemplateTypeParmType(
1469                                       TL.getTypePtr()->getReplacedParameter(),
1470                                                           Result);
1471   SubstTemplateTypeParmTypeLoc NewTL
1472     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
1473   NewTL.setNameLoc(TL.getNameLoc());
1474   return Result;
1475 }
1476 
1477 /// \brief Perform substitution on the type T with a given set of template
1478 /// arguments.
1479 ///
1480 /// This routine substitutes the given template arguments into the
1481 /// type T and produces the instantiated type.
1482 ///
1483 /// \param T the type into which the template arguments will be
1484 /// substituted. If this type is not dependent, it will be returned
1485 /// immediately.
1486 ///
1487 /// \param Args the template arguments that will be
1488 /// substituted for the top-level template parameters within T.
1489 ///
1490 /// \param Loc the location in the source code where this substitution
1491 /// is being performed. It will typically be the location of the
1492 /// declarator (if we're instantiating the type of some declaration)
1493 /// or the location of the type in the source code (if, e.g., we're
1494 /// instantiating the type of a cast expression).
1495 ///
1496 /// \param Entity the name of the entity associated with a declaration
1497 /// being instantiated (if any). May be empty to indicate that there
1498 /// is no such entity (if, e.g., this is a type that occurs as part of
1499 /// a cast expression) or that the entity has no name (e.g., an
1500 /// unnamed function parameter).
1501 ///
1502 /// \returns If the instantiation succeeds, the instantiated
1503 /// type. Otherwise, produces diagnostics and returns a NULL type.
SubstType(TypeSourceInfo * T,const MultiLevelTemplateArgumentList & Args,SourceLocation Loc,DeclarationName Entity)1504 TypeSourceInfo *Sema::SubstType(TypeSourceInfo *T,
1505                                 const MultiLevelTemplateArgumentList &Args,
1506                                 SourceLocation Loc,
1507                                 DeclarationName Entity) {
1508   assert(!ActiveTemplateInstantiations.empty() &&
1509          "Cannot perform an instantiation without some context on the "
1510          "instantiation stack");
1511 
1512   if (!T->getType()->isInstantiationDependentType() &&
1513       !T->getType()->isVariablyModifiedType())
1514     return T;
1515 
1516   TemplateInstantiator Instantiator(*this, Args, Loc, Entity);
1517   return Instantiator.TransformType(T);
1518 }
1519 
SubstType(TypeLoc TL,const MultiLevelTemplateArgumentList & Args,SourceLocation Loc,DeclarationName Entity)1520 TypeSourceInfo *Sema::SubstType(TypeLoc TL,
1521                                 const MultiLevelTemplateArgumentList &Args,
1522                                 SourceLocation Loc,
1523                                 DeclarationName Entity) {
1524   assert(!ActiveTemplateInstantiations.empty() &&
1525          "Cannot perform an instantiation without some context on the "
1526          "instantiation stack");
1527 
1528   if (TL.getType().isNull())
1529     return 0;
1530 
1531   if (!TL.getType()->isInstantiationDependentType() &&
1532       !TL.getType()->isVariablyModifiedType()) {
1533     // FIXME: Make a copy of the TypeLoc data here, so that we can
1534     // return a new TypeSourceInfo. Inefficient!
1535     TypeLocBuilder TLB;
1536     TLB.pushFullCopy(TL);
1537     return TLB.getTypeSourceInfo(Context, TL.getType());
1538   }
1539 
1540   TemplateInstantiator Instantiator(*this, Args, Loc, Entity);
1541   TypeLocBuilder TLB;
1542   TLB.reserve(TL.getFullDataSize());
1543   QualType Result = Instantiator.TransformType(TLB, TL);
1544   if (Result.isNull())
1545     return 0;
1546 
1547   return TLB.getTypeSourceInfo(Context, Result);
1548 }
1549 
1550 /// Deprecated form of the above.
SubstType(QualType T,const MultiLevelTemplateArgumentList & TemplateArgs,SourceLocation Loc,DeclarationName Entity)1551 QualType Sema::SubstType(QualType T,
1552                          const MultiLevelTemplateArgumentList &TemplateArgs,
1553                          SourceLocation Loc, DeclarationName Entity) {
1554   assert(!ActiveTemplateInstantiations.empty() &&
1555          "Cannot perform an instantiation without some context on the "
1556          "instantiation stack");
1557 
1558   // If T is not a dependent type or a variably-modified type, there
1559   // is nothing to do.
1560   if (!T->isInstantiationDependentType() && !T->isVariablyModifiedType())
1561     return T;
1562 
1563   TemplateInstantiator Instantiator(*this, TemplateArgs, Loc, Entity);
1564   return Instantiator.TransformType(T);
1565 }
1566 
NeedsInstantiationAsFunctionType(TypeSourceInfo * T)1567 static bool NeedsInstantiationAsFunctionType(TypeSourceInfo *T) {
1568   if (T->getType()->isInstantiationDependentType() ||
1569       T->getType()->isVariablyModifiedType())
1570     return true;
1571 
1572   TypeLoc TL = T->getTypeLoc().IgnoreParens();
1573   if (!TL.getAs<FunctionProtoTypeLoc>())
1574     return false;
1575 
1576   FunctionProtoTypeLoc FP = TL.castAs<FunctionProtoTypeLoc>();
1577   for (unsigned I = 0, E = FP.getNumArgs(); I != E; ++I) {
1578     ParmVarDecl *P = FP.getArg(I);
1579 
1580     // The parameter's type as written might be dependent even if the
1581     // decayed type was not dependent.
1582     if (TypeSourceInfo *TSInfo = P->getTypeSourceInfo())
1583       if (TSInfo->getType()->isInstantiationDependentType())
1584         return true;
1585 
1586     // TODO: currently we always rebuild expressions.  When we
1587     // properly get lazier about this, we should use the same
1588     // logic to avoid rebuilding prototypes here.
1589     if (P->hasDefaultArg())
1590       return true;
1591   }
1592 
1593   return false;
1594 }
1595 
1596 /// A form of SubstType intended specifically for instantiating the
1597 /// type of a FunctionDecl.  Its purpose is solely to force the
1598 /// instantiation of default-argument expressions.
SubstFunctionDeclType(TypeSourceInfo * T,const MultiLevelTemplateArgumentList & Args,SourceLocation Loc,DeclarationName Entity,CXXRecordDecl * ThisContext,unsigned ThisTypeQuals)1599 TypeSourceInfo *Sema::SubstFunctionDeclType(TypeSourceInfo *T,
1600                                 const MultiLevelTemplateArgumentList &Args,
1601                                 SourceLocation Loc,
1602                                 DeclarationName Entity,
1603                                 CXXRecordDecl *ThisContext,
1604                                 unsigned ThisTypeQuals) {
1605   assert(!ActiveTemplateInstantiations.empty() &&
1606          "Cannot perform an instantiation without some context on the "
1607          "instantiation stack");
1608 
1609   if (!NeedsInstantiationAsFunctionType(T))
1610     return T;
1611 
1612   TemplateInstantiator Instantiator(*this, Args, Loc, Entity);
1613 
1614   TypeLocBuilder TLB;
1615 
1616   TypeLoc TL = T->getTypeLoc();
1617   TLB.reserve(TL.getFullDataSize());
1618 
1619   QualType Result;
1620 
1621   if (FunctionProtoTypeLoc Proto = TL.getAs<FunctionProtoTypeLoc>()) {
1622     Result = Instantiator.TransformFunctionProtoType(TLB, Proto, ThisContext,
1623                                                      ThisTypeQuals);
1624   } else {
1625     Result = Instantiator.TransformType(TLB, TL);
1626   }
1627   if (Result.isNull())
1628     return 0;
1629 
1630   return TLB.getTypeSourceInfo(Context, Result);
1631 }
1632 
SubstParmVarDecl(ParmVarDecl * OldParm,const MultiLevelTemplateArgumentList & TemplateArgs,int indexAdjustment,Optional<unsigned> NumExpansions,bool ExpectParameterPack)1633 ParmVarDecl *Sema::SubstParmVarDecl(ParmVarDecl *OldParm,
1634                             const MultiLevelTemplateArgumentList &TemplateArgs,
1635                                     int indexAdjustment,
1636                                     Optional<unsigned> NumExpansions,
1637                                     bool ExpectParameterPack) {
1638   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
1639   TypeSourceInfo *NewDI = 0;
1640 
1641   TypeLoc OldTL = OldDI->getTypeLoc();
1642   if (PackExpansionTypeLoc ExpansionTL = OldTL.getAs<PackExpansionTypeLoc>()) {
1643 
1644     // We have a function parameter pack. Substitute into the pattern of the
1645     // expansion.
1646     NewDI = SubstType(ExpansionTL.getPatternLoc(), TemplateArgs,
1647                       OldParm->getLocation(), OldParm->getDeclName());
1648     if (!NewDI)
1649       return 0;
1650 
1651     if (NewDI->getType()->containsUnexpandedParameterPack()) {
1652       // We still have unexpanded parameter packs, which means that
1653       // our function parameter is still a function parameter pack.
1654       // Therefore, make its type a pack expansion type.
1655       NewDI = CheckPackExpansion(NewDI, ExpansionTL.getEllipsisLoc(),
1656                                  NumExpansions);
1657     } else if (ExpectParameterPack) {
1658       // We expected to get a parameter pack but didn't (because the type
1659       // itself is not a pack expansion type), so complain. This can occur when
1660       // the substitution goes through an alias template that "loses" the
1661       // pack expansion.
1662       Diag(OldParm->getLocation(),
1663            diag::err_function_parameter_pack_without_parameter_packs)
1664         << NewDI->getType();
1665       return 0;
1666     }
1667   } else {
1668     NewDI = SubstType(OldDI, TemplateArgs, OldParm->getLocation(),
1669                       OldParm->getDeclName());
1670   }
1671 
1672   if (!NewDI)
1673     return 0;
1674 
1675   if (NewDI->getType()->isVoidType()) {
1676     Diag(OldParm->getLocation(), diag::err_param_with_void_type);
1677     return 0;
1678   }
1679 
1680   ParmVarDecl *NewParm = CheckParameter(Context.getTranslationUnitDecl(),
1681                                         OldParm->getInnerLocStart(),
1682                                         OldParm->getLocation(),
1683                                         OldParm->getIdentifier(),
1684                                         NewDI->getType(), NewDI,
1685                                         OldParm->getStorageClass(),
1686                                         OldParm->getStorageClassAsWritten());
1687   if (!NewParm)
1688     return 0;
1689 
1690   // Mark the (new) default argument as uninstantiated (if any).
1691   if (OldParm->hasUninstantiatedDefaultArg()) {
1692     Expr *Arg = OldParm->getUninstantiatedDefaultArg();
1693     NewParm->setUninstantiatedDefaultArg(Arg);
1694   } else if (OldParm->hasUnparsedDefaultArg()) {
1695     NewParm->setUnparsedDefaultArg();
1696     UnparsedDefaultArgInstantiations[OldParm].push_back(NewParm);
1697   } else if (Expr *Arg = OldParm->getDefaultArg())
1698     // FIXME: if we non-lazily instantiated non-dependent default args for
1699     // non-dependent parameter types we could remove a bunch of duplicate
1700     // conversion warnings for such arguments.
1701     NewParm->setUninstantiatedDefaultArg(Arg);
1702 
1703   NewParm->setHasInheritedDefaultArg(OldParm->hasInheritedDefaultArg());
1704 
1705   if (OldParm->isParameterPack() && !NewParm->isParameterPack()) {
1706     // Add the new parameter to the instantiated parameter pack.
1707     CurrentInstantiationScope->InstantiatedLocalPackArg(OldParm, NewParm);
1708   } else {
1709     // Introduce an Old -> New mapping
1710     CurrentInstantiationScope->InstantiatedLocal(OldParm, NewParm);
1711   }
1712 
1713   // FIXME: OldParm may come from a FunctionProtoType, in which case CurContext
1714   // can be anything, is this right ?
1715   NewParm->setDeclContext(CurContext);
1716 
1717   NewParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
1718                         OldParm->getFunctionScopeIndex() + indexAdjustment);
1719 
1720   InstantiateAttrs(TemplateArgs, OldParm, NewParm);
1721 
1722   return NewParm;
1723 }
1724 
1725 /// \brief Substitute the given template arguments into the given set of
1726 /// parameters, producing the set of parameter types that would be generated
1727 /// from such a substitution.
SubstParmTypes(SourceLocation Loc,ParmVarDecl ** Params,unsigned NumParams,const MultiLevelTemplateArgumentList & TemplateArgs,SmallVectorImpl<QualType> & ParamTypes,SmallVectorImpl<ParmVarDecl * > * OutParams)1728 bool Sema::SubstParmTypes(SourceLocation Loc,
1729                           ParmVarDecl **Params, unsigned NumParams,
1730                           const MultiLevelTemplateArgumentList &TemplateArgs,
1731                           SmallVectorImpl<QualType> &ParamTypes,
1732                           SmallVectorImpl<ParmVarDecl *> *OutParams) {
1733   assert(!ActiveTemplateInstantiations.empty() &&
1734          "Cannot perform an instantiation without some context on the "
1735          "instantiation stack");
1736 
1737   TemplateInstantiator Instantiator(*this, TemplateArgs, Loc,
1738                                     DeclarationName());
1739   return Instantiator.TransformFunctionTypeParams(Loc, Params, NumParams, 0,
1740                                                   ParamTypes, OutParams);
1741 }
1742 
1743 /// \brief Perform substitution on the base class specifiers of the
1744 /// given class template specialization.
1745 ///
1746 /// Produces a diagnostic and returns true on error, returns false and
1747 /// attaches the instantiated base classes to the class template
1748 /// specialization if successful.
1749 bool
SubstBaseSpecifiers(CXXRecordDecl * Instantiation,CXXRecordDecl * Pattern,const MultiLevelTemplateArgumentList & TemplateArgs)1750 Sema::SubstBaseSpecifiers(CXXRecordDecl *Instantiation,
1751                           CXXRecordDecl *Pattern,
1752                           const MultiLevelTemplateArgumentList &TemplateArgs) {
1753   bool Invalid = false;
1754   SmallVector<CXXBaseSpecifier*, 4> InstantiatedBases;
1755   for (ClassTemplateSpecializationDecl::base_class_iterator
1756          Base = Pattern->bases_begin(), BaseEnd = Pattern->bases_end();
1757        Base != BaseEnd; ++Base) {
1758     if (!Base->getType()->isDependentType()) {
1759       InstantiatedBases.push_back(new (Context) CXXBaseSpecifier(*Base));
1760       continue;
1761     }
1762 
1763     SourceLocation EllipsisLoc;
1764     TypeSourceInfo *BaseTypeLoc;
1765     if (Base->isPackExpansion()) {
1766       // This is a pack expansion. See whether we should expand it now, or
1767       // wait until later.
1768       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
1769       collectUnexpandedParameterPacks(Base->getTypeSourceInfo()->getTypeLoc(),
1770                                       Unexpanded);
1771       bool ShouldExpand = false;
1772       bool RetainExpansion = false;
1773       Optional<unsigned> NumExpansions;
1774       if (CheckParameterPacksForExpansion(Base->getEllipsisLoc(),
1775                                           Base->getSourceRange(),
1776                                           Unexpanded,
1777                                           TemplateArgs, ShouldExpand,
1778                                           RetainExpansion,
1779                                           NumExpansions)) {
1780         Invalid = true;
1781         continue;
1782       }
1783 
1784       // If we should expand this pack expansion now, do so.
1785       if (ShouldExpand) {
1786         for (unsigned I = 0; I != *NumExpansions; ++I) {
1787             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(*this, I);
1788 
1789           TypeSourceInfo *BaseTypeLoc = SubstType(Base->getTypeSourceInfo(),
1790                                                   TemplateArgs,
1791                                               Base->getSourceRange().getBegin(),
1792                                                   DeclarationName());
1793           if (!BaseTypeLoc) {
1794             Invalid = true;
1795             continue;
1796           }
1797 
1798           if (CXXBaseSpecifier *InstantiatedBase
1799                 = CheckBaseSpecifier(Instantiation,
1800                                      Base->getSourceRange(),
1801                                      Base->isVirtual(),
1802                                      Base->getAccessSpecifierAsWritten(),
1803                                      BaseTypeLoc,
1804                                      SourceLocation()))
1805             InstantiatedBases.push_back(InstantiatedBase);
1806           else
1807             Invalid = true;
1808         }
1809 
1810         continue;
1811       }
1812 
1813       // The resulting base specifier will (still) be a pack expansion.
1814       EllipsisLoc = Base->getEllipsisLoc();
1815       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(*this, -1);
1816       BaseTypeLoc = SubstType(Base->getTypeSourceInfo(),
1817                               TemplateArgs,
1818                               Base->getSourceRange().getBegin(),
1819                               DeclarationName());
1820     } else {
1821       BaseTypeLoc = SubstType(Base->getTypeSourceInfo(),
1822                               TemplateArgs,
1823                               Base->getSourceRange().getBegin(),
1824                               DeclarationName());
1825     }
1826 
1827     if (!BaseTypeLoc) {
1828       Invalid = true;
1829       continue;
1830     }
1831 
1832     if (CXXBaseSpecifier *InstantiatedBase
1833           = CheckBaseSpecifier(Instantiation,
1834                                Base->getSourceRange(),
1835                                Base->isVirtual(),
1836                                Base->getAccessSpecifierAsWritten(),
1837                                BaseTypeLoc,
1838                                EllipsisLoc))
1839       InstantiatedBases.push_back(InstantiatedBase);
1840     else
1841       Invalid = true;
1842   }
1843 
1844   if (!Invalid &&
1845       AttachBaseSpecifiers(Instantiation, InstantiatedBases.data(),
1846                            InstantiatedBases.size()))
1847     Invalid = true;
1848 
1849   return Invalid;
1850 }
1851 
1852 // Defined via #include from SemaTemplateInstantiateDecl.cpp
1853 namespace clang {
1854   namespace sema {
1855     Attr *instantiateTemplateAttribute(const Attr *At, ASTContext &C, Sema &S,
1856                             const MultiLevelTemplateArgumentList &TemplateArgs);
1857   }
1858 }
1859 
1860 /// Determine whether we would be unable to instantiate this template (because
1861 /// it either has no definition, or is in the process of being instantiated).
DiagnoseUninstantiableTemplate(Sema & S,SourceLocation PointOfInstantiation,TagDecl * Instantiation,bool InstantiatedFromMember,TagDecl * Pattern,TagDecl * PatternDef,TemplateSpecializationKind TSK,bool Complain=true)1862 static bool DiagnoseUninstantiableTemplate(Sema &S,
1863                                            SourceLocation PointOfInstantiation,
1864                                            TagDecl *Instantiation,
1865                                            bool InstantiatedFromMember,
1866                                            TagDecl *Pattern,
1867                                            TagDecl *PatternDef,
1868                                            TemplateSpecializationKind TSK,
1869                                            bool Complain = true) {
1870   if (PatternDef && !PatternDef->isBeingDefined())
1871     return false;
1872 
1873   if (!Complain || (PatternDef && PatternDef->isInvalidDecl())) {
1874     // Say nothing
1875   } else if (PatternDef) {
1876     assert(PatternDef->isBeingDefined());
1877     S.Diag(PointOfInstantiation,
1878            diag::err_template_instantiate_within_definition)
1879       << (TSK != TSK_ImplicitInstantiation)
1880       << S.Context.getTypeDeclType(Instantiation);
1881     // Not much point in noting the template declaration here, since
1882     // we're lexically inside it.
1883     Instantiation->setInvalidDecl();
1884   } else if (InstantiatedFromMember) {
1885     S.Diag(PointOfInstantiation,
1886            diag::err_implicit_instantiate_member_undefined)
1887       << S.Context.getTypeDeclType(Instantiation);
1888     S.Diag(Pattern->getLocation(), diag::note_member_of_template_here);
1889   } else {
1890     S.Diag(PointOfInstantiation, diag::err_template_instantiate_undefined)
1891       << (TSK != TSK_ImplicitInstantiation)
1892       << S.Context.getTypeDeclType(Instantiation);
1893     S.Diag(Pattern->getLocation(), diag::note_template_decl_here);
1894   }
1895 
1896   // In general, Instantiation isn't marked invalid to get more than one
1897   // error for multiple undefined instantiations. But the code that does
1898   // explicit declaration -> explicit definition conversion can't handle
1899   // invalid declarations, so mark as invalid in that case.
1900   if (TSK == TSK_ExplicitInstantiationDeclaration)
1901     Instantiation->setInvalidDecl();
1902   return true;
1903 }
1904 
1905 /// \brief Instantiate the definition of a class from a given pattern.
1906 ///
1907 /// \param PointOfInstantiation The point of instantiation within the
1908 /// source code.
1909 ///
1910 /// \param Instantiation is the declaration whose definition is being
1911 /// instantiated. This will be either a class template specialization
1912 /// or a member class of a class template specialization.
1913 ///
1914 /// \param Pattern is the pattern from which the instantiation
1915 /// occurs. This will be either the declaration of a class template or
1916 /// the declaration of a member class of a class template.
1917 ///
1918 /// \param TemplateArgs The template arguments to be substituted into
1919 /// the pattern.
1920 ///
1921 /// \param TSK the kind of implicit or explicit instantiation to perform.
1922 ///
1923 /// \param Complain whether to complain if the class cannot be instantiated due
1924 /// to the lack of a definition.
1925 ///
1926 /// \returns true if an error occurred, false otherwise.
1927 bool
InstantiateClass(SourceLocation PointOfInstantiation,CXXRecordDecl * Instantiation,CXXRecordDecl * Pattern,const MultiLevelTemplateArgumentList & TemplateArgs,TemplateSpecializationKind TSK,bool Complain)1928 Sema::InstantiateClass(SourceLocation PointOfInstantiation,
1929                        CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern,
1930                        const MultiLevelTemplateArgumentList &TemplateArgs,
1931                        TemplateSpecializationKind TSK,
1932                        bool Complain) {
1933   CXXRecordDecl *PatternDef
1934     = cast_or_null<CXXRecordDecl>(Pattern->getDefinition());
1935   if (DiagnoseUninstantiableTemplate(*this, PointOfInstantiation, Instantiation,
1936                                 Instantiation->getInstantiatedFromMemberClass(),
1937                                      Pattern, PatternDef, TSK, Complain))
1938     return true;
1939   Pattern = PatternDef;
1940 
1941   // \brief Record the point of instantiation.
1942   if (MemberSpecializationInfo *MSInfo
1943         = Instantiation->getMemberSpecializationInfo()) {
1944     MSInfo->setTemplateSpecializationKind(TSK);
1945     MSInfo->setPointOfInstantiation(PointOfInstantiation);
1946   } else if (ClassTemplateSpecializationDecl *Spec
1947         = dyn_cast<ClassTemplateSpecializationDecl>(Instantiation)) {
1948     Spec->setTemplateSpecializationKind(TSK);
1949     Spec->setPointOfInstantiation(PointOfInstantiation);
1950   }
1951 
1952   InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation);
1953   if (Inst)
1954     return true;
1955 
1956   // Enter the scope of this instantiation. We don't use
1957   // PushDeclContext because we don't have a scope.
1958   ContextRAII SavedContext(*this, Instantiation);
1959   EnterExpressionEvaluationContext EvalContext(*this,
1960                                                Sema::PotentiallyEvaluated);
1961 
1962   // If this is an instantiation of a local class, merge this local
1963   // instantiation scope with the enclosing scope. Otherwise, every
1964   // instantiation of a class has its own local instantiation scope.
1965   bool MergeWithParentScope = !Instantiation->isDefinedOutsideFunctionOrMethod();
1966   LocalInstantiationScope Scope(*this, MergeWithParentScope);
1967 
1968   // Pull attributes from the pattern onto the instantiation.
1969   InstantiateAttrs(TemplateArgs, Pattern, Instantiation);
1970 
1971   // Start the definition of this instantiation.
1972   Instantiation->startDefinition();
1973 
1974   Instantiation->setTagKind(Pattern->getTagKind());
1975 
1976   // Do substitution on the base class specifiers.
1977   if (SubstBaseSpecifiers(Instantiation, Pattern, TemplateArgs))
1978     Instantiation->setInvalidDecl();
1979 
1980   TemplateDeclInstantiator Instantiator(*this, Instantiation, TemplateArgs);
1981   SmallVector<Decl*, 4> Fields;
1982   SmallVector<std::pair<FieldDecl*, FieldDecl*>, 4>
1983     FieldsWithMemberInitializers;
1984   // Delay instantiation of late parsed attributes.
1985   LateInstantiatedAttrVec LateAttrs;
1986   Instantiator.enableLateAttributeInstantiation(&LateAttrs);
1987 
1988   for (RecordDecl::decl_iterator Member = Pattern->decls_begin(),
1989          MemberEnd = Pattern->decls_end();
1990        Member != MemberEnd; ++Member) {
1991     // Don't instantiate members not belonging in this semantic context.
1992     // e.g. for:
1993     // @code
1994     //    template <int i> class A {
1995     //      class B *g;
1996     //    };
1997     // @endcode
1998     // 'class B' has the template as lexical context but semantically it is
1999     // introduced in namespace scope.
2000     if ((*Member)->getDeclContext() != Pattern)
2001       continue;
2002 
2003     if ((*Member)->isInvalidDecl()) {
2004       Instantiation->setInvalidDecl();
2005       continue;
2006     }
2007 
2008     Decl *NewMember = Instantiator.Visit(*Member);
2009     if (NewMember) {
2010       if (FieldDecl *Field = dyn_cast<FieldDecl>(NewMember)) {
2011         Fields.push_back(Field);
2012         FieldDecl *OldField = cast<FieldDecl>(*Member);
2013         if (OldField->getInClassInitializer())
2014           FieldsWithMemberInitializers.push_back(std::make_pair(OldField,
2015                                                                 Field));
2016       } else if (EnumDecl *Enum = dyn_cast<EnumDecl>(NewMember)) {
2017         // C++11 [temp.inst]p1: The implicit instantiation of a class template
2018         // specialization causes the implicit instantiation of the definitions
2019         // of unscoped member enumerations.
2020         // Record a point of instantiation for this implicit instantiation.
2021         if (TSK == TSK_ImplicitInstantiation && !Enum->isScoped() &&
2022             Enum->isCompleteDefinition()) {
2023           MemberSpecializationInfo *MSInfo =Enum->getMemberSpecializationInfo();
2024           assert(MSInfo && "no spec info for member enum specialization");
2025           MSInfo->setTemplateSpecializationKind(TSK_ImplicitInstantiation);
2026           MSInfo->setPointOfInstantiation(PointOfInstantiation);
2027         }
2028       } else if (StaticAssertDecl *SA = dyn_cast<StaticAssertDecl>(NewMember)) {
2029         if (SA->isFailed()) {
2030           // A static_assert failed. Bail out; instantiating this
2031           // class is probably not meaningful.
2032           Instantiation->setInvalidDecl();
2033           break;
2034         }
2035       }
2036 
2037       if (NewMember->isInvalidDecl())
2038         Instantiation->setInvalidDecl();
2039     } else {
2040       // FIXME: Eventually, a NULL return will mean that one of the
2041       // instantiations was a semantic disaster, and we'll want to mark the
2042       // declaration invalid.
2043       // For now, we expect to skip some members that we can't yet handle.
2044     }
2045   }
2046 
2047   // Finish checking fields.
2048   ActOnFields(0, Instantiation->getLocation(), Instantiation, Fields,
2049               SourceLocation(), SourceLocation(), 0);
2050   CheckCompletedCXXClass(Instantiation);
2051 
2052   // Attach any in-class member initializers now the class is complete.
2053   // FIXME: We are supposed to defer instantiating these until they are needed.
2054   if (!FieldsWithMemberInitializers.empty()) {
2055     // C++11 [expr.prim.general]p4:
2056     //   Otherwise, if a member-declarator declares a non-static data member
2057     //  (9.2) of a class X, the expression this is a prvalue of type "pointer
2058     //  to X" within the optional brace-or-equal-initializer. It shall not
2059     //  appear elsewhere in the member-declarator.
2060     CXXThisScopeRAII ThisScope(*this, Instantiation, (unsigned)0);
2061 
2062     for (unsigned I = 0, N = FieldsWithMemberInitializers.size(); I != N; ++I) {
2063       FieldDecl *OldField = FieldsWithMemberInitializers[I].first;
2064       FieldDecl *NewField = FieldsWithMemberInitializers[I].second;
2065       Expr *OldInit = OldField->getInClassInitializer();
2066 
2067       ExprResult NewInit = SubstInitializer(OldInit, TemplateArgs,
2068                                             /*CXXDirectInit=*/false);
2069       if (NewInit.isInvalid())
2070         NewField->setInvalidDecl();
2071       else {
2072         Expr *Init = NewInit.take();
2073         assert(Init && "no-argument initializer in class");
2074         assert(!isa<ParenListExpr>(Init) && "call-style init in class");
2075         ActOnCXXInClassMemberInitializer(NewField, Init->getLocStart(), Init);
2076       }
2077     }
2078   }
2079   // Instantiate late parsed attributes, and attach them to their decls.
2080   // See Sema::InstantiateAttrs
2081   for (LateInstantiatedAttrVec::iterator I = LateAttrs.begin(),
2082        E = LateAttrs.end(); I != E; ++I) {
2083     assert(CurrentInstantiationScope == Instantiator.getStartingScope());
2084     CurrentInstantiationScope = I->Scope;
2085     Attr *NewAttr =
2086       instantiateTemplateAttribute(I->TmplAttr, Context, *this, TemplateArgs);
2087     I->NewDecl->addAttr(NewAttr);
2088     LocalInstantiationScope::deleteScopes(I->Scope,
2089                                           Instantiator.getStartingScope());
2090   }
2091   Instantiator.disableLateAttributeInstantiation();
2092   LateAttrs.clear();
2093 
2094   ActOnFinishDelayedMemberInitializers(Instantiation);
2095 
2096   if (TSK == TSK_ImplicitInstantiation) {
2097     Instantiation->setLocation(Pattern->getLocation());
2098     Instantiation->setLocStart(Pattern->getInnerLocStart());
2099     Instantiation->setRBraceLoc(Pattern->getRBraceLoc());
2100   }
2101 
2102   if (!Instantiation->isInvalidDecl()) {
2103     // Perform any dependent diagnostics from the pattern.
2104     PerformDependentDiagnostics(Pattern, TemplateArgs);
2105 
2106     // Instantiate any out-of-line class template partial
2107     // specializations now.
2108     for (TemplateDeclInstantiator::delayed_partial_spec_iterator
2109               P = Instantiator.delayed_partial_spec_begin(),
2110            PEnd = Instantiator.delayed_partial_spec_end();
2111          P != PEnd; ++P) {
2112       if (!Instantiator.InstantiateClassTemplatePartialSpecialization(
2113                                                                 P->first,
2114                                                                 P->second)) {
2115         Instantiation->setInvalidDecl();
2116         break;
2117       }
2118     }
2119   }
2120 
2121   // Exit the scope of this instantiation.
2122   SavedContext.pop();
2123 
2124   if (!Instantiation->isInvalidDecl()) {
2125     Consumer.HandleTagDeclDefinition(Instantiation);
2126 
2127     // Always emit the vtable for an explicit instantiation definition
2128     // of a polymorphic class template specialization.
2129     if (TSK == TSK_ExplicitInstantiationDefinition)
2130       MarkVTableUsed(PointOfInstantiation, Instantiation, true);
2131   }
2132 
2133   return Instantiation->isInvalidDecl();
2134 }
2135 
2136 /// \brief Instantiate the definition of an enum from a given pattern.
2137 ///
2138 /// \param PointOfInstantiation The point of instantiation within the
2139 ///        source code.
2140 /// \param Instantiation is the declaration whose definition is being
2141 ///        instantiated. This will be a member enumeration of a class
2142 ///        temploid specialization, or a local enumeration within a
2143 ///        function temploid specialization.
2144 /// \param Pattern The templated declaration from which the instantiation
2145 ///        occurs.
2146 /// \param TemplateArgs The template arguments to be substituted into
2147 ///        the pattern.
2148 /// \param TSK The kind of implicit or explicit instantiation to perform.
2149 ///
2150 /// \return \c true if an error occurred, \c false otherwise.
InstantiateEnum(SourceLocation PointOfInstantiation,EnumDecl * Instantiation,EnumDecl * Pattern,const MultiLevelTemplateArgumentList & TemplateArgs,TemplateSpecializationKind TSK)2151 bool Sema::InstantiateEnum(SourceLocation PointOfInstantiation,
2152                            EnumDecl *Instantiation, EnumDecl *Pattern,
2153                            const MultiLevelTemplateArgumentList &TemplateArgs,
2154                            TemplateSpecializationKind TSK) {
2155   EnumDecl *PatternDef = Pattern->getDefinition();
2156   if (DiagnoseUninstantiableTemplate(*this, PointOfInstantiation, Instantiation,
2157                                  Instantiation->getInstantiatedFromMemberEnum(),
2158                                      Pattern, PatternDef, TSK,/*Complain*/true))
2159     return true;
2160   Pattern = PatternDef;
2161 
2162   // Record the point of instantiation.
2163   if (MemberSpecializationInfo *MSInfo
2164         = Instantiation->getMemberSpecializationInfo()) {
2165     MSInfo->setTemplateSpecializationKind(TSK);
2166     MSInfo->setPointOfInstantiation(PointOfInstantiation);
2167   }
2168 
2169   InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation);
2170   if (Inst)
2171     return true;
2172 
2173   // Enter the scope of this instantiation. We don't use
2174   // PushDeclContext because we don't have a scope.
2175   ContextRAII SavedContext(*this, Instantiation);
2176   EnterExpressionEvaluationContext EvalContext(*this,
2177                                                Sema::PotentiallyEvaluated);
2178 
2179   LocalInstantiationScope Scope(*this, /*MergeWithParentScope*/true);
2180 
2181   // Pull attributes from the pattern onto the instantiation.
2182   InstantiateAttrs(TemplateArgs, Pattern, Instantiation);
2183 
2184   TemplateDeclInstantiator Instantiator(*this, Instantiation, TemplateArgs);
2185   Instantiator.InstantiateEnumDefinition(Instantiation, Pattern);
2186 
2187   // Exit the scope of this instantiation.
2188   SavedContext.pop();
2189 
2190   return Instantiation->isInvalidDecl();
2191 }
2192 
2193 namespace {
2194   /// \brief A partial specialization whose template arguments have matched
2195   /// a given template-id.
2196   struct PartialSpecMatchResult {
2197     ClassTemplatePartialSpecializationDecl *Partial;
2198     TemplateArgumentList *Args;
2199   };
2200 }
2201 
2202 bool
InstantiateClassTemplateSpecialization(SourceLocation PointOfInstantiation,ClassTemplateSpecializationDecl * ClassTemplateSpec,TemplateSpecializationKind TSK,bool Complain)2203 Sema::InstantiateClassTemplateSpecialization(
2204                            SourceLocation PointOfInstantiation,
2205                            ClassTemplateSpecializationDecl *ClassTemplateSpec,
2206                            TemplateSpecializationKind TSK,
2207                            bool Complain) {
2208   // Perform the actual instantiation on the canonical declaration.
2209   ClassTemplateSpec = cast<ClassTemplateSpecializationDecl>(
2210                                          ClassTemplateSpec->getCanonicalDecl());
2211 
2212   // Check whether we have already instantiated or specialized this class
2213   // template specialization.
2214   if (ClassTemplateSpec->getSpecializationKind() != TSK_Undeclared) {
2215     if (ClassTemplateSpec->getSpecializationKind() ==
2216           TSK_ExplicitInstantiationDeclaration &&
2217         TSK == TSK_ExplicitInstantiationDefinition) {
2218       // An explicit instantiation definition follows an explicit instantiation
2219       // declaration (C++0x [temp.explicit]p10); go ahead and perform the
2220       // explicit instantiation.
2221       ClassTemplateSpec->setSpecializationKind(TSK);
2222 
2223       // If this is an explicit instantiation definition, mark the
2224       // vtable as used.
2225       if (TSK == TSK_ExplicitInstantiationDefinition &&
2226           !ClassTemplateSpec->isInvalidDecl())
2227         MarkVTableUsed(PointOfInstantiation, ClassTemplateSpec, true);
2228 
2229       return false;
2230     }
2231 
2232     // We can only instantiate something that hasn't already been
2233     // instantiated or specialized. Fail without any diagnostics: our
2234     // caller will provide an error message.
2235     return true;
2236   }
2237 
2238   if (ClassTemplateSpec->isInvalidDecl())
2239     return true;
2240 
2241   ClassTemplateDecl *Template = ClassTemplateSpec->getSpecializedTemplate();
2242   CXXRecordDecl *Pattern = 0;
2243 
2244   // C++ [temp.class.spec.match]p1:
2245   //   When a class template is used in a context that requires an
2246   //   instantiation of the class, it is necessary to determine
2247   //   whether the instantiation is to be generated using the primary
2248   //   template or one of the partial specializations. This is done by
2249   //   matching the template arguments of the class template
2250   //   specialization with the template argument lists of the partial
2251   //   specializations.
2252   typedef PartialSpecMatchResult MatchResult;
2253   SmallVector<MatchResult, 4> Matched;
2254   SmallVector<ClassTemplatePartialSpecializationDecl *, 4> PartialSpecs;
2255   Template->getPartialSpecializations(PartialSpecs);
2256   for (unsigned I = 0, N = PartialSpecs.size(); I != N; ++I) {
2257     ClassTemplatePartialSpecializationDecl *Partial = PartialSpecs[I];
2258     TemplateDeductionInfo Info(PointOfInstantiation);
2259     if (TemplateDeductionResult Result
2260           = DeduceTemplateArguments(Partial,
2261                                     ClassTemplateSpec->getTemplateArgs(),
2262                                     Info)) {
2263       // FIXME: Store the failed-deduction information for use in
2264       // diagnostics, later.
2265       (void)Result;
2266     } else {
2267       Matched.push_back(PartialSpecMatchResult());
2268       Matched.back().Partial = Partial;
2269       Matched.back().Args = Info.take();
2270     }
2271   }
2272 
2273   // If we're dealing with a member template where the template parameters
2274   // have been instantiated, this provides the original template parameters
2275   // from which the member template's parameters were instantiated.
2276   SmallVector<const NamedDecl *, 4> InstantiatedTemplateParameters;
2277 
2278   if (Matched.size() >= 1) {
2279     SmallVector<MatchResult, 4>::iterator Best = Matched.begin();
2280     if (Matched.size() == 1) {
2281       //   -- If exactly one matching specialization is found, the
2282       //      instantiation is generated from that specialization.
2283       // We don't need to do anything for this.
2284     } else {
2285       //   -- If more than one matching specialization is found, the
2286       //      partial order rules (14.5.4.2) are used to determine
2287       //      whether one of the specializations is more specialized
2288       //      than the others. If none of the specializations is more
2289       //      specialized than all of the other matching
2290       //      specializations, then the use of the class template is
2291       //      ambiguous and the program is ill-formed.
2292       for (SmallVector<MatchResult, 4>::iterator P = Best + 1,
2293                                                     PEnd = Matched.end();
2294            P != PEnd; ++P) {
2295         if (getMoreSpecializedPartialSpecialization(P->Partial, Best->Partial,
2296                                                     PointOfInstantiation)
2297               == P->Partial)
2298           Best = P;
2299       }
2300 
2301       // Determine if the best partial specialization is more specialized than
2302       // the others.
2303       bool Ambiguous = false;
2304       for (SmallVector<MatchResult, 4>::iterator P = Matched.begin(),
2305                                                     PEnd = Matched.end();
2306            P != PEnd; ++P) {
2307         if (P != Best &&
2308             getMoreSpecializedPartialSpecialization(P->Partial, Best->Partial,
2309                                                     PointOfInstantiation)
2310               != Best->Partial) {
2311           Ambiguous = true;
2312           break;
2313         }
2314       }
2315 
2316       if (Ambiguous) {
2317         // Partial ordering did not produce a clear winner. Complain.
2318         ClassTemplateSpec->setInvalidDecl();
2319         Diag(PointOfInstantiation, diag::err_partial_spec_ordering_ambiguous)
2320           << ClassTemplateSpec;
2321 
2322         // Print the matching partial specializations.
2323         for (SmallVector<MatchResult, 4>::iterator P = Matched.begin(),
2324                                                       PEnd = Matched.end();
2325              P != PEnd; ++P)
2326           Diag(P->Partial->getLocation(), diag::note_partial_spec_match)
2327             << getTemplateArgumentBindingsText(
2328                                             P->Partial->getTemplateParameters(),
2329                                                *P->Args);
2330 
2331         return true;
2332       }
2333     }
2334 
2335     // Instantiate using the best class template partial specialization.
2336     ClassTemplatePartialSpecializationDecl *OrigPartialSpec = Best->Partial;
2337     while (OrigPartialSpec->getInstantiatedFromMember()) {
2338       // If we've found an explicit specialization of this class template,
2339       // stop here and use that as the pattern.
2340       if (OrigPartialSpec->isMemberSpecialization())
2341         break;
2342 
2343       OrigPartialSpec = OrigPartialSpec->getInstantiatedFromMember();
2344     }
2345 
2346     Pattern = OrigPartialSpec;
2347     ClassTemplateSpec->setInstantiationOf(Best->Partial, Best->Args);
2348   } else {
2349     //   -- If no matches are found, the instantiation is generated
2350     //      from the primary template.
2351     ClassTemplateDecl *OrigTemplate = Template;
2352     while (OrigTemplate->getInstantiatedFromMemberTemplate()) {
2353       // If we've found an explicit specialization of this class template,
2354       // stop here and use that as the pattern.
2355       if (OrigTemplate->isMemberSpecialization())
2356         break;
2357 
2358       OrigTemplate = OrigTemplate->getInstantiatedFromMemberTemplate();
2359     }
2360 
2361     Pattern = OrigTemplate->getTemplatedDecl();
2362   }
2363 
2364   bool Result = InstantiateClass(PointOfInstantiation, ClassTemplateSpec,
2365                                  Pattern,
2366                                 getTemplateInstantiationArgs(ClassTemplateSpec),
2367                                  TSK,
2368                                  Complain);
2369 
2370   return Result;
2371 }
2372 
2373 /// \brief Instantiates the definitions of all of the member
2374 /// of the given class, which is an instantiation of a class template
2375 /// or a member class of a template.
2376 void
InstantiateClassMembers(SourceLocation PointOfInstantiation,CXXRecordDecl * Instantiation,const MultiLevelTemplateArgumentList & TemplateArgs,TemplateSpecializationKind TSK)2377 Sema::InstantiateClassMembers(SourceLocation PointOfInstantiation,
2378                               CXXRecordDecl *Instantiation,
2379                         const MultiLevelTemplateArgumentList &TemplateArgs,
2380                               TemplateSpecializationKind TSK) {
2381   for (DeclContext::decl_iterator D = Instantiation->decls_begin(),
2382                                DEnd = Instantiation->decls_end();
2383        D != DEnd; ++D) {
2384     bool SuppressNew = false;
2385     if (FunctionDecl *Function = dyn_cast<FunctionDecl>(*D)) {
2386       if (FunctionDecl *Pattern
2387             = Function->getInstantiatedFromMemberFunction()) {
2388         MemberSpecializationInfo *MSInfo
2389           = Function->getMemberSpecializationInfo();
2390         assert(MSInfo && "No member specialization information?");
2391         if (MSInfo->getTemplateSpecializationKind()
2392                                                  == TSK_ExplicitSpecialization)
2393           continue;
2394 
2395         if (CheckSpecializationInstantiationRedecl(PointOfInstantiation, TSK,
2396                                                    Function,
2397                                         MSInfo->getTemplateSpecializationKind(),
2398                                               MSInfo->getPointOfInstantiation(),
2399                                                    SuppressNew) ||
2400             SuppressNew)
2401           continue;
2402 
2403         if (Function->isDefined())
2404           continue;
2405 
2406         if (TSK == TSK_ExplicitInstantiationDefinition) {
2407           // C++0x [temp.explicit]p8:
2408           //   An explicit instantiation definition that names a class template
2409           //   specialization explicitly instantiates the class template
2410           //   specialization and is only an explicit instantiation definition
2411           //   of members whose definition is visible at the point of
2412           //   instantiation.
2413           if (!Pattern->isDefined())
2414             continue;
2415 
2416           Function->setTemplateSpecializationKind(TSK, PointOfInstantiation);
2417 
2418           InstantiateFunctionDefinition(PointOfInstantiation, Function);
2419         } else {
2420           Function->setTemplateSpecializationKind(TSK, PointOfInstantiation);
2421         }
2422       }
2423     } else if (VarDecl *Var = dyn_cast<VarDecl>(*D)) {
2424       if (Var->isStaticDataMember()) {
2425         MemberSpecializationInfo *MSInfo = Var->getMemberSpecializationInfo();
2426         assert(MSInfo && "No member specialization information?");
2427         if (MSInfo->getTemplateSpecializationKind()
2428                                                  == TSK_ExplicitSpecialization)
2429           continue;
2430 
2431         if (CheckSpecializationInstantiationRedecl(PointOfInstantiation, TSK,
2432                                                    Var,
2433                                         MSInfo->getTemplateSpecializationKind(),
2434                                               MSInfo->getPointOfInstantiation(),
2435                                                    SuppressNew) ||
2436             SuppressNew)
2437           continue;
2438 
2439         if (TSK == TSK_ExplicitInstantiationDefinition) {
2440           // C++0x [temp.explicit]p8:
2441           //   An explicit instantiation definition that names a class template
2442           //   specialization explicitly instantiates the class template
2443           //   specialization and is only an explicit instantiation definition
2444           //   of members whose definition is visible at the point of
2445           //   instantiation.
2446           if (!Var->getInstantiatedFromStaticDataMember()
2447                                                      ->getOutOfLineDefinition())
2448             continue;
2449 
2450           Var->setTemplateSpecializationKind(TSK, PointOfInstantiation);
2451           InstantiateStaticDataMemberDefinition(PointOfInstantiation, Var);
2452         } else {
2453           Var->setTemplateSpecializationKind(TSK, PointOfInstantiation);
2454         }
2455       }
2456     } else if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(*D)) {
2457       // Always skip the injected-class-name, along with any
2458       // redeclarations of nested classes, since both would cause us
2459       // to try to instantiate the members of a class twice.
2460       if (Record->isInjectedClassName() || Record->getPreviousDecl())
2461         continue;
2462 
2463       MemberSpecializationInfo *MSInfo = Record->getMemberSpecializationInfo();
2464       assert(MSInfo && "No member specialization information?");
2465 
2466       if (MSInfo->getTemplateSpecializationKind()
2467                                                 == TSK_ExplicitSpecialization)
2468         continue;
2469 
2470       if (CheckSpecializationInstantiationRedecl(PointOfInstantiation, TSK,
2471                                                  Record,
2472                                         MSInfo->getTemplateSpecializationKind(),
2473                                               MSInfo->getPointOfInstantiation(),
2474                                                  SuppressNew) ||
2475           SuppressNew)
2476         continue;
2477 
2478       CXXRecordDecl *Pattern = Record->getInstantiatedFromMemberClass();
2479       assert(Pattern && "Missing instantiated-from-template information");
2480 
2481       if (!Record->getDefinition()) {
2482         if (!Pattern->getDefinition()) {
2483           // C++0x [temp.explicit]p8:
2484           //   An explicit instantiation definition that names a class template
2485           //   specialization explicitly instantiates the class template
2486           //   specialization and is only an explicit instantiation definition
2487           //   of members whose definition is visible at the point of
2488           //   instantiation.
2489           if (TSK == TSK_ExplicitInstantiationDeclaration) {
2490             MSInfo->setTemplateSpecializationKind(TSK);
2491             MSInfo->setPointOfInstantiation(PointOfInstantiation);
2492           }
2493 
2494           continue;
2495         }
2496 
2497         InstantiateClass(PointOfInstantiation, Record, Pattern,
2498                          TemplateArgs,
2499                          TSK);
2500       } else {
2501         if (TSK == TSK_ExplicitInstantiationDefinition &&
2502             Record->getTemplateSpecializationKind() ==
2503                 TSK_ExplicitInstantiationDeclaration) {
2504           Record->setTemplateSpecializationKind(TSK);
2505           MarkVTableUsed(PointOfInstantiation, Record, true);
2506         }
2507       }
2508 
2509       Pattern = cast_or_null<CXXRecordDecl>(Record->getDefinition());
2510       if (Pattern)
2511         InstantiateClassMembers(PointOfInstantiation, Pattern, TemplateArgs,
2512                                 TSK);
2513     } else if (EnumDecl *Enum = dyn_cast<EnumDecl>(*D)) {
2514       MemberSpecializationInfo *MSInfo = Enum->getMemberSpecializationInfo();
2515       assert(MSInfo && "No member specialization information?");
2516 
2517       if (MSInfo->getTemplateSpecializationKind()
2518             == TSK_ExplicitSpecialization)
2519         continue;
2520 
2521       if (CheckSpecializationInstantiationRedecl(
2522             PointOfInstantiation, TSK, Enum,
2523             MSInfo->getTemplateSpecializationKind(),
2524             MSInfo->getPointOfInstantiation(), SuppressNew) ||
2525           SuppressNew)
2526         continue;
2527 
2528       if (Enum->getDefinition())
2529         continue;
2530 
2531       EnumDecl *Pattern = Enum->getInstantiatedFromMemberEnum();
2532       assert(Pattern && "Missing instantiated-from-template information");
2533 
2534       if (TSK == TSK_ExplicitInstantiationDefinition) {
2535         if (!Pattern->getDefinition())
2536           continue;
2537 
2538         InstantiateEnum(PointOfInstantiation, Enum, Pattern, TemplateArgs, TSK);
2539       } else {
2540         MSInfo->setTemplateSpecializationKind(TSK);
2541         MSInfo->setPointOfInstantiation(PointOfInstantiation);
2542       }
2543     }
2544   }
2545 }
2546 
2547 /// \brief Instantiate the definitions of all of the members of the
2548 /// given class template specialization, which was named as part of an
2549 /// explicit instantiation.
2550 void
InstantiateClassTemplateSpecializationMembers(SourceLocation PointOfInstantiation,ClassTemplateSpecializationDecl * ClassTemplateSpec,TemplateSpecializationKind TSK)2551 Sema::InstantiateClassTemplateSpecializationMembers(
2552                                            SourceLocation PointOfInstantiation,
2553                             ClassTemplateSpecializationDecl *ClassTemplateSpec,
2554                                                TemplateSpecializationKind TSK) {
2555   // C++0x [temp.explicit]p7:
2556   //   An explicit instantiation that names a class template
2557   //   specialization is an explicit instantion of the same kind
2558   //   (declaration or definition) of each of its members (not
2559   //   including members inherited from base classes) that has not
2560   //   been previously explicitly specialized in the translation unit
2561   //   containing the explicit instantiation, except as described
2562   //   below.
2563   InstantiateClassMembers(PointOfInstantiation, ClassTemplateSpec,
2564                           getTemplateInstantiationArgs(ClassTemplateSpec),
2565                           TSK);
2566 }
2567 
2568 StmtResult
SubstStmt(Stmt * S,const MultiLevelTemplateArgumentList & TemplateArgs)2569 Sema::SubstStmt(Stmt *S, const MultiLevelTemplateArgumentList &TemplateArgs) {
2570   if (!S)
2571     return Owned(S);
2572 
2573   TemplateInstantiator Instantiator(*this, TemplateArgs,
2574                                     SourceLocation(),
2575                                     DeclarationName());
2576   return Instantiator.TransformStmt(S);
2577 }
2578 
2579 ExprResult
SubstExpr(Expr * E,const MultiLevelTemplateArgumentList & TemplateArgs)2580 Sema::SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs) {
2581   if (!E)
2582     return Owned(E);
2583 
2584   TemplateInstantiator Instantiator(*this, TemplateArgs,
2585                                     SourceLocation(),
2586                                     DeclarationName());
2587   return Instantiator.TransformExpr(E);
2588 }
2589 
SubstInitializer(Expr * Init,const MultiLevelTemplateArgumentList & TemplateArgs,bool CXXDirectInit)2590 ExprResult Sema::SubstInitializer(Expr *Init,
2591                           const MultiLevelTemplateArgumentList &TemplateArgs,
2592                           bool CXXDirectInit) {
2593   TemplateInstantiator Instantiator(*this, TemplateArgs,
2594                                     SourceLocation(),
2595                                     DeclarationName());
2596   return Instantiator.TransformInitializer(Init, CXXDirectInit);
2597 }
2598 
SubstExprs(Expr ** Exprs,unsigned NumExprs,bool IsCall,const MultiLevelTemplateArgumentList & TemplateArgs,SmallVectorImpl<Expr * > & Outputs)2599 bool Sema::SubstExprs(Expr **Exprs, unsigned NumExprs, bool IsCall,
2600                       const MultiLevelTemplateArgumentList &TemplateArgs,
2601                       SmallVectorImpl<Expr *> &Outputs) {
2602   if (NumExprs == 0)
2603     return false;
2604 
2605   TemplateInstantiator Instantiator(*this, TemplateArgs,
2606                                     SourceLocation(),
2607                                     DeclarationName());
2608   return Instantiator.TransformExprs(Exprs, NumExprs, IsCall, Outputs);
2609 }
2610 
2611 NestedNameSpecifierLoc
SubstNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,const MultiLevelTemplateArgumentList & TemplateArgs)2612 Sema::SubstNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
2613                         const MultiLevelTemplateArgumentList &TemplateArgs) {
2614   if (!NNS)
2615     return NestedNameSpecifierLoc();
2616 
2617   TemplateInstantiator Instantiator(*this, TemplateArgs, NNS.getBeginLoc(),
2618                                     DeclarationName());
2619   return Instantiator.TransformNestedNameSpecifierLoc(NNS);
2620 }
2621 
2622 /// \brief Do template substitution on declaration name info.
2623 DeclarationNameInfo
SubstDeclarationNameInfo(const DeclarationNameInfo & NameInfo,const MultiLevelTemplateArgumentList & TemplateArgs)2624 Sema::SubstDeclarationNameInfo(const DeclarationNameInfo &NameInfo,
2625                          const MultiLevelTemplateArgumentList &TemplateArgs) {
2626   TemplateInstantiator Instantiator(*this, TemplateArgs, NameInfo.getLoc(),
2627                                     NameInfo.getName());
2628   return Instantiator.TransformDeclarationNameInfo(NameInfo);
2629 }
2630 
2631 TemplateName
SubstTemplateName(NestedNameSpecifierLoc QualifierLoc,TemplateName Name,SourceLocation Loc,const MultiLevelTemplateArgumentList & TemplateArgs)2632 Sema::SubstTemplateName(NestedNameSpecifierLoc QualifierLoc,
2633                         TemplateName Name, SourceLocation Loc,
2634                         const MultiLevelTemplateArgumentList &TemplateArgs) {
2635   TemplateInstantiator Instantiator(*this, TemplateArgs, Loc,
2636                                     DeclarationName());
2637   CXXScopeSpec SS;
2638   SS.Adopt(QualifierLoc);
2639   return Instantiator.TransformTemplateName(SS, Name, Loc);
2640 }
2641 
Subst(const TemplateArgumentLoc * Args,unsigned NumArgs,TemplateArgumentListInfo & Result,const MultiLevelTemplateArgumentList & TemplateArgs)2642 bool Sema::Subst(const TemplateArgumentLoc *Args, unsigned NumArgs,
2643                  TemplateArgumentListInfo &Result,
2644                  const MultiLevelTemplateArgumentList &TemplateArgs) {
2645   TemplateInstantiator Instantiator(*this, TemplateArgs, SourceLocation(),
2646                                     DeclarationName());
2647 
2648   return Instantiator.TransformTemplateArguments(Args, NumArgs, Result);
2649 }
2650 
2651 
getCanonicalParmVarDecl(const Decl * D)2652 static const Decl* getCanonicalParmVarDecl(const Decl *D) {
2653   // When storing ParmVarDecls in the local instantiation scope, we always
2654   // want to use the ParmVarDecl from the canonical function declaration,
2655   // since the map is then valid for any redeclaration or definition of that
2656   // function.
2657   if (const ParmVarDecl *PV = dyn_cast<ParmVarDecl>(D)) {
2658     if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(PV->getDeclContext())) {
2659       unsigned i = PV->getFunctionScopeIndex();
2660       return FD->getCanonicalDecl()->getParamDecl(i);
2661     }
2662   }
2663   return D;
2664 }
2665 
2666 
2667 llvm::PointerUnion<Decl *, LocalInstantiationScope::DeclArgumentPack *> *
findInstantiationOf(const Decl * D)2668 LocalInstantiationScope::findInstantiationOf(const Decl *D) {
2669   D = getCanonicalParmVarDecl(D);
2670   for (LocalInstantiationScope *Current = this; Current;
2671        Current = Current->Outer) {
2672 
2673     // Check if we found something within this scope.
2674     const Decl *CheckD = D;
2675     do {
2676       LocalDeclsMap::iterator Found = Current->LocalDecls.find(CheckD);
2677       if (Found != Current->LocalDecls.end())
2678         return &Found->second;
2679 
2680       // If this is a tag declaration, it's possible that we need to look for
2681       // a previous declaration.
2682       if (const TagDecl *Tag = dyn_cast<TagDecl>(CheckD))
2683         CheckD = Tag->getPreviousDecl();
2684       else
2685         CheckD = 0;
2686     } while (CheckD);
2687 
2688     // If we aren't combined with our outer scope, we're done.
2689     if (!Current->CombineWithOuterScope)
2690       break;
2691   }
2692 
2693   // If we didn't find the decl, then we either have a sema bug, or we have a
2694   // forward reference to a label declaration.  Return null to indicate that
2695   // we have an uninstantiated label.
2696   assert(isa<LabelDecl>(D) && "declaration not instantiated in this scope");
2697   return 0;
2698 }
2699 
InstantiatedLocal(const Decl * D,Decl * Inst)2700 void LocalInstantiationScope::InstantiatedLocal(const Decl *D, Decl *Inst) {
2701   D = getCanonicalParmVarDecl(D);
2702   llvm::PointerUnion<Decl *, DeclArgumentPack *> &Stored = LocalDecls[D];
2703   if (Stored.isNull())
2704     Stored = Inst;
2705   else if (Stored.is<Decl *>()) {
2706     assert(Stored.get<Decl *>() == Inst && "Already instantiated this local");
2707     Stored = Inst;
2708   } else
2709     LocalDecls[D].get<DeclArgumentPack *>()->push_back(Inst);
2710 }
2711 
InstantiatedLocalPackArg(const Decl * D,Decl * Inst)2712 void LocalInstantiationScope::InstantiatedLocalPackArg(const Decl *D,
2713                                                        Decl *Inst) {
2714   D = getCanonicalParmVarDecl(D);
2715   DeclArgumentPack *Pack = LocalDecls[D].get<DeclArgumentPack *>();
2716   Pack->push_back(Inst);
2717 }
2718 
MakeInstantiatedLocalArgPack(const Decl * D)2719 void LocalInstantiationScope::MakeInstantiatedLocalArgPack(const Decl *D) {
2720   D = getCanonicalParmVarDecl(D);
2721   llvm::PointerUnion<Decl *, DeclArgumentPack *> &Stored = LocalDecls[D];
2722   assert(Stored.isNull() && "Already instantiated this local");
2723   DeclArgumentPack *Pack = new DeclArgumentPack;
2724   Stored = Pack;
2725   ArgumentPacks.push_back(Pack);
2726 }
2727 
SetPartiallySubstitutedPack(NamedDecl * Pack,const TemplateArgument * ExplicitArgs,unsigned NumExplicitArgs)2728 void LocalInstantiationScope::SetPartiallySubstitutedPack(NamedDecl *Pack,
2729                                           const TemplateArgument *ExplicitArgs,
2730                                                     unsigned NumExplicitArgs) {
2731   assert((!PartiallySubstitutedPack || PartiallySubstitutedPack == Pack) &&
2732          "Already have a partially-substituted pack");
2733   assert((!PartiallySubstitutedPack
2734           || NumArgsInPartiallySubstitutedPack == NumExplicitArgs) &&
2735          "Wrong number of arguments in partially-substituted pack");
2736   PartiallySubstitutedPack = Pack;
2737   ArgsInPartiallySubstitutedPack = ExplicitArgs;
2738   NumArgsInPartiallySubstitutedPack = NumExplicitArgs;
2739 }
2740 
getPartiallySubstitutedPack(const TemplateArgument ** ExplicitArgs,unsigned * NumExplicitArgs) const2741 NamedDecl *LocalInstantiationScope::getPartiallySubstitutedPack(
2742                                          const TemplateArgument **ExplicitArgs,
2743                                               unsigned *NumExplicitArgs) const {
2744   if (ExplicitArgs)
2745     *ExplicitArgs = 0;
2746   if (NumExplicitArgs)
2747     *NumExplicitArgs = 0;
2748 
2749   for (const LocalInstantiationScope *Current = this; Current;
2750        Current = Current->Outer) {
2751     if (Current->PartiallySubstitutedPack) {
2752       if (ExplicitArgs)
2753         *ExplicitArgs = Current->ArgsInPartiallySubstitutedPack;
2754       if (NumExplicitArgs)
2755         *NumExplicitArgs = Current->NumArgsInPartiallySubstitutedPack;
2756 
2757       return Current->PartiallySubstitutedPack;
2758     }
2759 
2760     if (!Current->CombineWithOuterScope)
2761       break;
2762   }
2763 
2764   return 0;
2765 }
2766