clang 22.0.0git
SemaTemplateInstantiate.cpp
Go to the documentation of this file.
1//===------- SemaTemplateInstantiate.cpp - C++ Template Instantiation ------===/
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//===----------------------------------------------------------------------===/
7//
8// This file implements C++ template instantiation.
9//
10//===----------------------------------------------------------------------===/
11
12#include "TreeTransform.h"
16#include "clang/AST/ASTLambda.h"
18#include "clang/AST/DeclBase.h"
21#include "clang/AST/Expr.h"
24#include "clang/AST/Type.h"
25#include "clang/AST/TypeLoc.h"
29#include "clang/Sema/DeclSpec.h"
32#include "clang/Sema/Sema.h"
35#include "clang/Sema/Template.h"
38#include "llvm/ADT/SmallVectorExtras.h"
39#include "llvm/ADT/StringExtras.h"
40#include "llvm/Support/ErrorHandling.h"
41#include "llvm/Support/SaveAndRestore.h"
42#include "llvm/Support/TimeProfiler.h"
43#include <optional>
44
45using namespace clang;
46using namespace sema;
47
48//===----------------------------------------------------------------------===/
49// Template Instantiation Support
50//===----------------------------------------------------------------------===/
51
52namespace {
54struct Response {
55 const Decl *NextDecl = nullptr;
56 bool IsDone = false;
57 bool ClearRelativeToPrimary = true;
58 static Response Done() {
59 Response R;
60 R.IsDone = true;
61 return R;
62 }
63 static Response ChangeDecl(const Decl *ND) {
64 Response R;
65 R.NextDecl = ND;
66 return R;
67 }
68 static Response ChangeDecl(const DeclContext *Ctx) {
69 Response R;
70 R.NextDecl = Decl::castFromDeclContext(Ctx);
71 return R;
72 }
73
74 static Response UseNextDecl(const Decl *CurDecl) {
75 return ChangeDecl(CurDecl->getDeclContext());
76 }
77
78 static Response DontClearRelativeToPrimaryNextDecl(const Decl *CurDecl) {
79 Response R = Response::UseNextDecl(CurDecl);
80 R.ClearRelativeToPrimary = false;
81 return R;
82 }
83};
84
85// Retrieve the primary template for a lambda call operator. It's
86// unfortunate that we only have the mappings of call operators rather
87// than lambda classes.
88const FunctionDecl *
89getPrimaryTemplateOfGenericLambda(const FunctionDecl *LambdaCallOperator) {
90 if (!isLambdaCallOperator(LambdaCallOperator))
91 return LambdaCallOperator;
92 while (true) {
93 if (auto *FTD = dyn_cast_if_present<FunctionTemplateDecl>(
94 LambdaCallOperator->getDescribedTemplate());
95 FTD && FTD->getInstantiatedFromMemberTemplate()) {
96 LambdaCallOperator =
97 FTD->getInstantiatedFromMemberTemplate()->getTemplatedDecl();
98 } else if (LambdaCallOperator->getPrimaryTemplate()) {
99 // Cases where the lambda operator is instantiated in
100 // TemplateDeclInstantiator::VisitCXXMethodDecl.
101 LambdaCallOperator =
102 LambdaCallOperator->getPrimaryTemplate()->getTemplatedDecl();
103 } else if (auto *Prev = cast<CXXMethodDecl>(LambdaCallOperator)
104 ->getInstantiatedFromMemberFunction())
105 LambdaCallOperator = Prev;
106 else
107 break;
108 }
109 return LambdaCallOperator;
110}
111
112struct EnclosingTypeAliasTemplateDetails {
114 TypeAliasTemplateDecl *PrimaryTypeAliasDecl = nullptr;
115 ArrayRef<TemplateArgument> AssociatedTemplateArguments;
116
117 explicit operator bool() noexcept { return Template; }
118};
119
120// Find the enclosing type alias template Decl from CodeSynthesisContexts, as
121// well as its primary template and instantiating template arguments.
122EnclosingTypeAliasTemplateDetails
123getEnclosingTypeAliasTemplateDecl(Sema &SemaRef) {
124 for (auto &CSC : llvm::reverse(SemaRef.CodeSynthesisContexts)) {
126 TypeAliasTemplateInstantiation)
127 continue;
128 EnclosingTypeAliasTemplateDetails Result;
129 auto *TATD = cast<TypeAliasTemplateDecl>(CSC.Entity),
130 *Next = TATD->getInstantiatedFromMemberTemplate();
131 Result = {
132 /*Template=*/TATD,
133 /*PrimaryTypeAliasDecl=*/TATD,
134 /*AssociatedTemplateArguments=*/CSC.template_arguments(),
135 };
136 while (Next) {
137 Result.PrimaryTypeAliasDecl = Next;
138 Next = Next->getInstantiatedFromMemberTemplate();
139 }
140 return Result;
141 }
142 return {};
143}
144
145// Check if we are currently inside of a lambda expression that is
146// surrounded by a using alias declaration. e.g.
147// template <class> using type = decltype([](auto) { ^ }());
148// We have to do so since a TypeAliasTemplateDecl (or a TypeAliasDecl) is never
149// a DeclContext, nor does it have an associated specialization Decl from which
150// we could collect these template arguments.
151bool isLambdaEnclosedByTypeAliasDecl(
152 const FunctionDecl *LambdaCallOperator,
153 const TypeAliasTemplateDecl *PrimaryTypeAliasDecl) {
154 struct Visitor : DynamicRecursiveASTVisitor {
155 Visitor(const FunctionDecl *CallOperator) : CallOperator(CallOperator) {}
156 bool VisitLambdaExpr(LambdaExpr *LE) override {
157 // Return true to bail out of the traversal, implying the Decl contains
158 // the lambda.
159 return getPrimaryTemplateOfGenericLambda(LE->getCallOperator()) !=
160 CallOperator;
161 }
162 const FunctionDecl *CallOperator;
163 };
164
165 QualType Underlying =
166 PrimaryTypeAliasDecl->getTemplatedDecl()->getUnderlyingType();
167
168 return !Visitor(getPrimaryTemplateOfGenericLambda(LambdaCallOperator))
169 .TraverseType(Underlying);
170}
171
172// Add template arguments from a variable template instantiation.
173Response
174HandleVarTemplateSpec(const VarTemplateSpecializationDecl *VarTemplSpec,
176 bool SkipForSpecialization) {
177 // For a class-scope explicit specialization, there are no template arguments
178 // at this level, but there may be enclosing template arguments.
179 if (VarTemplSpec->isClassScopeExplicitSpecialization())
180 return Response::DontClearRelativeToPrimaryNextDecl(VarTemplSpec);
181
182 // We're done when we hit an explicit specialization.
183 if (VarTemplSpec->getSpecializationKind() == TSK_ExplicitSpecialization &&
185 return Response::Done();
186
187 // If this variable template specialization was instantiated from a
188 // specialized member that is a variable template, we're done.
189 assert(VarTemplSpec->getSpecializedTemplate() && "No variable template?");
190 llvm::PointerUnion<VarTemplateDecl *, VarTemplatePartialSpecializationDecl *>
191 Specialized = VarTemplSpec->getSpecializedTemplateOrPartial();
193 dyn_cast<VarTemplatePartialSpecializationDecl *>(Specialized)) {
194 if (!SkipForSpecialization)
195 Result.addOuterTemplateArguments(
196 Partial, VarTemplSpec->getTemplateInstantiationArgs().asArray(),
197 /*Final=*/false);
198 if (Partial->isMemberSpecialization())
199 return Response::Done();
200 } else {
201 VarTemplateDecl *Tmpl = cast<VarTemplateDecl *>(Specialized);
202 if (!SkipForSpecialization)
203 Result.addOuterTemplateArguments(
204 Tmpl, VarTemplSpec->getTemplateInstantiationArgs().asArray(),
205 /*Final=*/false);
206 if (Tmpl->isMemberSpecialization())
207 return Response::Done();
208 }
209 return Response::DontClearRelativeToPrimaryNextDecl(VarTemplSpec);
210}
211
212// If we have a template template parameter with translation unit context,
213// then we're performing substitution into a default template argument of
214// this template template parameter before we've constructed the template
215// that will own this template template parameter. In this case, we
216// use empty template parameter lists for all of the outer templates
217// to avoid performing any substitutions.
218Response
219HandleDefaultTempArgIntoTempTempParam(const TemplateTemplateParmDecl *TTP,
221 for (unsigned I = 0, N = TTP->getDepth() + 1; I != N; ++I)
222 Result.addOuterTemplateArguments(std::nullopt);
223 return Response::Done();
224}
225
226Response HandlePartialClassTemplateSpec(
227 const ClassTemplatePartialSpecializationDecl *PartialClassTemplSpec,
228 MultiLevelTemplateArgumentList &Result, bool SkipForSpecialization) {
229 if (!SkipForSpecialization)
230 Result.addOuterRetainedLevels(PartialClassTemplSpec->getTemplateDepth());
231 return Response::Done();
232}
233
234// Add template arguments from a class template instantiation.
235Response
236HandleClassTemplateSpec(const ClassTemplateSpecializationDecl *ClassTemplSpec,
238 bool SkipForSpecialization) {
239 if (!ClassTemplSpec->isClassScopeExplicitSpecialization()) {
240 // We're done when we hit an explicit specialization.
241 if (ClassTemplSpec->getSpecializationKind() == TSK_ExplicitSpecialization &&
243 return Response::Done();
244
245 if (!SkipForSpecialization)
246 Result.addOuterTemplateArguments(
247 const_cast<ClassTemplateSpecializationDecl *>(ClassTemplSpec),
248 ClassTemplSpec->getTemplateInstantiationArgs().asArray(),
249 /*Final=*/false);
250
251 // If this class template specialization was instantiated from a
252 // specialized member that is a class template, we're done.
253 assert(ClassTemplSpec->getSpecializedTemplate() && "No class template?");
254 if (ClassTemplSpec->getSpecializedTemplate()->isMemberSpecialization())
255 return Response::Done();
256
257 // If this was instantiated from a partial template specialization, we need
258 // to get the next level of declaration context from the partial
259 // specialization, as the ClassTemplateSpecializationDecl's
260 // DeclContext/LexicalDeclContext will be for the primary template.
261 if (auto *InstFromPartialTempl =
262 ClassTemplSpec->getSpecializedTemplateOrPartial()
264 return Response::ChangeDecl(
265 InstFromPartialTempl->getLexicalDeclContext());
266 }
267 return Response::UseNextDecl(ClassTemplSpec);
268}
269
270Response HandleFunction(Sema &SemaRef, const FunctionDecl *Function,
272 const FunctionDecl *Pattern, bool RelativeToPrimary,
273 bool ForConstraintInstantiation,
274 bool ForDefaultArgumentSubstitution) {
275 // Add template arguments from a function template specialization.
276 if (!RelativeToPrimary &&
277 Function->getTemplateSpecializationKindForInstantiation() ==
279 return Response::Done();
280
281 if (!RelativeToPrimary &&
282 Function->getTemplateSpecializationKind() == TSK_ExplicitSpecialization) {
283 // This is an implicit instantiation of an explicit specialization. We
284 // don't get any template arguments from this function but might get
285 // some from an enclosing template.
286 return Response::UseNextDecl(Function);
287 } else if (const TemplateArgumentList *TemplateArgs =
288 Function->getTemplateSpecializationArgs()) {
289 // Add the template arguments for this specialization.
290 Result.addOuterTemplateArguments(const_cast<FunctionDecl *>(Function),
291 TemplateArgs->asArray(),
292 /*Final=*/false);
293
294 if (RelativeToPrimary &&
295 (Function->getTemplateSpecializationKind() ==
297 (Function->getFriendObjectKind() &&
298 !Function->getPrimaryTemplate()->getFriendObjectKind())))
299 return Response::UseNextDecl(Function);
300
301 // If this function was instantiated from a specialized member that is
302 // a function template, we're done.
303 assert(Function->getPrimaryTemplate() && "No function template?");
304 if (!ForDefaultArgumentSubstitution &&
305 Function->getPrimaryTemplate()->isMemberSpecialization())
306 return Response::Done();
307
308 // If this function is a generic lambda specialization, we are done.
309 if (!ForConstraintInstantiation &&
311 return Response::Done();
312
313 } else if (auto *Template = Function->getDescribedFunctionTemplate()) {
314 assert(
315 (ForConstraintInstantiation || Result.getNumSubstitutedLevels() == 0) &&
316 "Outer template not instantiated?");
317 if (ForConstraintInstantiation) {
318 for (auto &Inst : llvm::reverse(SemaRef.CodeSynthesisContexts)) {
320 Inst.Entity == Template) {
321 // After CWG2369, the outer templates are not instantiated when
322 // checking its associated constraints. So add them back through the
323 // synthesis context; this is useful for e.g. nested constraints
324 // involving lambdas.
325 Result.addOuterTemplateArguments(Template, Inst.template_arguments(),
326 /*Final=*/false);
327 break;
328 }
329 }
330 }
331 }
332 // If this is a friend or local declaration and it declares an entity at
333 // namespace scope, take arguments from its lexical parent
334 // instead of its semantic parent, unless of course the pattern we're
335 // instantiating actually comes from the file's context!
336 if ((Function->getFriendObjectKind() || Function->isLocalExternDecl()) &&
337 Function->getNonTransparentDeclContext()->isFileContext() &&
338 (!Pattern || !Pattern->getLexicalDeclContext()->isFileContext())) {
339 return Response::ChangeDecl(Function->getLexicalDeclContext());
340 }
341
342 if (ForConstraintInstantiation && Function->getFriendObjectKind())
343 return Response::ChangeDecl(Function->getLexicalDeclContext());
344 return Response::UseNextDecl(Function);
345}
346
347Response HandleFunctionTemplateDecl(Sema &SemaRef,
348 const FunctionTemplateDecl *FTD,
351 Result.addOuterTemplateArguments(
352 const_cast<FunctionTemplateDecl *>(FTD),
353 const_cast<FunctionTemplateDecl *>(FTD)->getInjectedTemplateArgs(
354 SemaRef.Context),
355 /*Final=*/false);
356
358
359 for (const Type *Ty = NNS.getKind() == NestedNameSpecifier::Kind::Type
360 ? NNS.getAsType()
361 : nullptr,
362 *NextTy = nullptr;
364 Ty = std::exchange(NextTy, nullptr)) {
365 if (NestedNameSpecifier P = Ty->getPrefix();
367 NextTy = P.getAsType();
368 const auto *TSTy = dyn_cast<TemplateSpecializationType>(Ty);
369 if (!TSTy)
370 continue;
371
372 ArrayRef<TemplateArgument> Arguments = TSTy->template_arguments();
373 // Prefer template arguments from the injected-class-type if possible.
374 // For example,
375 // ```cpp
376 // template <class... Pack> struct S {
377 // template <class T> void foo();
378 // };
379 // template <class... Pack> template <class T>
380 // ^^^^^^^^^^^^^ InjectedTemplateArgs
381 // They're of kind TemplateArgument::Pack, not of
382 // TemplateArgument::Type.
383 // void S<Pack...>::foo() {}
384 // ^^^^^^^
385 // TSTy->template_arguments() (which are of PackExpansionType)
386 // ```
387 // This meets the contract in
388 // TreeTransform::TryExpandParameterPacks that the template arguments
389 // for unexpanded parameters should be of a Pack kind.
390 if (TSTy->isCurrentInstantiation()) {
391 auto *RD = TSTy->getCanonicalTypeInternal()->getAsCXXRecordDecl();
392 if (ClassTemplateDecl *CTD = RD->getDescribedClassTemplate())
393 Arguments = CTD->getInjectedTemplateArgs(SemaRef.Context);
394 else if (auto *Specialization =
395 dyn_cast<ClassTemplateSpecializationDecl>(RD))
396 Arguments = Specialization->getTemplateInstantiationArgs().asArray();
397 }
398 Result.addOuterTemplateArguments(
399 TSTy->getTemplateName().getAsTemplateDecl(), Arguments,
400 /*Final=*/false);
401 }
402 }
403
404 return Response::ChangeDecl(FTD->getLexicalDeclContext());
405}
406
407Response HandleRecordDecl(Sema &SemaRef, const CXXRecordDecl *Rec,
409 ASTContext &Context,
410 bool ForConstraintInstantiation) {
411 if (ClassTemplateDecl *ClassTemplate = Rec->getDescribedClassTemplate()) {
412 assert(
413 (ForConstraintInstantiation || Result.getNumSubstitutedLevels() == 0) &&
414 "Outer template not instantiated?");
415 if (ClassTemplate->isMemberSpecialization())
416 return Response::Done();
417 if (ForConstraintInstantiation)
418 Result.addOuterTemplateArguments(
419 const_cast<CXXRecordDecl *>(Rec),
420 ClassTemplate->getInjectedTemplateArgs(SemaRef.Context),
421 /*Final=*/false);
422 }
423
424 if (const MemberSpecializationInfo *MSInfo =
426 if (MSInfo->getTemplateSpecializationKind() == TSK_ExplicitSpecialization)
427 return Response::Done();
428
429 bool IsFriend = Rec->getFriendObjectKind() ||
432 if (ForConstraintInstantiation && IsFriend &&
434 return Response::ChangeDecl(Rec->getLexicalDeclContext());
435 }
436
437 // This is to make sure we pick up the VarTemplateSpecializationDecl or the
438 // TypeAliasTemplateDecl that this lambda is defined inside of.
439 if (Rec->isLambda()) {
440 if (const Decl *LCD = Rec->getLambdaContextDecl())
441 return Response::ChangeDecl(LCD);
442 // Retrieve the template arguments for a using alias declaration.
443 // This is necessary for constraint checking, since we always keep
444 // constraints relative to the primary template.
445 if (auto TypeAlias = getEnclosingTypeAliasTemplateDecl(SemaRef);
446 ForConstraintInstantiation && TypeAlias) {
447 if (isLambdaEnclosedByTypeAliasDecl(Rec->getLambdaCallOperator(),
448 TypeAlias.PrimaryTypeAliasDecl)) {
449 Result.addOuterTemplateArguments(TypeAlias.Template,
450 TypeAlias.AssociatedTemplateArguments,
451 /*Final=*/false);
452 // Visit the parent of the current type alias declaration rather than
453 // the lambda thereof.
454 // E.g., in the following example:
455 // struct S {
456 // template <class> using T = decltype([]<Concept> {} ());
457 // };
458 // void foo() {
459 // S::T var;
460 // }
461 // The instantiated lambda expression (which we're visiting at 'var')
462 // has a function DeclContext 'foo' rather than the Record DeclContext
463 // S. This seems to be an oversight to me that we may want to set a
464 // Sema Context from the CXXScopeSpec before substituting into T.
465 return Response::ChangeDecl(TypeAlias.Template->getDeclContext());
466 }
467 }
468 }
469
470 return Response::UseNextDecl(Rec);
471}
472
473Response HandleImplicitConceptSpecializationDecl(
476 Result.addOuterTemplateArguments(
477 const_cast<ImplicitConceptSpecializationDecl *>(CSD),
479 /*Final=*/false);
480 return Response::UseNextDecl(CSD);
481}
482
483Response HandleGenericDeclContext(const Decl *CurDecl) {
484 return Response::UseNextDecl(CurDecl);
485}
486} // namespace TemplateInstArgsHelpers
487} // namespace
488
490 const NamedDecl *ND, const DeclContext *DC, bool Final,
491 std::optional<ArrayRef<TemplateArgument>> Innermost, bool RelativeToPrimary,
492 const FunctionDecl *Pattern, bool ForConstraintInstantiation,
493 bool SkipForSpecialization, bool ForDefaultArgumentSubstitution) {
494 assert((ND || DC) && "Can't find arguments for a decl if one isn't provided");
495 // Accumulate the set of template argument lists in this structure.
497
498 using namespace TemplateInstArgsHelpers;
499 const Decl *CurDecl = ND;
500
501 if (Innermost) {
502 Result.addOuterTemplateArguments(const_cast<NamedDecl *>(ND), *Innermost,
503 Final);
504 // Populate placeholder template arguments for TemplateTemplateParmDecls.
505 // This is essential for the case e.g.
506 //
507 // template <class> concept Concept = false;
508 // template <template <Concept C> class T> void foo(T<int>)
509 //
510 // where parameter C has a depth of 1 but the substituting argument `int`
511 // has a depth of 0.
512 if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(CurDecl))
513 HandleDefaultTempArgIntoTempTempParam(TTP, Result);
514 CurDecl = DC ? Decl::castFromDeclContext(DC)
515 : Response::UseNextDecl(CurDecl).NextDecl;
516 } else if (!CurDecl)
517 CurDecl = Decl::castFromDeclContext(DC);
518
519 while (!CurDecl->isFileContextDecl()) {
520 Response R;
521 if (const auto *VarTemplSpec =
522 dyn_cast<VarTemplateSpecializationDecl>(CurDecl)) {
523 R = HandleVarTemplateSpec(VarTemplSpec, Result, SkipForSpecialization);
524 } else if (const auto *PartialClassTemplSpec =
525 dyn_cast<ClassTemplatePartialSpecializationDecl>(CurDecl)) {
526 R = HandlePartialClassTemplateSpec(PartialClassTemplSpec, Result,
527 SkipForSpecialization);
528 } else if (const auto *ClassTemplSpec =
529 dyn_cast<ClassTemplateSpecializationDecl>(CurDecl)) {
530 R = HandleClassTemplateSpec(ClassTemplSpec, Result,
531 SkipForSpecialization);
532 } else if (const auto *Function = dyn_cast<FunctionDecl>(CurDecl)) {
533 R = HandleFunction(*this, Function, Result, Pattern, RelativeToPrimary,
534 ForConstraintInstantiation,
535 ForDefaultArgumentSubstitution);
536 } else if (const auto *Rec = dyn_cast<CXXRecordDecl>(CurDecl)) {
537 R = HandleRecordDecl(*this, Rec, Result, Context,
538 ForConstraintInstantiation);
539 } else if (const auto *CSD =
540 dyn_cast<ImplicitConceptSpecializationDecl>(CurDecl)) {
541 R = HandleImplicitConceptSpecializationDecl(CSD, Result);
542 } else if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(CurDecl)) {
543 R = HandleFunctionTemplateDecl(*this, FTD, Result);
544 } else if (const auto *CTD = dyn_cast<ClassTemplateDecl>(CurDecl)) {
545 R = Response::ChangeDecl(CTD->getLexicalDeclContext());
546 } else if (!isa<DeclContext>(CurDecl)) {
547 R = Response::DontClearRelativeToPrimaryNextDecl(CurDecl);
548 if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(CurDecl)) {
549 R = HandleDefaultTempArgIntoTempTempParam(TTP, Result);
550 }
551 } else {
552 R = HandleGenericDeclContext(CurDecl);
553 }
554
555 if (R.IsDone)
556 return Result;
557 if (R.ClearRelativeToPrimary)
558 RelativeToPrimary = false;
559 assert(R.NextDecl);
560 CurDecl = R.NextDecl;
561 }
562 return Result;
563}
564
605
608 SourceLocation PointOfInstantiation, SourceRange InstantiationRange,
609 Decl *Entity, NamedDecl *Template, ArrayRef<TemplateArgument> TemplateArgs)
610 : SemaRef(SemaRef) {
611 // Don't allow further instantiation if a fatal error and an uncompilable
612 // error have occurred. Any diagnostics we might have raised will not be
613 // visible, and we do not need to construct a correct AST.
614 if (SemaRef.Diags.hasFatalErrorOccurred() &&
615 SemaRef.hasUncompilableErrorOccurred()) {
616 Invalid = true;
617 return;
618 }
619
621 Inst.Kind = Kind;
622 Inst.PointOfInstantiation = PointOfInstantiation;
623 Inst.Entity = Entity;
624 Inst.Template = Template;
625 Inst.TemplateArgs = TemplateArgs.data();
626 Inst.NumTemplateArgs = TemplateArgs.size();
627 Inst.InstantiationRange = InstantiationRange;
628 Inst.InConstraintSubstitution =
630 Inst.InParameterMappingSubstitution =
632 if (!SemaRef.CodeSynthesisContexts.empty()) {
633 Inst.InConstraintSubstitution |=
634 SemaRef.CodeSynthesisContexts.back().InConstraintSubstitution;
635 Inst.InParameterMappingSubstitution |=
636 SemaRef.CodeSynthesisContexts.back().InParameterMappingSubstitution;
637 }
638
639 Invalid = SemaRef.pushCodeSynthesisContext(Inst);
640 if (!Invalid)
641 atTemplateBegin(SemaRef.TemplateInstCallbacks, SemaRef, Inst);
642}
643
645 Sema &SemaRef, SourceLocation PointOfInstantiation, Decl *Entity,
646 SourceRange InstantiationRange)
647 : InstantiatingTemplate(SemaRef,
648 CodeSynthesisContext::TemplateInstantiation,
649 PointOfInstantiation, InstantiationRange, Entity) {}
650
652 Sema &SemaRef, SourceLocation PointOfInstantiation, FunctionDecl *Entity,
653 ExceptionSpecification, SourceRange InstantiationRange)
655 SemaRef, CodeSynthesisContext::ExceptionSpecInstantiation,
656 PointOfInstantiation, InstantiationRange, Entity) {}
657
659 Sema &SemaRef, SourceLocation PointOfInstantiation, TemplateParameter Param,
661 SourceRange InstantiationRange)
663 SemaRef,
664 CodeSynthesisContext::DefaultTemplateArgumentInstantiation,
665 PointOfInstantiation, InstantiationRange, getAsNamedDecl(Param),
666 Template, TemplateArgs) {}
667
680
682 Sema &SemaRef, SourceLocation PointOfInstantiation, TemplateDecl *Template,
683 ArrayRef<TemplateArgument> TemplateArgs, SourceRange InstantiationRange)
685 SemaRef, CodeSynthesisContext::DeducedTemplateArgumentSubstitution,
686 PointOfInstantiation, InstantiationRange, Template, nullptr,
687 TemplateArgs) {}
688
690 Sema &SemaRef, SourceLocation PointOfInstantiation,
692 ArrayRef<TemplateArgument> TemplateArgs, SourceRange InstantiationRange)
694 SemaRef, CodeSynthesisContext::DeducedTemplateArgumentSubstitution,
695 PointOfInstantiation, InstantiationRange, PartialSpec, nullptr,
696 TemplateArgs) {}
697
699 Sema &SemaRef, SourceLocation PointOfInstantiation,
701 ArrayRef<TemplateArgument> TemplateArgs, SourceRange InstantiationRange)
703 SemaRef, CodeSynthesisContext::DeducedTemplateArgumentSubstitution,
704 PointOfInstantiation, InstantiationRange, PartialSpec, nullptr,
705 TemplateArgs) {}
706
708 Sema &SemaRef, SourceLocation PointOfInstantiation, ParmVarDecl *Param,
709 ArrayRef<TemplateArgument> TemplateArgs, SourceRange InstantiationRange)
711 SemaRef,
712 CodeSynthesisContext::DefaultFunctionArgumentInstantiation,
713 PointOfInstantiation, InstantiationRange, Param, nullptr,
714 TemplateArgs) {}
715
717 Sema &SemaRef, SourceLocation PointOfInstantiation, NamedDecl *Template,
719 SourceRange InstantiationRange)
721 SemaRef,
722 CodeSynthesisContext::PriorTemplateArgumentSubstitution,
723 PointOfInstantiation, InstantiationRange, Param, Template,
724 TemplateArgs) {}
725
727 Sema &SemaRef, SourceLocation PointOfInstantiation, NamedDecl *Template,
729 SourceRange InstantiationRange)
731 SemaRef,
732 CodeSynthesisContext::PriorTemplateArgumentSubstitution,
733 PointOfInstantiation, InstantiationRange, Param, Template,
734 TemplateArgs) {}
735
737 Sema &SemaRef, SourceLocation PointOfInstantiation,
739 SourceRange InstantiationRange)
741 SemaRef, CodeSynthesisContext::TypeAliasTemplateInstantiation,
742 PointOfInstantiation, InstantiationRange, /*Entity=*/Entity,
743 /*Template=*/nullptr, TemplateArgs) {}
744
746 Sema &SemaRef, SourceLocation PointOfInstantiation, TemplateDecl *Template,
747 NamedDecl *Param, ArrayRef<TemplateArgument> TemplateArgs,
748 SourceRange InstantiationRange)
750 SemaRef, CodeSynthesisContext::DefaultTemplateArgumentChecking,
751 PointOfInstantiation, InstantiationRange, Param, Template,
752 TemplateArgs) {}
753
755 Sema &SemaRef, SourceLocation PointOfInstantiation,
756 concepts::Requirement *Req, SourceRange InstantiationRange)
758 SemaRef, CodeSynthesisContext::RequirementInstantiation,
759 PointOfInstantiation, InstantiationRange, /*Entity=*/nullptr,
760 /*Template=*/nullptr, /*TemplateArgs=*/{}) {}
761
763 Sema &SemaRef, SourceLocation PointOfInstantiation,
765 SourceRange InstantiationRange)
767 SemaRef, CodeSynthesisContext::NestedRequirementConstraintsCheck,
768 PointOfInstantiation, InstantiationRange, /*Entity=*/nullptr,
769 /*Template=*/nullptr, /*TemplateArgs=*/{}) {}
770
772 Sema &SemaRef, SourceLocation PointOfInstantiation, const RequiresExpr *RE,
773 SourceRange InstantiationRange)
775 SemaRef, CodeSynthesisContext::RequirementParameterInstantiation,
776 PointOfInstantiation, InstantiationRange, /*Entity=*/nullptr,
777 /*Template=*/nullptr, /*TemplateArgs=*/{}) {}
778
780 Sema &SemaRef, SourceLocation PointOfInstantiation,
782 ArrayRef<TemplateArgument> TemplateArgs, SourceRange InstantiationRange)
785 PointOfInstantiation, InstantiationRange, Template, nullptr,
786 TemplateArgs) {}
787
789 Sema &SemaRef, SourceLocation PointOfInstantiation, ConstraintSubstitution,
790 NamedDecl *Template, SourceRange InstantiationRange)
793 PointOfInstantiation, InstantiationRange, Template, nullptr, {}) {}
794
796 Sema &SemaRef, SourceLocation PointOfInstantiation,
798 SourceRange InstantiationRange)
801 PointOfInstantiation, InstantiationRange, Template) {}
802
804 Sema &SemaRef, SourceLocation PointOfInstantiation,
806 SourceRange InstantiationRange)
809 PointOfInstantiation, InstantiationRange, Template) {}
810
812 Sema &SemaRef, SourceLocation PointOfInstantiation, TemplateDecl *Entity,
813 BuildingDeductionGuidesTag, SourceRange InstantiationRange)
815 SemaRef, CodeSynthesisContext::BuildingDeductionGuides,
816 PointOfInstantiation, InstantiationRange, Entity) {}
817
819 Sema &SemaRef, SourceLocation ArgLoc, PartialOrderingTTP,
820 TemplateDecl *PArg, SourceRange InstantiationRange)
822 ArgLoc, InstantiationRange, PArg) {}
823
825 if (!Ctx.isInstantiationRecord()) {
827 } else {
828 assert(SemaRef.NonInstantiationEntries <=
829 SemaRef.CodeSynthesisContexts.size());
830 if ((SemaRef.CodeSynthesisContexts.size() -
831 SemaRef.NonInstantiationEntries) >
832 SemaRef.getLangOpts().InstantiationDepth) {
834 diag::err_template_recursion_depth_exceeded)
835 << SemaRef.getLangOpts().InstantiationDepth << Ctx.InstantiationRange;
837 diag::note_template_recursion_depth)
838 << SemaRef.getLangOpts().InstantiationDepth;
839 return true;
840 }
841 }
842
843 CodeSynthesisContexts.push_back(Ctx);
844
845 // Check to see if we're low on stack space. We can't do anything about this
846 // from here, but we can at least warn the user.
847 StackHandler.warnOnStackNearlyExhausted(Ctx.PointOfInstantiation);
848 return false;
849}
850
852 auto &Active = CodeSynthesisContexts.back();
853 if (!Active.isInstantiationRecord()) {
854 assert(NonInstantiationEntries > 0);
856 }
857
858 // Name lookup no longer looks in this template's defining module.
859 assert(CodeSynthesisContexts.size() >=
861 "forgot to remove a lookup module for a template instantiation");
862 if (CodeSynthesisContexts.size() ==
865 LookupModulesCache.erase(M);
867 }
868
869 // If we've left the code synthesis context for the current context stack,
870 // stop remembering that we've emitted that stack.
871 if (CodeSynthesisContexts.size() ==
874
875 CodeSynthesisContexts.pop_back();
876}
877
879 if (!Invalid) {
880 atTemplateEnd(SemaRef.TemplateInstCallbacks, SemaRef,
881 SemaRef.CodeSynthesisContexts.back());
882
883 SemaRef.popCodeSynthesisContext();
884 Invalid = true;
885 }
886}
887
888static std::string convertCallArgsToString(Sema &S,
890 std::string Result;
891 llvm::raw_string_ostream OS(Result);
892 llvm::ListSeparator Comma;
893 for (const Expr *Arg : Args) {
894 OS << Comma;
895 Arg->IgnoreParens()->printPretty(OS, nullptr,
897 }
898 return Result;
899}
900
902 // Determine which template instantiations to skip, if any.
903 unsigned SkipStart = CodeSynthesisContexts.size(), SkipEnd = SkipStart;
904 unsigned Limit = Diags.getTemplateBacktraceLimit();
905 if (Limit && Limit < CodeSynthesisContexts.size()) {
906 SkipStart = Limit / 2 + Limit % 2;
907 SkipEnd = CodeSynthesisContexts.size() - Limit / 2;
908 }
909
910 // FIXME: In all of these cases, we need to show the template arguments
911 unsigned InstantiationIdx = 0;
913 Active = CodeSynthesisContexts.rbegin(),
914 ActiveEnd = CodeSynthesisContexts.rend();
915 Active != ActiveEnd;
916 ++Active, ++InstantiationIdx) {
917 // Skip this instantiation?
918 if (InstantiationIdx >= SkipStart && InstantiationIdx < SkipEnd) {
919 if (InstantiationIdx == SkipStart) {
920 // Note that we're skipping instantiations.
921 DiagFunc(Active->PointOfInstantiation,
922 PDiag(diag::note_instantiation_contexts_suppressed)
923 << unsigned(CodeSynthesisContexts.size() - Limit));
924 }
925 continue;
926 }
927
928 switch (Active->Kind) {
930 Decl *D = Active->Entity;
931 if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(D)) {
932 unsigned DiagID = diag::note_template_member_class_here;
934 DiagID = diag::note_template_class_instantiation_here;
935 DiagFunc(Active->PointOfInstantiation,
936 PDiag(DiagID) << Record << Active->InstantiationRange);
937 } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) {
938 unsigned DiagID;
939 if (Function->getPrimaryTemplate())
940 DiagID = diag::note_function_template_spec_here;
941 else
942 DiagID = diag::note_template_member_function_here;
943 DiagFunc(Active->PointOfInstantiation,
944 PDiag(DiagID) << Function << Active->InstantiationRange);
945 } else if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
946 DiagFunc(Active->PointOfInstantiation,
947 PDiag(VD->isStaticDataMember()
948 ? diag::note_template_static_data_member_def_here
949 : diag::note_template_variable_def_here)
950 << VD << Active->InstantiationRange);
951 } else if (EnumDecl *ED = dyn_cast<EnumDecl>(D)) {
952 DiagFunc(Active->PointOfInstantiation,
953 PDiag(diag::note_template_enum_def_here)
954 << ED << Active->InstantiationRange);
955 } else if (FieldDecl *FD = dyn_cast<FieldDecl>(D)) {
956 DiagFunc(Active->PointOfInstantiation,
957 PDiag(diag::note_template_nsdmi_here)
958 << FD << Active->InstantiationRange);
959 } else if (ClassTemplateDecl *CTD = dyn_cast<ClassTemplateDecl>(D)) {
960 DiagFunc(Active->PointOfInstantiation,
961 PDiag(diag::note_template_class_instantiation_here)
962 << CTD << Active->InstantiationRange);
963 }
964 break;
965 }
966
968 TemplateDecl *Template = cast<TemplateDecl>(Active->Template);
969 SmallString<128> TemplateArgsStr;
970 llvm::raw_svector_ostream OS(TemplateArgsStr);
971 Template->printName(OS, getPrintingPolicy());
972 printTemplateArgumentList(OS, Active->template_arguments(),
974 DiagFunc(Active->PointOfInstantiation,
975 PDiag(diag::note_default_arg_instantiation_here)
976 << OS.str() << Active->InstantiationRange);
977 break;
978 }
979
981 FunctionTemplateDecl *FnTmpl = cast<FunctionTemplateDecl>(Active->Entity);
982 DiagFunc(Active->PointOfInstantiation,
983 PDiag(diag::note_explicit_template_arg_substitution_here)
984 << FnTmpl
986 FnTmpl->getTemplateParameters(), Active->TemplateArgs,
987 Active->NumTemplateArgs)
988 << Active->InstantiationRange);
989 break;
990 }
991
993 if (FunctionTemplateDecl *FnTmpl =
994 dyn_cast<FunctionTemplateDecl>(Active->Entity)) {
995 DiagFunc(
996 Active->PointOfInstantiation,
997 PDiag(diag::note_function_template_deduction_instantiation_here)
998 << FnTmpl
1000 FnTmpl->getTemplateParameters(), Active->TemplateArgs,
1001 Active->NumTemplateArgs)
1002 << Active->InstantiationRange);
1003 } else {
1004 bool IsVar = isa<VarTemplateDecl>(Active->Entity) ||
1005 isa<VarTemplateSpecializationDecl>(Active->Entity);
1006 bool IsTemplate = false;
1007 TemplateParameterList *Params;
1008 if (auto *D = dyn_cast<TemplateDecl>(Active->Entity)) {
1009 IsTemplate = true;
1010 Params = D->getTemplateParameters();
1011 } else if (auto *D = dyn_cast<ClassTemplatePartialSpecializationDecl>(
1012 Active->Entity)) {
1013 Params = D->getTemplateParameters();
1014 } else if (auto *D = dyn_cast<VarTemplatePartialSpecializationDecl>(
1015 Active->Entity)) {
1016 Params = D->getTemplateParameters();
1017 } else {
1018 llvm_unreachable("unexpected template kind");
1019 }
1020
1021 DiagFunc(Active->PointOfInstantiation,
1022 PDiag(diag::note_deduced_template_arg_substitution_here)
1023 << IsVar << IsTemplate << cast<NamedDecl>(Active->Entity)
1025 Active->TemplateArgs,
1026 Active->NumTemplateArgs)
1027 << Active->InstantiationRange);
1028 }
1029 break;
1030 }
1031
1033 ParmVarDecl *Param = cast<ParmVarDecl>(Active->Entity);
1034 FunctionDecl *FD = cast<FunctionDecl>(Param->getDeclContext());
1035
1036 SmallString<128> TemplateArgsStr;
1037 llvm::raw_svector_ostream OS(TemplateArgsStr);
1039 printTemplateArgumentList(OS, Active->template_arguments(),
1041 DiagFunc(Active->PointOfInstantiation,
1042 PDiag(diag::note_default_function_arg_instantiation_here)
1043 << OS.str() << Active->InstantiationRange);
1044 break;
1045 }
1046
1048 NamedDecl *Parm = cast<NamedDecl>(Active->Entity);
1049 std::string Name;
1050 if (!Parm->getName().empty())
1051 Name = std::string(" '") + Parm->getName().str() + "'";
1052
1053 TemplateParameterList *TemplateParams = nullptr;
1054 if (TemplateDecl *Template = dyn_cast<TemplateDecl>(Active->Template))
1055 TemplateParams = Template->getTemplateParameters();
1056 else
1057 TemplateParams =
1059 ->getTemplateParameters();
1060 DiagFunc(Active->PointOfInstantiation,
1061 PDiag(diag::note_prior_template_arg_substitution)
1062 << isa<TemplateTemplateParmDecl>(Parm) << Name
1063 << getTemplateArgumentBindingsText(TemplateParams,
1064 Active->TemplateArgs,
1065 Active->NumTemplateArgs)
1066 << Active->InstantiationRange);
1067 break;
1068 }
1069
1071 TemplateParameterList *TemplateParams = nullptr;
1072 if (TemplateDecl *Template = dyn_cast<TemplateDecl>(Active->Template))
1073 TemplateParams = Template->getTemplateParameters();
1074 else
1075 TemplateParams =
1077 ->getTemplateParameters();
1078
1079 DiagFunc(Active->PointOfInstantiation,
1080 PDiag(diag::note_template_default_arg_checking)
1081 << getTemplateArgumentBindingsText(TemplateParams,
1082 Active->TemplateArgs,
1083 Active->NumTemplateArgs)
1084 << Active->InstantiationRange);
1085 break;
1086 }
1087
1089 DiagFunc(Active->PointOfInstantiation,
1090 PDiag(diag::note_evaluating_exception_spec_here)
1091 << cast<FunctionDecl>(Active->Entity));
1092 break;
1093
1095 DiagFunc(Active->PointOfInstantiation,
1096 PDiag(diag::note_template_exception_spec_instantiation_here)
1097 << cast<FunctionDecl>(Active->Entity)
1098 << Active->InstantiationRange);
1099 break;
1100
1102 DiagFunc(Active->PointOfInstantiation,
1103 PDiag(diag::note_template_requirement_instantiation_here)
1104 << Active->InstantiationRange);
1105 break;
1107 DiagFunc(Active->PointOfInstantiation,
1108 PDiag(diag::note_template_requirement_params_instantiation_here)
1109 << Active->InstantiationRange);
1110 break;
1111
1113 DiagFunc(Active->PointOfInstantiation,
1114 PDiag(diag::note_nested_requirement_here)
1115 << Active->InstantiationRange);
1116 break;
1117
1119 DiagFunc(Active->PointOfInstantiation,
1120 PDiag(diag::note_in_declaration_of_implicit_special_member)
1121 << cast<CXXRecordDecl>(Active->Entity)
1122 << Active->SpecialMember);
1123 break;
1124
1126 DiagFunc(
1127 Active->Entity->getLocation(),
1128 PDiag(diag::note_in_declaration_of_implicit_equality_comparison));
1129 break;
1130
1132 // FIXME: For synthesized functions that are not defaulted,
1133 // produce a note.
1134 auto *FD = dyn_cast<FunctionDecl>(Active->Entity);
1135 // Note: if FD is nullptr currently setting DFK to DefaultedFunctionKind()
1136 // will ensure that DFK.isComparison() is false. This is important because
1137 // we will uncondtionally dereference FD in the else if.
1140 if (DFK.isSpecialMember()) {
1141 auto *MD = cast<CXXMethodDecl>(FD);
1142 DiagFunc(Active->PointOfInstantiation,
1143 PDiag(diag::note_member_synthesized_at)
1144 << MD->isExplicitlyDefaulted() << DFK.asSpecialMember()
1145 << Context.getCanonicalTagType(MD->getParent()));
1146 } else if (DFK.isComparison()) {
1147 QualType RecordType = FD->getParamDecl(0)
1148 ->getType()
1149 .getNonReferenceType()
1150 .getUnqualifiedType();
1151 DiagFunc(Active->PointOfInstantiation,
1152 PDiag(diag::note_comparison_synthesized_at)
1153 << (int)DFK.asComparison() << RecordType);
1154 }
1155 break;
1156 }
1157
1159 DiagFunc(Active->Entity->getLocation(),
1160 PDiag(diag::note_rewriting_operator_as_spaceship));
1161 break;
1162
1164 DiagFunc(Active->PointOfInstantiation,
1165 PDiag(diag::note_in_binding_decl_init)
1166 << cast<BindingDecl>(Active->Entity));
1167 break;
1168
1170 DiagFunc(Active->PointOfInstantiation,
1171 PDiag(diag::note_due_to_dllexported_class)
1172 << cast<CXXRecordDecl>(Active->Entity)
1173 << !getLangOpts().CPlusPlus11);
1174 break;
1175
1177 DiagFunc(Active->PointOfInstantiation,
1178 PDiag(diag::note_building_builtin_dump_struct_call)
1180 *this, llvm::ArrayRef(Active->CallArgs,
1181 Active->NumCallArgs)));
1182 break;
1183
1185 break;
1186
1188 DiagFunc(Active->PointOfInstantiation,
1189 PDiag(diag::note_lambda_substitution_here));
1190 break;
1192 unsigned DiagID = 0;
1193 if (!Active->Entity) {
1194 DiagFunc(Active->PointOfInstantiation,
1195 PDiag(diag::note_nested_requirement_here)
1196 << Active->InstantiationRange);
1197 break;
1198 }
1199 if (isa<ConceptDecl>(Active->Entity))
1200 DiagID = diag::note_concept_specialization_here;
1201 else if (isa<TemplateDecl>(Active->Entity))
1202 DiagID = diag::note_checking_constraints_for_template_id_here;
1203 else if (isa<VarTemplatePartialSpecializationDecl>(Active->Entity))
1204 DiagID = diag::note_checking_constraints_for_var_spec_id_here;
1205 else if (isa<ClassTemplatePartialSpecializationDecl>(Active->Entity))
1206 DiagID = diag::note_checking_constraints_for_class_spec_id_here;
1207 else {
1208 assert(isa<FunctionDecl>(Active->Entity));
1209 DiagID = diag::note_checking_constraints_for_function_here;
1210 }
1211 SmallString<128> TemplateArgsStr;
1212 llvm::raw_svector_ostream OS(TemplateArgsStr);
1213 cast<NamedDecl>(Active->Entity)->printName(OS, getPrintingPolicy());
1214 if (!isa<FunctionDecl>(Active->Entity)) {
1215 printTemplateArgumentList(OS, Active->template_arguments(),
1217 }
1218 DiagFunc(Active->PointOfInstantiation,
1219 PDiag(DiagID) << OS.str() << Active->InstantiationRange);
1220 break;
1221 }
1223 DiagFunc(Active->PointOfInstantiation,
1224 PDiag(diag::note_constraint_substitution_here)
1225 << Active->InstantiationRange);
1226 break;
1228 DiagFunc(Active->PointOfInstantiation,
1229 PDiag(diag::note_constraint_normalization_here)
1230 << cast<NamedDecl>(Active->Entity)
1231 << Active->InstantiationRange);
1232 break;
1234 DiagFunc(Active->PointOfInstantiation,
1235 PDiag(diag::note_parameter_mapping_substitution_here)
1236 << Active->InstantiationRange);
1237 break;
1239 DiagFunc(Active->PointOfInstantiation,
1240 PDiag(diag::note_building_deduction_guide_here));
1241 break;
1243 // Workaround for a workaround: don't produce a note if we are merely
1244 // instantiating some other template which contains this alias template.
1245 // This would be redundant either with the error itself, or some other
1246 // context note attached to it.
1247 if (Active->NumTemplateArgs == 0)
1248 break;
1249 DiagFunc(Active->PointOfInstantiation,
1250 PDiag(diag::note_template_type_alias_instantiation_here)
1251 << cast<TypeAliasTemplateDecl>(Active->Entity)
1252 << Active->InstantiationRange);
1253 break;
1255 DiagFunc(Active->PointOfInstantiation,
1256 PDiag(diag::note_template_arg_template_params_mismatch));
1257 if (SourceLocation ParamLoc = Active->Entity->getLocation();
1258 ParamLoc.isValid())
1259 DiagFunc(ParamLoc, PDiag(diag::note_template_prev_declaration)
1260 << /*isTemplateTemplateParam=*/true
1261 << Active->InstantiationRange);
1262 break;
1263 }
1264 }
1265}
1266
1267//===----------------------------------------------------------------------===/
1268// Template Instantiation for Types
1269//===----------------------------------------------------------------------===/
1270namespace {
1271
1272 class TemplateInstantiator : public TreeTransform<TemplateInstantiator> {
1273 const MultiLevelTemplateArgumentList &TemplateArgs;
1274 SourceLocation Loc;
1275 DeclarationName Entity;
1276 // Whether to evaluate the C++20 constraints or simply substitute into them.
1277 bool EvaluateConstraints = true;
1278 // Whether Substitution was Incomplete, that is, we tried to substitute in
1279 // any user provided template arguments which were null.
1280 bool IsIncomplete = false;
1281 // Whether an incomplete substituion should be treated as an error.
1282 bool BailOutOnIncomplete;
1283
1284 // Whether to rebuild pack expansion types; We don't do that when
1285 // rebuilding the parameter mapping of a fold expression appearing
1286 // in a constraint expression.
1287 bool BuildPackExpansionTypes = true;
1288
1289 // CWG2770: Function parameters should be instantiated when they are
1290 // needed by a satisfaction check of an atomic constraint or
1291 // (recursively) by another function parameter.
1292 bool maybeInstantiateFunctionParameterToScope(ParmVarDecl *OldParm);
1293
1294 public:
1295 typedef TreeTransform<TemplateInstantiator> inherited;
1296
1297 TemplateInstantiator(Sema &SemaRef,
1298 const MultiLevelTemplateArgumentList &TemplateArgs,
1299 SourceLocation Loc, DeclarationName Entity,
1300 bool BailOutOnIncomplete = false)
1301 : inherited(SemaRef), TemplateArgs(TemplateArgs), Loc(Loc),
1302 Entity(Entity), BailOutOnIncomplete(BailOutOnIncomplete) {}
1303
1304 void setEvaluateConstraints(bool B) {
1305 EvaluateConstraints = B;
1306 }
1307 bool getEvaluateConstraints() {
1308 return EvaluateConstraints;
1309 }
1310
1311 inline static struct ForParameterMappingSubstitution_t {
1312 } ForParameterMappingSubstitution;
1313
1314 TemplateInstantiator(ForParameterMappingSubstitution_t, Sema &SemaRef,
1315 SourceLocation Loc,
1316 const MultiLevelTemplateArgumentList &TemplateArgs,
1317 bool BuildPackExpansionTypes)
1318 : inherited(SemaRef), TemplateArgs(TemplateArgs), Loc(Loc),
1319 BailOutOnIncomplete(false),
1320 BuildPackExpansionTypes(BuildPackExpansionTypes) {}
1321
1322 /// Determine whether the given type \p T has already been
1323 /// transformed.
1324 ///
1325 /// For the purposes of template instantiation, a type has already been
1326 /// transformed if it is NULL or if it is not dependent.
1327 bool AlreadyTransformed(QualType T);
1328
1329 /// Returns the location of the entity being instantiated, if known.
1330 SourceLocation getBaseLocation() { return Loc; }
1331
1332 /// Returns the name of the entity being instantiated, if any.
1333 DeclarationName getBaseEntity() { return Entity; }
1334
1335 /// Returns whether any substitution so far was incomplete.
1336 bool getIsIncomplete() const { return IsIncomplete; }
1337
1338 /// Sets the "base" location and entity when that
1339 /// information is known based on another transformation.
1340 void setBase(SourceLocation Loc, DeclarationName Entity) {
1341 this->Loc = Loc;
1342 this->Entity = Entity;
1343 }
1344
1345 unsigned TransformTemplateDepth(unsigned Depth) {
1346 return TemplateArgs.getNewDepth(Depth);
1347 }
1348
1349 bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
1350 SourceRange PatternRange,
1351 ArrayRef<UnexpandedParameterPack> Unexpanded,
1352 bool FailOnPackProducingTemplates,
1353 bool &ShouldExpand, bool &RetainExpansion,
1354 UnsignedOrNone &NumExpansions) {
1355 if (SemaRef.CurrentInstantiationScope &&
1356 (SemaRef.inConstraintSubstitution() ||
1357 SemaRef.inParameterMappingSubstitution())) {
1358 for (UnexpandedParameterPack ParmPack : Unexpanded) {
1359 NamedDecl *VD = ParmPack.first.dyn_cast<NamedDecl *>();
1360 if (auto *PVD = dyn_cast_if_present<ParmVarDecl>(VD);
1361 PVD && maybeInstantiateFunctionParameterToScope(PVD))
1362 return true;
1363 }
1364 }
1365
1366 return getSema().CheckParameterPacksForExpansion(
1367 EllipsisLoc, PatternRange, Unexpanded, TemplateArgs,
1368 FailOnPackProducingTemplates, ShouldExpand, RetainExpansion,
1369 NumExpansions);
1370 }
1371
1372 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) {
1374 }
1375
1376 TemplateArgument ForgetPartiallySubstitutedPack() {
1377 TemplateArgument Result;
1378 if (NamedDecl *PartialPack = SemaRef.CurrentInstantiationScope
1380 MultiLevelTemplateArgumentList &TemplateArgs =
1381 const_cast<MultiLevelTemplateArgumentList &>(this->TemplateArgs);
1382 unsigned Depth, Index;
1383 std::tie(Depth, Index) = getDepthAndIndex(PartialPack);
1384 if (TemplateArgs.hasTemplateArgument(Depth, Index)) {
1385 Result = TemplateArgs(Depth, Index);
1386 TemplateArgs.setArgument(Depth, Index, TemplateArgument());
1387 } else {
1388 IsIncomplete = true;
1389 if (BailOutOnIncomplete)
1390 return TemplateArgument();
1391 }
1392 }
1393
1394 return Result;
1395 }
1396
1397 void RememberPartiallySubstitutedPack(TemplateArgument Arg) {
1398 if (Arg.isNull())
1399 return;
1400
1401 if (NamedDecl *PartialPack = SemaRef.CurrentInstantiationScope
1403 MultiLevelTemplateArgumentList &TemplateArgs =
1404 const_cast<MultiLevelTemplateArgumentList &>(this->TemplateArgs);
1405 unsigned Depth, Index;
1406 std::tie(Depth, Index) = getDepthAndIndex(PartialPack);
1407 TemplateArgs.setArgument(Depth, Index, Arg);
1408 }
1409 }
1410
1411 MultiLevelTemplateArgumentList ForgetSubstitution() {
1412 MultiLevelTemplateArgumentList New;
1413 New.addOuterRetainedLevels(this->TemplateArgs.getNumLevels());
1414
1415 MultiLevelTemplateArgumentList Old =
1416 const_cast<MultiLevelTemplateArgumentList &>(this->TemplateArgs);
1417 const_cast<MultiLevelTemplateArgumentList &>(this->TemplateArgs) =
1418 std::move(New);
1419 return Old;
1420 }
1421
1422 void RememberSubstitution(MultiLevelTemplateArgumentList Old) {
1423 const_cast<MultiLevelTemplateArgumentList &>(this->TemplateArgs) = Old;
1424 }
1425
1426 TemplateArgument
1427 getTemplateArgumentPackPatternForRewrite(const TemplateArgument &TA) {
1428 if (TA.getKind() != TemplateArgument::Pack)
1429 return TA;
1430 if (SemaRef.ArgPackSubstIndex)
1431 return SemaRef.getPackSubstitutedTemplateArgument(TA);
1432 assert(TA.pack_size() == 1 && TA.pack_begin()->isPackExpansion() &&
1433 "unexpected pack arguments in template rewrite");
1434 TemplateArgument Arg = *TA.pack_begin();
1435 if (Arg.isPackExpansion())
1436 Arg = Arg.getPackExpansionPattern();
1437 return Arg;
1438 }
1439
1440 /// Transform the given declaration by instantiating a reference to
1441 /// this declaration.
1442 Decl *TransformDecl(SourceLocation Loc, Decl *D);
1443
1444 void transformAttrs(Decl *Old, Decl *New) {
1445 SemaRef.InstantiateAttrs(TemplateArgs, Old, New);
1446 }
1447
1448 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> NewDecls) {
1449 if (Old->isParameterPack() &&
1450 (NewDecls.size() != 1 || !NewDecls.front()->isParameterPack())) {
1452 for (auto *New : NewDecls)
1454 Old, cast<VarDecl>(New));
1455 return;
1456 }
1457
1458 assert(NewDecls.size() == 1 &&
1459 "should only have multiple expansions for a pack");
1460 Decl *New = NewDecls.front();
1461
1462 // If we've instantiated the call operator of a lambda or the call
1463 // operator template of a generic lambda, update the "instantiation of"
1464 // information.
1465 auto *NewMD = dyn_cast<CXXMethodDecl>(New);
1466 if (NewMD && isLambdaCallOperator(NewMD)) {
1467 auto *OldMD = dyn_cast<CXXMethodDecl>(Old);
1468 if (auto *NewTD = NewMD->getDescribedFunctionTemplate())
1469 NewTD->setInstantiatedFromMemberTemplate(
1470 OldMD->getDescribedFunctionTemplate());
1471 else
1472 NewMD->setInstantiationOfMemberFunction(OldMD,
1474 }
1475
1477
1478 // We recreated a local declaration, but not by instantiating it. There
1479 // may be pending dependent diagnostics to produce.
1480 if (auto *DC = dyn_cast<DeclContext>(Old);
1481 DC && DC->isDependentContext() && DC->isFunctionOrMethod())
1482 SemaRef.PerformDependentDiagnostics(DC, TemplateArgs);
1483 }
1484
1485 /// Transform the definition of the given declaration by
1486 /// instantiating it.
1487 Decl *TransformDefinition(SourceLocation Loc, Decl *D);
1488
1489 /// Transform the first qualifier within a scope by instantiating the
1490 /// declaration.
1491 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc);
1492
1493 bool TransformExceptionSpec(SourceLocation Loc,
1494 FunctionProtoType::ExceptionSpecInfo &ESI,
1495 SmallVectorImpl<QualType> &Exceptions,
1496 bool &Changed);
1497
1498 /// Rebuild the exception declaration and register the declaration
1499 /// as an instantiated local.
1500 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1501 TypeSourceInfo *Declarator,
1502 SourceLocation StartLoc,
1503 SourceLocation NameLoc,
1504 IdentifierInfo *Name);
1505
1506 /// Rebuild the Objective-C exception declaration and register the
1507 /// declaration as an instantiated local.
1508 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1509 TypeSourceInfo *TSInfo, QualType T);
1510
1512 TransformTemplateName(NestedNameSpecifierLoc &QualifierLoc,
1513 SourceLocation TemplateKWLoc, TemplateName Name,
1514 SourceLocation NameLoc,
1515 QualType ObjectType = QualType(),
1516 NamedDecl *FirstQualifierInScope = nullptr,
1517 bool AllowInjectedClassName = false);
1518
1519 const AnnotateAttr *TransformAnnotateAttr(const AnnotateAttr *AA);
1520 const CXXAssumeAttr *TransformCXXAssumeAttr(const CXXAssumeAttr *AA);
1521 const LoopHintAttr *TransformLoopHintAttr(const LoopHintAttr *LH);
1522 const NoInlineAttr *TransformStmtNoInlineAttr(const Stmt *OrigS,
1523 const Stmt *InstS,
1524 const NoInlineAttr *A);
1525 const AlwaysInlineAttr *
1526 TransformStmtAlwaysInlineAttr(const Stmt *OrigS, const Stmt *InstS,
1527 const AlwaysInlineAttr *A);
1528 const CodeAlignAttr *TransformCodeAlignAttr(const CodeAlignAttr *CA);
1529 const OpenACCRoutineDeclAttr *
1530 TransformOpenACCRoutineDeclAttr(const OpenACCRoutineDeclAttr *A);
1531 ExprResult TransformPredefinedExpr(PredefinedExpr *E);
1532 ExprResult TransformDeclRefExpr(DeclRefExpr *E);
1533 ExprResult TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E);
1534
1535 ExprResult TransformTemplateParmRefExpr(DeclRefExpr *E,
1536 NonTypeTemplateParmDecl *D);
1537
1538 /// Rebuild a DeclRefExpr for a VarDecl reference.
1539 ExprResult RebuildVarDeclRefExpr(ValueDecl *PD, SourceLocation Loc);
1540
1541 /// Transform a reference to a function or init-capture parameter pack.
1542 ExprResult TransformFunctionParmPackRefExpr(DeclRefExpr *E, ValueDecl *PD);
1543
1544 /// Transform a FunctionParmPackExpr which was built when we couldn't
1545 /// expand a function parameter pack reference which refers to an expanded
1546 /// pack.
1547 ExprResult TransformFunctionParmPackExpr(FunctionParmPackExpr *E);
1548
1549 QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
1550 FunctionProtoTypeLoc TL) {
1551 // Call the base version; it will forward to our overridden version below.
1552 return inherited::TransformFunctionProtoType(TLB, TL);
1553 }
1554
1555 QualType TransformTagType(TypeLocBuilder &TLB, TagTypeLoc TL) {
1556 auto Type = inherited::TransformTagType(TLB, TL);
1557 if (!Type.isNull())
1558 return Type;
1559 // Special case for transforming a deduction guide, we return a
1560 // transformed TemplateSpecializationType.
1561 // FIXME: Why is this hack necessary?
1562 if (const auto *ICNT = dyn_cast<InjectedClassNameType>(TL.getTypePtr());
1563 ICNT && SemaRef.CodeSynthesisContexts.back().Kind ==
1565 Type = inherited::TransformType(
1566 ICNT->getDecl()->getCanonicalTemplateSpecializationType(
1567 SemaRef.Context));
1568 TLB.pushTrivial(SemaRef.Context, Type, TL.getNameLoc());
1569 }
1570 return Type;
1571 }
1572 // Override the default version to handle a rewrite-template-arg-pack case
1573 // for building a deduction guide.
1574 bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
1575 TemplateArgumentLoc &Output,
1576 bool Uneval = false) {
1577 const TemplateArgument &Arg = Input.getArgument();
1578 std::vector<TemplateArgument> TArgs;
1579 switch (Arg.getKind()) {
1581 assert(SemaRef.CodeSynthesisContexts.empty() ||
1582 SemaRef.CodeSynthesisContexts.back().Kind ==
1584 // Literally rewrite the template argument pack, instead of unpacking
1585 // it.
1586 for (auto &pack : Arg.getPackAsArray()) {
1587 TemplateArgumentLoc Input = SemaRef.getTrivialTemplateArgumentLoc(
1588 pack, QualType(), SourceLocation{});
1589 TemplateArgumentLoc Output;
1590 if (TransformTemplateArgument(Input, Output, Uneval))
1591 return true; // fails
1592 TArgs.push_back(Output.getArgument());
1593 }
1594 Output = SemaRef.getTrivialTemplateArgumentLoc(
1595 TemplateArgument(llvm::ArrayRef(TArgs).copy(SemaRef.Context)),
1596 QualType(), SourceLocation{});
1597 return false;
1598 default:
1599 break;
1600 }
1601 return inherited::TransformTemplateArgument(Input, Output, Uneval);
1602 }
1603
1604 // This has to be here to allow its overload.
1605 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
1606 UnsignedOrNone NumExpansions) {
1607 return inherited::RebuildPackExpansion(Pattern, EllipsisLoc,
1608 NumExpansions);
1609 }
1610
1611 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
1612 SourceLocation EllipsisLoc,
1613 UnsignedOrNone NumExpansions) {
1614 // We don't rewrite a PackExpansion type when we want to normalize a
1615 // CXXFoldExpr constraint. We'll expand it when evaluating the constraint.
1616 if (BuildPackExpansionTypes)
1617 return inherited::RebuildPackExpansion(Pattern, EllipsisLoc,
1618 NumExpansions);
1619 return Pattern;
1620 }
1621
1623 QualType
1624 TransformTemplateSpecializationType(TypeLocBuilder &TLB,
1625 TemplateSpecializationTypeLoc TL) {
1626 auto *T = TL.getTypePtr();
1627 if (!getSema().ArgPackSubstIndex || !T->isSugared() ||
1628 !isPackProducingBuiltinTemplateName(T->getTemplateName()))
1630 // Look through sugar to get to the SubstBuiltinTemplatePackType that we
1631 // need to substitute into.
1632
1633 // `TransformType` code below will handle picking the element from a pack
1634 // with the index `ArgPackSubstIndex`.
1635 // FIXME: add ability to represent sugarred type for N-th element of a
1636 // builtin pack and produce the sugar here.
1637 QualType R = TransformType(T->desugar());
1638 TLB.pushTrivial(getSema().getASTContext(), R, TL.getBeginLoc());
1639 return R;
1640 }
1641
1642 UnsignedOrNone ComputeSizeOfPackExprWithoutSubstitution(
1643 ArrayRef<TemplateArgument> PackArgs) {
1644 // Don't do this when rewriting template parameters for CTAD:
1645 // 1) The heuristic needs the unpacked Subst* nodes to figure out the
1646 // expanded size, but this never applies since Subst* nodes are not
1647 // created in rewrite scenarios.
1648 //
1649 // 2) The heuristic substitutes into the pattern with pack expansion
1650 // suppressed, which does not meet the requirements for argument
1651 // rewriting when template arguments include a non-pack matching against
1652 // a pack, particularly when rewriting an alias CTAD.
1653 if (TemplateArgs.isRewrite())
1654 return std::nullopt;
1655
1656 return inherited::ComputeSizeOfPackExprWithoutSubstitution(PackArgs);
1657 }
1658
1659 template<typename Fn>
1660 QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
1661 FunctionProtoTypeLoc TL,
1662 CXXRecordDecl *ThisContext,
1663 Qualifiers ThisTypeQuals,
1664 Fn TransformExceptionSpec);
1665
1666 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
1667 int indexAdjustment,
1668 UnsignedOrNone NumExpansions,
1669 bool ExpectParameterPack);
1670
1671 using inherited::TransformTemplateTypeParmType;
1672 /// Transforms a template type parameter type by performing
1673 /// substitution of the corresponding template type argument.
1674 QualType TransformTemplateTypeParmType(TypeLocBuilder &TLB,
1675 TemplateTypeParmTypeLoc TL,
1676 bool SuppressObjCLifetime);
1677
1678 QualType BuildSubstTemplateTypeParmType(
1679 TypeLocBuilder &TLB, bool SuppressObjCLifetime, bool Final,
1680 Decl *AssociatedDecl, unsigned Index, UnsignedOrNone PackIndex,
1681 TemplateArgument Arg, SourceLocation NameLoc);
1682
1683 /// Transforms an already-substituted template type parameter pack
1684 /// into either itself (if we aren't substituting into its pack expansion)
1685 /// or the appropriate substituted argument.
1686 using inherited::TransformSubstTemplateTypeParmPackType;
1687 QualType
1688 TransformSubstTemplateTypeParmPackType(TypeLocBuilder &TLB,
1689 SubstTemplateTypeParmPackTypeLoc TL,
1690 bool SuppressObjCLifetime);
1691 QualType
1692 TransformSubstBuiltinTemplatePackType(TypeLocBuilder &TLB,
1693 SubstBuiltinTemplatePackTypeLoc TL);
1694
1696 ComputeLambdaDependency(LambdaScopeInfo *LSI) {
1697 if (auto TypeAlias =
1698 TemplateInstArgsHelpers::getEnclosingTypeAliasTemplateDecl(
1699 getSema());
1700 TypeAlias && TemplateInstArgsHelpers::isLambdaEnclosedByTypeAliasDecl(
1701 LSI->CallOperator, TypeAlias.PrimaryTypeAliasDecl)) {
1702 unsigned TypeAliasDeclDepth = TypeAlias.Template->getTemplateDepth();
1703 if (TypeAliasDeclDepth >= TemplateArgs.getNumSubstitutedLevels())
1704 return CXXRecordDecl::LambdaDependencyKind::LDK_AlwaysDependent;
1705 for (const TemplateArgument &TA : TypeAlias.AssociatedTemplateArguments)
1706 if (TA.isDependent())
1707 return CXXRecordDecl::LambdaDependencyKind::LDK_AlwaysDependent;
1708 }
1709 return inherited::ComputeLambdaDependency(LSI);
1710 }
1711
1712 ExprResult TransformLambdaExpr(LambdaExpr *E) {
1713 // Do not rebuild lambdas to avoid creating a new type.
1714 // Lambdas have already been processed inside their eval contexts.
1716 return E;
1717 LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true,
1718 /*InstantiatingLambdaOrBlock=*/true);
1719 Sema::ConstraintEvalRAII<TemplateInstantiator> RAII(*this);
1720
1721 return inherited::TransformLambdaExpr(E);
1722 }
1723
1724 ExprResult TransformBlockExpr(BlockExpr *E) {
1725 LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true,
1726 /*InstantiatingLambdaOrBlock=*/true);
1727 return inherited::TransformBlockExpr(E);
1728 }
1729
1730 ExprResult RebuildLambdaExpr(SourceLocation StartLoc, SourceLocation EndLoc,
1731 LambdaScopeInfo *LSI) {
1732 CXXMethodDecl *MD = LSI->CallOperator;
1733 for (ParmVarDecl *PVD : MD->parameters()) {
1734 assert(PVD && "null in a parameter list");
1735 if (!PVD->hasDefaultArg())
1736 continue;
1737 Expr *UninstExpr = PVD->getUninstantiatedDefaultArg();
1738 // FIXME: Obtain the source location for the '=' token.
1739 SourceLocation EqualLoc = UninstExpr->getBeginLoc();
1740 if (SemaRef.SubstDefaultArgument(EqualLoc, PVD, TemplateArgs)) {
1741 // If substitution fails, the default argument is set to a
1742 // RecoveryExpr that wraps the uninstantiated default argument so
1743 // that downstream diagnostics are omitted.
1744 ExprResult ErrorResult = SemaRef.CreateRecoveryExpr(
1745 UninstExpr->getBeginLoc(), UninstExpr->getEndLoc(), {UninstExpr},
1746 UninstExpr->getType());
1747 if (ErrorResult.isUsable())
1748 PVD->setDefaultArg(ErrorResult.get());
1749 }
1750 }
1751 return inherited::RebuildLambdaExpr(StartLoc, EndLoc, LSI);
1752 }
1753
1754 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body) {
1755 // Currently, we instantiate the body when instantiating the lambda
1756 // expression. However, `EvaluateConstraints` is disabled during the
1757 // instantiation of the lambda expression, causing the instantiation
1758 // failure of the return type requirement in the body. If p0588r1 is fully
1759 // implemented, the body will be lazily instantiated, and this problem
1760 // will not occur. Here, `EvaluateConstraints` is temporarily set to
1761 // `true` to temporarily fix this issue.
1762 // FIXME: This temporary fix can be removed after fully implementing
1763 // p0588r1.
1764 llvm::SaveAndRestore _(EvaluateConstraints, true);
1765 return inherited::TransformLambdaBody(E, Body);
1766 }
1767
1768 ExprResult TransformRequiresExpr(RequiresExpr *E) {
1769 LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true);
1770 ExprResult TransReq = inherited::TransformRequiresExpr(E);
1771 if (TransReq.isInvalid())
1772 return TransReq;
1773 assert(TransReq.get() != E &&
1774 "Do not change value of isSatisfied for the existing expression. "
1775 "Create a new expression instead.");
1776 if (E->getBody()->isDependentContext()) {
1777 Sema::SFINAETrap Trap(SemaRef);
1778 // We recreate the RequiresExpr body, but not by instantiating it.
1779 // Produce pending diagnostics for dependent access check.
1780 SemaRef.PerformDependentDiagnostics(E->getBody(), TemplateArgs);
1781 // FIXME: Store SFINAE diagnostics in RequiresExpr for diagnosis.
1782 if (Trap.hasErrorOccurred())
1783 TransReq.getAs<RequiresExpr>()->setSatisfied(false);
1784 }
1785 return TransReq;
1786 }
1787
1788 bool TransformRequiresExprRequirements(
1789 ArrayRef<concepts::Requirement *> Reqs,
1790 SmallVectorImpl<concepts::Requirement *> &Transformed) {
1791 bool SatisfactionDetermined = false;
1792 for (concepts::Requirement *Req : Reqs) {
1793 concepts::Requirement *TransReq = nullptr;
1794 if (!SatisfactionDetermined) {
1795 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
1796 TransReq = TransformTypeRequirement(TypeReq);
1797 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
1798 TransReq = TransformExprRequirement(ExprReq);
1799 else
1800 TransReq = TransformNestedRequirement(
1802 if (!TransReq)
1803 return true;
1804 if (!TransReq->isDependent() && !TransReq->isSatisfied())
1805 // [expr.prim.req]p6
1806 // [...] The substitution and semantic constraint checking
1807 // proceeds in lexical order and stops when a condition that
1808 // determines the result of the requires-expression is
1809 // encountered. [..]
1810 SatisfactionDetermined = true;
1811 } else
1812 TransReq = Req;
1813 Transformed.push_back(TransReq);
1814 }
1815 return false;
1816 }
1817
1818 TemplateParameterList *TransformTemplateParameterList(
1819 TemplateParameterList *OrigTPL) {
1820 if (!OrigTPL || !OrigTPL->size()) return OrigTPL;
1821
1822 DeclContext *Owner = OrigTPL->getParam(0)->getDeclContext();
1823 TemplateDeclInstantiator DeclInstantiator(getSema(),
1824 /* DeclContext *Owner */ Owner, TemplateArgs);
1825 DeclInstantiator.setEvaluateConstraints(EvaluateConstraints);
1826 return DeclInstantiator.SubstTemplateParams(OrigTPL);
1827 }
1828
1829 concepts::TypeRequirement *
1830 TransformTypeRequirement(concepts::TypeRequirement *Req);
1831 concepts::ExprRequirement *
1832 TransformExprRequirement(concepts::ExprRequirement *Req);
1833 concepts::NestedRequirement *
1834 TransformNestedRequirement(concepts::NestedRequirement *Req);
1835 ExprResult TransformRequiresTypeParams(
1836 SourceLocation KWLoc, SourceLocation RBraceLoc, const RequiresExpr *RE,
1837 RequiresExprBodyDecl *Body, ArrayRef<ParmVarDecl *> Params,
1838 SmallVectorImpl<QualType> &PTypes,
1839 SmallVectorImpl<ParmVarDecl *> &TransParams,
1840 Sema::ExtParameterInfoBuilder &PInfos);
1841 };
1842}
1843
1844bool TemplateInstantiator::AlreadyTransformed(QualType T) {
1845 if (T.isNull())
1846 return true;
1847
1850 return false;
1851
1852 getSema().MarkDeclarationsReferencedInType(Loc, T);
1853 return true;
1854}
1855
1856Decl *TemplateInstantiator::TransformDecl(SourceLocation Loc, Decl *D) {
1857 if (!D)
1858 return nullptr;
1859
1860 if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(D)) {
1861 if (TTP->getDepth() < TemplateArgs.getNumLevels()) {
1862 // If the corresponding template argument is NULL or non-existent, it's
1863 // because we are performing instantiation from explicitly-specified
1864 // template arguments in a function template, but there were some
1865 // arguments left unspecified.
1866 if (!TemplateArgs.hasTemplateArgument(TTP->getDepth(),
1867 TTP->getPosition())) {
1868 IsIncomplete = true;
1869 return BailOutOnIncomplete ? nullptr : D;
1870 }
1871
1872 TemplateArgument Arg = TemplateArgs(TTP->getDepth(), TTP->getPosition());
1873
1874 if (TTP->isParameterPack()) {
1875 assert(Arg.getKind() == TemplateArgument::Pack &&
1876 "Missing argument pack");
1877 Arg = SemaRef.getPackSubstitutedTemplateArgument(Arg);
1878 }
1879
1881 assert(!Template.isNull() && Template.getAsTemplateDecl() &&
1882 "Wrong kind of template template argument");
1883 return Template.getAsTemplateDecl();
1884 }
1885
1886 // Fall through to find the instantiated declaration for this template
1887 // template parameter.
1888 }
1889
1890 if (ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(D);
1891 PVD && SemaRef.CurrentInstantiationScope &&
1892 (SemaRef.inConstraintSubstitution() ||
1893 SemaRef.inParameterMappingSubstitution()) &&
1894 maybeInstantiateFunctionParameterToScope(PVD))
1895 return nullptr;
1896
1897 return SemaRef.FindInstantiatedDecl(Loc, cast<NamedDecl>(D), TemplateArgs);
1898}
1899
1900bool TemplateInstantiator::maybeInstantiateFunctionParameterToScope(
1901 ParmVarDecl *OldParm) {
1902 if (SemaRef.CurrentInstantiationScope->getInstantiationOfIfExists(OldParm))
1903 return false;
1904
1905 if (!OldParm->isParameterPack())
1906 return !TransformFunctionTypeParam(OldParm, /*indexAdjustment=*/0,
1907 /*NumExpansions=*/std::nullopt,
1908 /*ExpectParameterPack=*/false);
1909
1910 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
1911
1912 // Find the parameter packs that could be expanded.
1913 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
1914 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
1915 TypeLoc Pattern = ExpansionTL.getPatternLoc();
1916 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
1917 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
1918
1919 bool ShouldExpand = false;
1920 bool RetainExpansion = false;
1921 UnsignedOrNone OrigNumExpansions =
1922 ExpansionTL.getTypePtr()->getNumExpansions();
1923 UnsignedOrNone NumExpansions = OrigNumExpansions;
1924 if (TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
1925 Pattern.getSourceRange(), Unexpanded,
1926 /*FailOnPackProducingTemplates=*/true,
1927 ShouldExpand, RetainExpansion, NumExpansions))
1928 return true;
1929
1930 assert(ShouldExpand && !RetainExpansion &&
1931 "Shouldn't preserve pack expansion when evaluating constraints");
1932 ExpandingFunctionParameterPack(OldParm);
1933 for (unsigned I = 0; I != *NumExpansions; ++I) {
1934 Sema::ArgPackSubstIndexRAII SubstIndex(getSema(), I);
1935 if (!TransformFunctionTypeParam(OldParm, /*indexAdjustment=*/0,
1936 /*NumExpansions=*/OrigNumExpansions,
1937 /*ExpectParameterPack=*/false))
1938 return true;
1939 }
1940 return false;
1941}
1942
1943Decl *TemplateInstantiator::TransformDefinition(SourceLocation Loc, Decl *D) {
1944 Decl *Inst = getSema().SubstDecl(D, getSema().CurContext, TemplateArgs);
1945 if (!Inst)
1946 return nullptr;
1947
1948 getSema().CurrentInstantiationScope->InstantiatedLocal(D, Inst);
1949 return Inst;
1950}
1951
1952bool TemplateInstantiator::TransformExceptionSpec(
1953 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
1954 SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
1955 if (ESI.Type == EST_Uninstantiated) {
1956 ESI.instantiate();
1957 Changed = true;
1958 }
1959 return inherited::TransformExceptionSpec(Loc, ESI, Exceptions, Changed);
1960}
1961
1962NamedDecl *
1963TemplateInstantiator::TransformFirstQualifierInScope(NamedDecl *D,
1964 SourceLocation Loc) {
1965 // If the first part of the nested-name-specifier was a template type
1966 // parameter, instantiate that type parameter down to a tag type.
1967 if (TemplateTypeParmDecl *TTPD = dyn_cast_or_null<TemplateTypeParmDecl>(D)) {
1968 const TemplateTypeParmType *TTP
1969 = cast<TemplateTypeParmType>(getSema().Context.getTypeDeclType(TTPD));
1970
1971 if (TTP->getDepth() < TemplateArgs.getNumLevels()) {
1972 // FIXME: This needs testing w/ member access expressions.
1973 TemplateArgument Arg = TemplateArgs(TTP->getDepth(), TTP->getIndex());
1974
1975 if (TTP->isParameterPack()) {
1976 assert(Arg.getKind() == TemplateArgument::Pack &&
1977 "Missing argument pack");
1978
1979 if (!getSema().ArgPackSubstIndex)
1980 return nullptr;
1981
1982 Arg = SemaRef.getPackSubstitutedTemplateArgument(Arg);
1983 }
1984
1985 QualType T = Arg.getAsType();
1986 if (T.isNull())
1987 return cast_or_null<NamedDecl>(TransformDecl(Loc, D));
1988
1989 if (const TagType *Tag = T->getAs<TagType>())
1990 return Tag->getDecl();
1991
1992 // The resulting type is not a tag; complain.
1993 getSema().Diag(Loc, diag::err_nested_name_spec_non_tag) << T;
1994 return nullptr;
1995 }
1996 }
1997
1998 return cast_or_null<NamedDecl>(TransformDecl(Loc, D));
1999}
2000
2001VarDecl *
2002TemplateInstantiator::RebuildExceptionDecl(VarDecl *ExceptionDecl,
2003 TypeSourceInfo *Declarator,
2004 SourceLocation StartLoc,
2005 SourceLocation NameLoc,
2006 IdentifierInfo *Name) {
2007 VarDecl *Var = inherited::RebuildExceptionDecl(ExceptionDecl, Declarator,
2008 StartLoc, NameLoc, Name);
2009 if (Var)
2010 getSema().CurrentInstantiationScope->InstantiatedLocal(ExceptionDecl, Var);
2011 return Var;
2012}
2013
2014VarDecl *TemplateInstantiator::RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
2015 TypeSourceInfo *TSInfo,
2016 QualType T) {
2017 VarDecl *Var = inherited::RebuildObjCExceptionDecl(ExceptionDecl, TSInfo, T);
2018 if (Var)
2019 getSema().CurrentInstantiationScope->InstantiatedLocal(ExceptionDecl, Var);
2020 return Var;
2021}
2022
2023TemplateName TemplateInstantiator::TransformTemplateName(
2024 NestedNameSpecifierLoc &QualifierLoc, SourceLocation TemplateKWLoc,
2025 TemplateName Name, SourceLocation NameLoc, QualType ObjectType,
2026 NamedDecl *FirstQualifierInScope, bool AllowInjectedClassName) {
2027 if (Name.getKind() == TemplateName::Template) {
2028 assert(!QualifierLoc && "Unexpected qualifier");
2029 if (auto *TTP =
2030 dyn_cast<TemplateTemplateParmDecl>(Name.getAsTemplateDecl());
2031 TTP && TTP->getDepth() < TemplateArgs.getNumLevels()) {
2032 // If the corresponding template argument is NULL or non-existent, it's
2033 // because we are performing instantiation from explicitly-specified
2034 // template arguments in a function template, but there were some
2035 // arguments left unspecified.
2036 if (!TemplateArgs.hasTemplateArgument(TTP->getDepth(),
2037 TTP->getPosition())) {
2038 IsIncomplete = true;
2039 return BailOutOnIncomplete ? TemplateName() : Name;
2040 }
2041
2042 TemplateArgument Arg = TemplateArgs(TTP->getDepth(), TTP->getPosition());
2043
2044 if (TemplateArgs.isRewrite()) {
2045 // We're rewriting the template parameter as a reference to another
2046 // template parameter.
2047 Arg = getTemplateArgumentPackPatternForRewrite(Arg);
2048 assert(Arg.getKind() == TemplateArgument::Template &&
2049 "unexpected nontype template argument kind in template rewrite");
2050 return Arg.getAsTemplate();
2051 }
2052
2053 auto [AssociatedDecl, Final] =
2054 TemplateArgs.getAssociatedDecl(TTP->getDepth());
2055 UnsignedOrNone PackIndex = std::nullopt;
2056 if (TTP->isParameterPack()) {
2057 assert(Arg.getKind() == TemplateArgument::Pack &&
2058 "Missing argument pack");
2059
2060 if (!getSema().ArgPackSubstIndex) {
2061 // We have the template argument pack to substitute, but we're not
2062 // actually expanding the enclosing pack expansion yet. So, just
2063 // keep the entire argument pack.
2064 return getSema().Context.getSubstTemplateTemplateParmPack(
2065 Arg, AssociatedDecl, TTP->getIndex(), Final);
2066 }
2067
2068 PackIndex = SemaRef.getPackIndex(Arg);
2069 Arg = SemaRef.getPackSubstitutedTemplateArgument(Arg);
2070 }
2071
2073 assert(!Template.isNull() && "Null template template argument");
2074 return getSema().Context.getSubstTemplateTemplateParm(
2075 Template, AssociatedDecl, TTP->getIndex(), PackIndex, Final);
2076 }
2077 }
2078
2079 if (SubstTemplateTemplateParmPackStorage *SubstPack
2081 if (!getSema().ArgPackSubstIndex)
2082 return Name;
2083
2084 TemplateArgument Pack = SubstPack->getArgumentPack();
2086 SemaRef.getPackSubstitutedTemplateArgument(Pack).getAsTemplate();
2087 return getSema().Context.getSubstTemplateTemplateParm(
2088 Template, SubstPack->getAssociatedDecl(), SubstPack->getIndex(),
2089 SemaRef.getPackIndex(Pack), SubstPack->getFinal());
2090 }
2091
2092 return inherited::TransformTemplateName(
2093 QualifierLoc, TemplateKWLoc, Name, NameLoc, ObjectType,
2094 FirstQualifierInScope, AllowInjectedClassName);
2095}
2096
2098TemplateInstantiator::TransformPredefinedExpr(PredefinedExpr *E) {
2099 if (!E->isTypeDependent())
2100 return E;
2101
2102 return getSema().BuildPredefinedExpr(E->getLocation(), E->getIdentKind());
2103}
2104
2106TemplateInstantiator::TransformTemplateParmRefExpr(DeclRefExpr *E,
2107 NonTypeTemplateParmDecl *NTTP) {
2108 // If the corresponding template argument is NULL or non-existent, it's
2109 // because we are performing instantiation from explicitly-specified
2110 // template arguments in a function template, but there were some
2111 // arguments left unspecified.
2112 if (!TemplateArgs.hasTemplateArgument(NTTP->getDepth(),
2113 NTTP->getPosition())) {
2114 IsIncomplete = true;
2115 return BailOutOnIncomplete ? ExprError() : E;
2116 }
2117
2118 TemplateArgument Arg = TemplateArgs(NTTP->getDepth(), NTTP->getPosition());
2119
2120 if (TemplateArgs.isRewrite()) {
2121 // We're rewriting the template parameter as a reference to another
2122 // template parameter.
2123 Arg = getTemplateArgumentPackPatternForRewrite(Arg);
2124 assert(Arg.getKind() == TemplateArgument::Expression &&
2125 "unexpected nontype template argument kind in template rewrite");
2126 // FIXME: This can lead to the same subexpression appearing multiple times
2127 // in a complete expression.
2128 return Arg.getAsExpr();
2129 }
2130
2131 auto [AssociatedDecl, Final] =
2132 TemplateArgs.getAssociatedDecl(NTTP->getDepth());
2133 UnsignedOrNone PackIndex = std::nullopt;
2134 if (NTTP->isParameterPack()) {
2135 assert(Arg.getKind() == TemplateArgument::Pack &&
2136 "Missing argument pack");
2137
2138 if (!getSema().ArgPackSubstIndex) {
2139 // We have an argument pack, but we can't select a particular argument
2140 // out of it yet. Therefore, we'll build an expression to hold on to that
2141 // argument pack.
2142 QualType TargetType = SemaRef.SubstType(NTTP->getType(), TemplateArgs,
2143 E->getLocation(),
2144 NTTP->getDeclName());
2145 if (TargetType.isNull())
2146 return ExprError();
2147
2148 QualType ExprType = TargetType.getNonLValueExprType(SemaRef.Context);
2149 if (TargetType->isRecordType())
2150 ExprType.addConst();
2151 return new (SemaRef.Context) SubstNonTypeTemplateParmPackExpr(
2152 ExprType, TargetType->isReferenceType() ? VK_LValue : VK_PRValue,
2153 E->getLocation(), Arg, AssociatedDecl, NTTP->getPosition(), Final);
2154 }
2155 PackIndex = SemaRef.getPackIndex(Arg);
2156 Arg = SemaRef.getPackSubstitutedTemplateArgument(Arg);
2157 }
2158 return SemaRef.BuildSubstNonTypeTemplateParmExpr(
2159 AssociatedDecl, NTTP, E->getLocation(), Arg, PackIndex, Final);
2160}
2161
2162const AnnotateAttr *
2163TemplateInstantiator::TransformAnnotateAttr(const AnnotateAttr *AA) {
2164 SmallVector<Expr *> Args;
2165 for (Expr *Arg : AA->args()) {
2166 ExprResult Res = getDerived().TransformExpr(Arg);
2167 if (Res.isUsable())
2168 Args.push_back(Res.get());
2169 }
2170 return AnnotateAttr::CreateImplicit(getSema().Context, AA->getAnnotation(),
2171 Args.data(), Args.size(), AA->getRange());
2172}
2173
2174const CXXAssumeAttr *
2175TemplateInstantiator::TransformCXXAssumeAttr(const CXXAssumeAttr *AA) {
2176 ExprResult Res = getDerived().TransformExpr(AA->getAssumption());
2177 if (!Res.isUsable())
2178 return AA;
2179
2180 if (!(Res.get()->getDependence() & ExprDependence::TypeValueInstantiation)) {
2181 Res = getSema().BuildCXXAssumeExpr(Res.get(), AA->getAttrName(),
2182 AA->getRange());
2183 if (!Res.isUsable())
2184 return AA;
2185 }
2186
2187 return CXXAssumeAttr::CreateImplicit(getSema().Context, Res.get(),
2188 AA->getRange());
2189}
2190
2191const LoopHintAttr *
2192TemplateInstantiator::TransformLoopHintAttr(const LoopHintAttr *LH) {
2193 Expr *TransformedExpr = getDerived().TransformExpr(LH->getValue()).get();
2194
2195 if (TransformedExpr == LH->getValue())
2196 return LH;
2197
2198 // Generate error if there is a problem with the value.
2199 if (getSema().CheckLoopHintExpr(TransformedExpr, LH->getLocation(),
2200 LH->getSemanticSpelling() ==
2201 LoopHintAttr::Pragma_unroll))
2202 return LH;
2203
2204 LoopHintAttr::OptionType Option = LH->getOption();
2205 LoopHintAttr::LoopHintState State = LH->getState();
2206
2207 llvm::APSInt ValueAPS =
2208 TransformedExpr->EvaluateKnownConstInt(getSema().getASTContext());
2209 // The values of 0 and 1 block any unrolling of the loop.
2210 if (ValueAPS.isZero() || ValueAPS.isOne()) {
2211 Option = LoopHintAttr::Unroll;
2212 State = LoopHintAttr::Disable;
2213 }
2214
2215 // Create new LoopHintValueAttr with integral expression in place of the
2216 // non-type template parameter.
2217 return LoopHintAttr::CreateImplicit(getSema().Context, Option, State,
2218 TransformedExpr, *LH);
2219}
2220const NoInlineAttr *TemplateInstantiator::TransformStmtNoInlineAttr(
2221 const Stmt *OrigS, const Stmt *InstS, const NoInlineAttr *A) {
2222 if (!A || getSema().CheckNoInlineAttr(OrigS, InstS, *A))
2223 return nullptr;
2224
2225 return A;
2226}
2227const AlwaysInlineAttr *TemplateInstantiator::TransformStmtAlwaysInlineAttr(
2228 const Stmt *OrigS, const Stmt *InstS, const AlwaysInlineAttr *A) {
2229 if (!A || getSema().CheckAlwaysInlineAttr(OrigS, InstS, *A))
2230 return nullptr;
2231
2232 return A;
2233}
2234
2235const CodeAlignAttr *
2236TemplateInstantiator::TransformCodeAlignAttr(const CodeAlignAttr *CA) {
2237 Expr *TransformedExpr = getDerived().TransformExpr(CA->getAlignment()).get();
2238 return getSema().BuildCodeAlignAttr(*CA, TransformedExpr);
2239}
2240const OpenACCRoutineDeclAttr *
2241TemplateInstantiator::TransformOpenACCRoutineDeclAttr(
2242 const OpenACCRoutineDeclAttr *A) {
2243 llvm_unreachable("RoutineDecl should only be a declaration attribute, as it "
2244 "applies to a Function Decl (and a few places for VarDecl)");
2245}
2246
2247ExprResult TemplateInstantiator::RebuildVarDeclRefExpr(ValueDecl *PD,
2248 SourceLocation Loc) {
2249 DeclarationNameInfo NameInfo(PD->getDeclName(), Loc);
2250 return getSema().BuildDeclarationNameExpr(CXXScopeSpec(), NameInfo, PD);
2251}
2252
2254TemplateInstantiator::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
2255 if (getSema().ArgPackSubstIndex) {
2256 // We can expand this parameter pack now.
2257 ValueDecl *D = E->getExpansion(*getSema().ArgPackSubstIndex);
2258 ValueDecl *VD = cast_or_null<ValueDecl>(TransformDecl(E->getExprLoc(), D));
2259 if (!VD)
2260 return ExprError();
2261 return RebuildVarDeclRefExpr(VD, E->getExprLoc());
2262 }
2263
2264 QualType T = TransformType(E->getType());
2265 if (T.isNull())
2266 return ExprError();
2267
2268 // Transform each of the parameter expansions into the corresponding
2269 // parameters in the instantiation of the function decl.
2270 SmallVector<ValueDecl *, 8> Vars;
2271 Vars.reserve(E->getNumExpansions());
2272 for (FunctionParmPackExpr::iterator I = E->begin(), End = E->end();
2273 I != End; ++I) {
2274 ValueDecl *D = cast_or_null<ValueDecl>(TransformDecl(E->getExprLoc(), *I));
2275 if (!D)
2276 return ExprError();
2277 Vars.push_back(D);
2278 }
2279
2280 auto *PackExpr =
2282 E->getParameterPackLocation(), Vars);
2283 getSema().MarkFunctionParmPackReferenced(PackExpr);
2284 return PackExpr;
2285}
2286
2288TemplateInstantiator::TransformFunctionParmPackRefExpr(DeclRefExpr *E,
2289 ValueDecl *PD) {
2290 typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack;
2291 llvm::PointerUnion<Decl *, DeclArgumentPack *> *Found
2292 = getSema().CurrentInstantiationScope->findInstantiationOf(PD);
2293 assert(Found && "no instantiation for parameter pack");
2294
2295 Decl *TransformedDecl;
2296 if (DeclArgumentPack *Pack = dyn_cast<DeclArgumentPack *>(*Found)) {
2297 // If this is a reference to a function parameter pack which we can
2298 // substitute but can't yet expand, build a FunctionParmPackExpr for it.
2299 if (!getSema().ArgPackSubstIndex) {
2300 QualType T = TransformType(E->getType());
2301 if (T.isNull())
2302 return ExprError();
2303 auto *PackExpr = FunctionParmPackExpr::Create(getSema().Context, T, PD,
2304 E->getExprLoc(), *Pack);
2305 getSema().MarkFunctionParmPackReferenced(PackExpr);
2306 return PackExpr;
2307 }
2308
2309 TransformedDecl = (*Pack)[*getSema().ArgPackSubstIndex];
2310 } else {
2311 TransformedDecl = cast<Decl *>(*Found);
2312 }
2313
2314 // We have either an unexpanded pack or a specific expansion.
2315 return RebuildVarDeclRefExpr(cast<ValueDecl>(TransformedDecl),
2316 E->getExprLoc());
2317}
2318
2320TemplateInstantiator::TransformDeclRefExpr(DeclRefExpr *E) {
2321 NamedDecl *D = E->getDecl();
2322
2323 // Handle references to non-type template parameters and non-type template
2324 // parameter packs.
2325 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
2326 if (NTTP->getDepth() < TemplateArgs.getNumLevels())
2327 return TransformTemplateParmRefExpr(E, NTTP);
2328
2329 // We have a non-type template parameter that isn't fully substituted;
2330 // FindInstantiatedDecl will find it in the local instantiation scope.
2331 }
2332
2333 // Handle references to function parameter packs.
2334 if (VarDecl *PD = dyn_cast<VarDecl>(D))
2335 if (PD->isParameterPack())
2336 return TransformFunctionParmPackRefExpr(E, PD);
2337
2338 return inherited::TransformDeclRefExpr(E);
2339}
2340
2341ExprResult TemplateInstantiator::TransformCXXDefaultArgExpr(
2342 CXXDefaultArgExpr *E) {
2343 assert(!cast<FunctionDecl>(E->getParam()->getDeclContext())->
2344 getDescribedFunctionTemplate() &&
2345 "Default arg expressions are never formed in dependent cases.");
2346 return SemaRef.BuildCXXDefaultArgExpr(
2348 E->getParam());
2349}
2350
2351template<typename Fn>
2352QualType TemplateInstantiator::TransformFunctionProtoType(TypeLocBuilder &TLB,
2353 FunctionProtoTypeLoc TL,
2354 CXXRecordDecl *ThisContext,
2355 Qualifiers ThisTypeQuals,
2356 Fn TransformExceptionSpec) {
2357 // If this is a lambda or block, the transformation MUST be done in the
2358 // CurrentInstantiationScope since it introduces a mapping of
2359 // the original to the newly created transformed parameters.
2360 //
2361 // In that case, TemplateInstantiator::TransformLambdaExpr will
2362 // have already pushed a scope for this prototype, so don't create
2363 // a second one.
2364 LocalInstantiationScope *Current = getSema().CurrentInstantiationScope;
2365 std::optional<LocalInstantiationScope> Scope;
2366 if (!Current || !Current->isLambdaOrBlock())
2367 Scope.emplace(SemaRef, /*CombineWithOuterScope=*/true);
2368
2369 return inherited::TransformFunctionProtoType(
2370 TLB, TL, ThisContext, ThisTypeQuals, TransformExceptionSpec);
2371}
2372
2373ParmVarDecl *TemplateInstantiator::TransformFunctionTypeParam(
2374 ParmVarDecl *OldParm, int indexAdjustment, UnsignedOrNone NumExpansions,
2375 bool ExpectParameterPack) {
2376 auto NewParm = SemaRef.SubstParmVarDecl(
2377 OldParm, TemplateArgs, indexAdjustment, NumExpansions,
2378 ExpectParameterPack, EvaluateConstraints);
2379 if (NewParm && SemaRef.getLangOpts().OpenCL)
2380 SemaRef.deduceOpenCLAddressSpace(NewParm);
2381 return NewParm;
2382}
2383
2384QualType TemplateInstantiator::BuildSubstTemplateTypeParmType(
2385 TypeLocBuilder &TLB, bool SuppressObjCLifetime, bool Final,
2386 Decl *AssociatedDecl, unsigned Index, UnsignedOrNone PackIndex,
2387 TemplateArgument Arg, SourceLocation NameLoc) {
2388 QualType Replacement = Arg.getAsType();
2389
2390 // If the template parameter had ObjC lifetime qualifiers,
2391 // then any such qualifiers on the replacement type are ignored.
2392 if (SuppressObjCLifetime) {
2393 Qualifiers RQs;
2394 RQs = Replacement.getQualifiers();
2395 RQs.removeObjCLifetime();
2396 Replacement =
2397 SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(), RQs);
2398 }
2399
2400 // TODO: only do this uniquing once, at the start of instantiation.
2401 QualType Result = getSema().Context.getSubstTemplateTypeParmType(
2402 Replacement, AssociatedDecl, Index, PackIndex, Final);
2403 SubstTemplateTypeParmTypeLoc NewTL =
2404 TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
2405 NewTL.setNameLoc(NameLoc);
2406 return Result;
2407}
2408
2409QualType
2410TemplateInstantiator::TransformTemplateTypeParmType(TypeLocBuilder &TLB,
2411 TemplateTypeParmTypeLoc TL,
2412 bool SuppressObjCLifetime) {
2413 const TemplateTypeParmType *T = TL.getTypePtr();
2414 if (T->getDepth() < TemplateArgs.getNumLevels()) {
2415 // Replace the template type parameter with its corresponding
2416 // template argument.
2417
2418 // If the corresponding template argument is NULL or doesn't exist, it's
2419 // because we are performing instantiation from explicitly-specified
2420 // template arguments in a function template class, but there were some
2421 // arguments left unspecified.
2422 if (!TemplateArgs.hasTemplateArgument(T->getDepth(), T->getIndex())) {
2423 IsIncomplete = true;
2424 if (BailOutOnIncomplete)
2425 return QualType();
2426
2427 TemplateTypeParmTypeLoc NewTL
2428 = TLB.push<TemplateTypeParmTypeLoc>(TL.getType());
2429 NewTL.setNameLoc(TL.getNameLoc());
2430 return TL.getType();
2431 }
2432
2433 TemplateArgument Arg = TemplateArgs(T->getDepth(), T->getIndex());
2434
2435 if (TemplateArgs.isRewrite()) {
2436 // We're rewriting the template parameter as a reference to another
2437 // template parameter.
2438 Arg = getTemplateArgumentPackPatternForRewrite(Arg);
2439 assert(Arg.getKind() == TemplateArgument::Type &&
2440 "unexpected nontype template argument kind in template rewrite");
2441 QualType NewT = Arg.getAsType();
2442 TLB.pushTrivial(SemaRef.Context, NewT, TL.getNameLoc());
2443 return NewT;
2444 }
2445
2446 auto [AssociatedDecl, Final] =
2447 TemplateArgs.getAssociatedDecl(T->getDepth());
2448 UnsignedOrNone PackIndex = std::nullopt;
2449 if (T->isParameterPack()) {
2450 assert(Arg.getKind() == TemplateArgument::Pack &&
2451 "Missing argument pack");
2452
2453 if (!getSema().ArgPackSubstIndex) {
2454 // We have the template argument pack, but we're not expanding the
2455 // enclosing pack expansion yet. Just save the template argument
2456 // pack for later substitution.
2457 QualType Result = getSema().Context.getSubstTemplateTypeParmPackType(
2458 AssociatedDecl, T->getIndex(), Final, Arg);
2459 SubstTemplateTypeParmPackTypeLoc NewTL
2460 = TLB.push<SubstTemplateTypeParmPackTypeLoc>(Result);
2461 NewTL.setNameLoc(TL.getNameLoc());
2462 return Result;
2463 }
2464
2465 // PackIndex starts from last element.
2466 PackIndex = SemaRef.getPackIndex(Arg);
2467 Arg = SemaRef.getPackSubstitutedTemplateArgument(Arg);
2468 }
2469
2470 assert(Arg.getKind() == TemplateArgument::Type &&
2471 "Template argument kind mismatch");
2472
2473 return BuildSubstTemplateTypeParmType(TLB, SuppressObjCLifetime, Final,
2474 AssociatedDecl, T->getIndex(),
2475 PackIndex, Arg, TL.getNameLoc());
2476 }
2477
2478 // The template type parameter comes from an inner template (e.g.,
2479 // the template parameter list of a member template inside the
2480 // template we are instantiating). Create a new template type
2481 // parameter with the template "level" reduced by one.
2482 TemplateTypeParmDecl *NewTTPDecl = nullptr;
2483 if (TemplateTypeParmDecl *OldTTPDecl = T->getDecl())
2484 NewTTPDecl = cast_or_null<TemplateTypeParmDecl>(
2485 TransformDecl(TL.getNameLoc(), OldTTPDecl));
2486 QualType Result = getSema().Context.getTemplateTypeParmType(
2487 T->getDepth() - TemplateArgs.getNumSubstitutedLevels(), T->getIndex(),
2488 T->isParameterPack(), NewTTPDecl);
2489 TemplateTypeParmTypeLoc NewTL = TLB.push<TemplateTypeParmTypeLoc>(Result);
2490 NewTL.setNameLoc(TL.getNameLoc());
2491 return Result;
2492}
2493
2494QualType TemplateInstantiator::TransformSubstTemplateTypeParmPackType(
2495 TypeLocBuilder &TLB, SubstTemplateTypeParmPackTypeLoc TL,
2496 bool SuppressObjCLifetime) {
2497 const SubstTemplateTypeParmPackType *T = TL.getTypePtr();
2498
2499 Decl *NewReplaced = TransformDecl(TL.getNameLoc(), T->getAssociatedDecl());
2500
2501 if (!getSema().ArgPackSubstIndex) {
2502 // We aren't expanding the parameter pack, so just return ourselves.
2503 QualType Result = TL.getType();
2504 if (NewReplaced != T->getAssociatedDecl())
2505 Result = getSema().Context.getSubstTemplateTypeParmPackType(
2506 NewReplaced, T->getIndex(), T->getFinal(), T->getArgumentPack());
2507 SubstTemplateTypeParmPackTypeLoc NewTL =
2508 TLB.push<SubstTemplateTypeParmPackTypeLoc>(Result);
2509 NewTL.setNameLoc(TL.getNameLoc());
2510 return Result;
2511 }
2512
2513 TemplateArgument Pack = T->getArgumentPack();
2514 TemplateArgument Arg = SemaRef.getPackSubstitutedTemplateArgument(Pack);
2515 return BuildSubstTemplateTypeParmType(
2516 TLB, SuppressObjCLifetime, T->getFinal(), NewReplaced, T->getIndex(),
2517 SemaRef.getPackIndex(Pack), Arg, TL.getNameLoc());
2518}
2519
2520QualType TemplateInstantiator::TransformSubstBuiltinTemplatePackType(
2521 TypeLocBuilder &TLB, SubstBuiltinTemplatePackTypeLoc TL) {
2522 if (!getSema().ArgPackSubstIndex)
2523 return TreeTransform::TransformSubstBuiltinTemplatePackType(TLB, TL);
2524 TemplateArgument Result = SemaRef.getPackSubstitutedTemplateArgument(
2525 TL.getTypePtr()->getArgumentPack());
2526 TLB.pushTrivial(SemaRef.getASTContext(), Result.getAsType(),
2527 TL.getBeginLoc());
2528 return Result.getAsType();
2529}
2530
2531static concepts::Requirement::SubstitutionDiagnostic *
2533 Sema::EntityPrinter Printer) {
2534 SmallString<128> Message;
2535 SourceLocation ErrorLoc;
2536 if (Info.hasSFINAEDiagnostic()) {
2539 Info.takeSFINAEDiagnostic(PDA);
2540 PDA.second.EmitToString(S.getDiagnostics(), Message);
2541 ErrorLoc = PDA.first;
2542 } else {
2543 ErrorLoc = Info.getLocation();
2544 }
2545 SmallString<128> Entity;
2546 llvm::raw_svector_ostream OS(Entity);
2547 Printer(OS);
2548 const ASTContext &C = S.Context;
2550 C.backupStr(Entity), ErrorLoc, C.backupStr(Message)};
2551}
2552
2553concepts::Requirement::SubstitutionDiagnostic *
2555 SmallString<128> Entity;
2556 llvm::raw_svector_ostream OS(Entity);
2557 Printer(OS);
2558 const ASTContext &C = Context;
2560 /*SubstitutedEntity=*/C.backupStr(Entity),
2561 /*DiagLoc=*/Location, /*DiagMessage=*/StringRef()};
2562}
2563
2564ExprResult TemplateInstantiator::TransformRequiresTypeParams(
2565 SourceLocation KWLoc, SourceLocation RBraceLoc, const RequiresExpr *RE,
2568 SmallVectorImpl<ParmVarDecl *> &TransParams,
2570
2571 TemplateDeductionInfo Info(KWLoc);
2572 Sema::InstantiatingTemplate TypeInst(SemaRef, KWLoc, RE,
2573 SourceRange{KWLoc, RBraceLoc});
2574 Sema::SFINAETrap Trap(SemaRef, Info);
2575
2576 unsigned ErrorIdx;
2577 if (getDerived().TransformFunctionTypeParams(
2578 KWLoc, Params, /*ParamTypes=*/nullptr, /*ParamInfos=*/nullptr, PTypes,
2579 &TransParams, PInfos, &ErrorIdx) ||
2580 Trap.hasErrorOccurred()) {
2582 ParmVarDecl *FailedDecl = Params[ErrorIdx];
2583 // Add a 'failed' Requirement to contain the error that caused the failure
2584 // here.
2585 TransReqs.push_back(RebuildTypeRequirement(createSubstDiag(
2586 SemaRef, Info, [&](llvm::raw_ostream &OS) { OS << *FailedDecl; })));
2587 return getDerived().RebuildRequiresExpr(KWLoc, Body, RE->getLParenLoc(),
2588 TransParams, RE->getRParenLoc(),
2589 TransReqs, RBraceLoc);
2590 }
2591
2592 return ExprResult{};
2593}
2594
2595concepts::TypeRequirement *
2596TemplateInstantiator::TransformTypeRequirement(concepts::TypeRequirement *Req) {
2597 if (!Req->isDependent() && !AlwaysRebuild())
2598 return Req;
2599 if (Req->isSubstitutionFailure()) {
2600 if (AlwaysRebuild())
2601 return RebuildTypeRequirement(
2603 return Req;
2604 }
2605
2606 TemplateDeductionInfo Info(Req->getType()->getTypeLoc().getBeginLoc());
2607 Sema::SFINAETrap Trap(SemaRef, Info);
2608 Sema::InstantiatingTemplate TypeInst(
2609 SemaRef, Req->getType()->getTypeLoc().getBeginLoc(), Req,
2610 Req->getType()->getTypeLoc().getSourceRange());
2611 if (TypeInst.isInvalid())
2612 return nullptr;
2613 TypeSourceInfo *TransType = TransformType(Req->getType());
2614 if (!TransType || Trap.hasErrorOccurred())
2615 return RebuildTypeRequirement(createSubstDiag(SemaRef, Info,
2616 [&] (llvm::raw_ostream& OS) {
2617 Req->getType()->getType().print(OS, SemaRef.getPrintingPolicy());
2618 }));
2619 return RebuildTypeRequirement(TransType);
2620}
2621
2622concepts::ExprRequirement *
2623TemplateInstantiator::TransformExprRequirement(concepts::ExprRequirement *Req) {
2624 if (!Req->isDependent() && !AlwaysRebuild())
2625 return Req;
2626
2627 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *>
2628 TransExpr;
2629 if (Req->isExprSubstitutionFailure())
2630 TransExpr = Req->getExprSubstitutionDiagnostic();
2631 else {
2632 Expr *E = Req->getExpr();
2633 TemplateDeductionInfo Info(E->getBeginLoc());
2634 Sema::SFINAETrap Trap(SemaRef, Info);
2635 Sema::InstantiatingTemplate ExprInst(SemaRef, E->getBeginLoc(), Req,
2636 E->getSourceRange());
2637 if (ExprInst.isInvalid())
2638 return nullptr;
2639 ExprResult TransExprRes = TransformExpr(E);
2640 if (!TransExprRes.isInvalid() && !Trap.hasErrorOccurred() &&
2641 TransExprRes.get()->hasPlaceholderType())
2642 TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get());
2643 if (TransExprRes.isInvalid() || Trap.hasErrorOccurred())
2644 TransExpr = createSubstDiag(SemaRef, Info, [&](llvm::raw_ostream &OS) {
2645 E->printPretty(OS, nullptr, SemaRef.getPrintingPolicy());
2646 });
2647 else
2648 TransExpr = TransExprRes.get();
2649 }
2650
2651 std::optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
2652 const auto &RetReq = Req->getReturnTypeRequirement();
2653 if (RetReq.isEmpty())
2654 TransRetReq.emplace();
2655 else if (RetReq.isSubstitutionFailure())
2656 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
2657 else if (RetReq.isTypeConstraint()) {
2658 TemplateParameterList *OrigTPL =
2659 RetReq.getTypeConstraintTemplateParameterList();
2660 TemplateDeductionInfo Info(OrigTPL->getTemplateLoc());
2661 Sema::SFINAETrap Trap(SemaRef, Info);
2662 Sema::InstantiatingTemplate TPLInst(SemaRef, OrigTPL->getTemplateLoc(), Req,
2663 OrigTPL->getSourceRange());
2664 if (TPLInst.isInvalid())
2665 return nullptr;
2666 TemplateParameterList *TPL = TransformTemplateParameterList(OrigTPL);
2667 if (!TPL || Trap.hasErrorOccurred())
2668 TransRetReq.emplace(createSubstDiag(SemaRef, Info,
2669 [&] (llvm::raw_ostream& OS) {
2670 RetReq.getTypeConstraint()->getImmediatelyDeclaredConstraint()
2671 ->printPretty(OS, nullptr, SemaRef.getPrintingPolicy());
2672 }));
2673 else {
2674 TPLInst.Clear();
2675 TransRetReq.emplace(TPL);
2676 }
2677 }
2678 assert(TransRetReq && "All code paths leading here must set TransRetReq");
2679 if (Expr *E = TransExpr.dyn_cast<Expr *>())
2680 return RebuildExprRequirement(E, Req->isSimple(), Req->getNoexceptLoc(),
2681 std::move(*TransRetReq));
2682 return RebuildExprRequirement(
2684 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
2685}
2686
2687concepts::NestedRequirement *
2688TemplateInstantiator::TransformNestedRequirement(
2689 concepts::NestedRequirement *Req) {
2690
2691 ASTContext &C = SemaRef.Context;
2692
2693 Expr *Constraint = Req->getConstraintExpr();
2694 ConstraintSatisfaction Satisfaction;
2695
2696 auto NestedReqWithDiag = [&C, this](Expr *E,
2697 ConstraintSatisfaction Satisfaction) {
2698 Satisfaction.IsSatisfied = false;
2699 SmallString<128> Entity;
2700 llvm::raw_svector_ostream OS(Entity);
2701 E->printPretty(OS, nullptr, SemaRef.getPrintingPolicy());
2702 return new (C) concepts::NestedRequirement(
2703 SemaRef.Context, C.backupStr(Entity), std::move(Satisfaction));
2704 };
2705
2706 if (Req->hasInvalidConstraint()) {
2707 if (AlwaysRebuild())
2708 return RebuildNestedRequirement(Req->getInvalidConstraintEntity(),
2710 return Req;
2711 }
2712
2713 if (!getEvaluateConstraints()) {
2714 ExprResult TransConstraint = TransformExpr(Req->getConstraintExpr());
2715 if (TransConstraint.isInvalid() || !TransConstraint.get())
2716 return nullptr;
2717 if (TransConstraint.get()->isInstantiationDependent())
2718 return new (SemaRef.Context)
2719 concepts::NestedRequirement(TransConstraint.get());
2720 ConstraintSatisfaction Satisfaction;
2721 return new (SemaRef.Context) concepts::NestedRequirement(
2722 SemaRef.Context, TransConstraint.get(), Satisfaction);
2723 }
2724
2725 bool Success;
2726 Expr *NewConstraint;
2727 {
2728 EnterExpressionEvaluationContext ContextRAII(
2730 Sema::InstantiatingTemplate ConstrInst(
2731 SemaRef, Constraint->getBeginLoc(), Req,
2732 Sema::InstantiatingTemplate::ConstraintsCheck(),
2733 Constraint->getSourceRange());
2734
2735 if (ConstrInst.isInvalid())
2736 return nullptr;
2737
2738 Success = !SemaRef.CheckConstraintSatisfaction(
2739 Req, AssociatedConstraint(Constraint, SemaRef.ArgPackSubstIndex),
2740 TemplateArgs, Constraint->getSourceRange(), Satisfaction,
2741 /*TopLevelConceptId=*/nullptr, &NewConstraint);
2742 }
2743
2744 if (!Success || Satisfaction.HasSubstitutionFailure())
2745 return NestedReqWithDiag(Constraint, Satisfaction);
2746
2747 // FIXME: const correctness
2748 // MLTAL might be dependent.
2749 if (!NewConstraint) {
2750 if (!Satisfaction.IsSatisfied)
2751 return NestedReqWithDiag(Constraint, Satisfaction);
2752
2753 NewConstraint = Constraint;
2754 }
2755 return new (C) concepts::NestedRequirement(C, NewConstraint, Satisfaction);
2756}
2757
2760 SourceLocation Loc,
2761 DeclarationName Entity,
2762 bool AllowDeducedTST) {
2763 assert(!CodeSynthesisContexts.empty() &&
2764 "Cannot perform an instantiation without some context on the "
2765 "instantiation stack");
2766
2767 if (!T->getType()->isInstantiationDependentType() &&
2768 !T->getType()->isVariablyModifiedType())
2769 return T;
2770
2771 TemplateInstantiator Instantiator(*this, Args, Loc, Entity);
2772 return AllowDeducedTST ? Instantiator.TransformTypeWithDeducedTST(T)
2773 : Instantiator.TransformType(T);
2774}
2775
2778 SourceLocation Loc,
2779 DeclarationName Entity) {
2780 assert(!CodeSynthesisContexts.empty() &&
2781 "Cannot perform an instantiation without some context on the "
2782 "instantiation stack");
2783
2784 if (TL.getType().isNull())
2785 return nullptr;
2786
2789 // FIXME: Make a copy of the TypeLoc data here, so that we can
2790 // return a new TypeSourceInfo. Inefficient!
2791 TypeLocBuilder TLB;
2792 TLB.pushFullCopy(TL);
2793 return TLB.getTypeSourceInfo(Context, TL.getType());
2794 }
2795
2796 TemplateInstantiator Instantiator(*this, Args, Loc, Entity);
2797 TypeLocBuilder TLB;
2798 TLB.reserve(TL.getFullDataSize());
2799 QualType Result = Instantiator.TransformType(TLB, TL);
2800 if (Result.isNull())
2801 return nullptr;
2802
2803 return TLB.getTypeSourceInfo(Context, Result);
2804}
2805
2806/// Deprecated form of the above.
2808 const MultiLevelTemplateArgumentList &TemplateArgs,
2809 SourceLocation Loc, DeclarationName Entity,
2810 bool *IsIncompleteSubstitution) {
2811 assert(!CodeSynthesisContexts.empty() &&
2812 "Cannot perform an instantiation without some context on the "
2813 "instantiation stack");
2814
2815 // If T is not a dependent type or a variably-modified type, there
2816 // is nothing to do.
2817 if (!T->isInstantiationDependentType() && !T->isVariablyModifiedType())
2818 return T;
2819
2820 TemplateInstantiator Instantiator(
2821 *this, TemplateArgs, Loc, Entity,
2822 /*BailOutOnIncomplete=*/IsIncompleteSubstitution != nullptr);
2823 QualType QT = Instantiator.TransformType(T);
2824 if (IsIncompleteSubstitution && Instantiator.getIsIncomplete())
2825 *IsIncompleteSubstitution = true;
2826 return QT;
2827}
2828
2830 if (T->getType()->isInstantiationDependentType() ||
2831 T->getType()->isVariablyModifiedType())
2832 return true;
2833
2834 TypeLoc TL = T->getTypeLoc().IgnoreParens();
2835 if (!TL.getAs<FunctionProtoTypeLoc>())
2836 return false;
2837
2839 for (ParmVarDecl *P : FP.getParams()) {
2840 // This must be synthesized from a typedef.
2841 if (!P) continue;
2842
2843 // If there are any parameters, a new TypeSourceInfo that refers to the
2844 // instantiated parameters must be built.
2845 return true;
2846 }
2847
2848 return false;
2849}
2850
2853 SourceLocation Loc,
2854 DeclarationName Entity,
2855 CXXRecordDecl *ThisContext,
2856 Qualifiers ThisTypeQuals,
2857 bool EvaluateConstraints) {
2858 assert(!CodeSynthesisContexts.empty() &&
2859 "Cannot perform an instantiation without some context on the "
2860 "instantiation stack");
2861
2863 return T;
2864
2865 TemplateInstantiator Instantiator(*this, Args, Loc, Entity);
2866 Instantiator.setEvaluateConstraints(EvaluateConstraints);
2867
2868 TypeLocBuilder TLB;
2869
2870 TypeLoc TL = T->getTypeLoc();
2871 TLB.reserve(TL.getFullDataSize());
2872
2874
2875 if (FunctionProtoTypeLoc Proto =
2877 // Instantiate the type, other than its exception specification. The
2878 // exception specification is instantiated in InitFunctionInstantiation
2879 // once we've built the FunctionDecl.
2880 // FIXME: Set the exception specification to EST_Uninstantiated here,
2881 // instead of rebuilding the function type again later.
2882 Result = Instantiator.TransformFunctionProtoType(
2883 TLB, Proto, ThisContext, ThisTypeQuals,
2885 bool &Changed) { return false; });
2886 } else {
2887 Result = Instantiator.TransformType(TLB, TL);
2888 }
2889 // When there are errors resolving types, clang may use IntTy as a fallback,
2890 // breaking our assumption that function declarations have function types.
2891 if (Result.isNull() || !Result->isFunctionType())
2892 return nullptr;
2893
2894 return TLB.getTypeSourceInfo(Context, Result);
2895}
2896
2899 SmallVectorImpl<QualType> &ExceptionStorage,
2900 const MultiLevelTemplateArgumentList &Args) {
2901 bool Changed = false;
2902 TemplateInstantiator Instantiator(*this, Args, Loc, DeclarationName());
2903 return Instantiator.TransformExceptionSpec(Loc, ESI, ExceptionStorage,
2904 Changed);
2905}
2906
2908 const MultiLevelTemplateArgumentList &Args) {
2911
2912 SmallVector<QualType, 4> ExceptionStorage;
2913 if (SubstExceptionSpec(New->getTypeSourceInfo()->getTypeLoc().getEndLoc(),
2914 ESI, ExceptionStorage, Args))
2915 // On error, recover by dropping the exception specification.
2916 ESI.Type = EST_None;
2917
2919}
2920
2921namespace {
2922
2923 struct GetContainedInventedTypeParmVisitor :
2924 public TypeVisitor<GetContainedInventedTypeParmVisitor,
2925 TemplateTypeParmDecl *> {
2926 using TypeVisitor<GetContainedInventedTypeParmVisitor,
2927 TemplateTypeParmDecl *>::Visit;
2928
2930 if (T.isNull())
2931 return nullptr;
2932 return Visit(T.getTypePtr());
2933 }
2934 // The deduced type itself.
2935 TemplateTypeParmDecl *VisitTemplateTypeParmType(
2936 const TemplateTypeParmType *T) {
2937 if (!T->getDecl() || !T->getDecl()->isImplicit())
2938 return nullptr;
2939 return T->getDecl();
2940 }
2941
2942 // Only these types can contain 'auto' types, and subsequently be replaced
2943 // by references to invented parameters.
2944
2945 TemplateTypeParmDecl *VisitPointerType(const PointerType *T) {
2946 return Visit(T->getPointeeType());
2947 }
2948
2949 TemplateTypeParmDecl *VisitBlockPointerType(const BlockPointerType *T) {
2950 return Visit(T->getPointeeType());
2951 }
2952
2953 TemplateTypeParmDecl *VisitReferenceType(const ReferenceType *T) {
2954 return Visit(T->getPointeeTypeAsWritten());
2955 }
2956
2957 TemplateTypeParmDecl *VisitMemberPointerType(const MemberPointerType *T) {
2958 return Visit(T->getPointeeType());
2959 }
2960
2961 TemplateTypeParmDecl *VisitArrayType(const ArrayType *T) {
2962 return Visit(T->getElementType());
2963 }
2964
2965 TemplateTypeParmDecl *VisitDependentSizedExtVectorType(
2966 const DependentSizedExtVectorType *T) {
2967 return Visit(T->getElementType());
2968 }
2969
2970 TemplateTypeParmDecl *VisitVectorType(const VectorType *T) {
2971 return Visit(T->getElementType());
2972 }
2973
2974 TemplateTypeParmDecl *VisitFunctionProtoType(const FunctionProtoType *T) {
2975 return VisitFunctionType(T);
2976 }
2977
2978 TemplateTypeParmDecl *VisitFunctionType(const FunctionType *T) {
2979 return Visit(T->getReturnType());
2980 }
2981
2982 TemplateTypeParmDecl *VisitParenType(const ParenType *T) {
2983 return Visit(T->getInnerType());
2984 }
2985
2986 TemplateTypeParmDecl *VisitAttributedType(const AttributedType *T) {
2987 return Visit(T->getModifiedType());
2988 }
2989
2990 TemplateTypeParmDecl *VisitMacroQualifiedType(const MacroQualifiedType *T) {
2991 return Visit(T->getUnderlyingType());
2992 }
2993
2994 TemplateTypeParmDecl *VisitAdjustedType(const AdjustedType *T) {
2995 return Visit(T->getOriginalType());
2996 }
2997
2998 TemplateTypeParmDecl *VisitPackExpansionType(const PackExpansionType *T) {
2999 return Visit(T->getPattern());
3000 }
3001 };
3002
3003} // namespace
3004
3006 TemplateTypeParmDecl *Inst, const TypeConstraint *TC,
3007 const MultiLevelTemplateArgumentList &TemplateArgs,
3008 bool EvaluateConstraints) {
3009 const ASTTemplateArgumentListInfo *TemplArgInfo =
3011
3012 if (!EvaluateConstraints && !inParameterMappingSubstitution()) {
3014 if (!Index)
3015 Index = SemaRef.ArgPackSubstIndex;
3018 return false;
3019 }
3020
3021 TemplateArgumentListInfo InstArgs;
3022
3023 if (TemplArgInfo) {
3024 InstArgs.setLAngleLoc(TemplArgInfo->LAngleLoc);
3025 InstArgs.setRAngleLoc(TemplArgInfo->RAngleLoc);
3026 if (SubstTemplateArguments(TemplArgInfo->arguments(), TemplateArgs,
3027 InstArgs))
3028 return true;
3029 }
3030 return AttachTypeConstraint(
3032 TC->getNamedConcept(),
3033 /*FoundDecl=*/TC->getConceptReference()->getFoundDecl(), &InstArgs, Inst,
3034 Inst->isParameterPack()
3036 ->getEllipsisLoc()
3037 : SourceLocation());
3038}
3039
3042 const MultiLevelTemplateArgumentList &TemplateArgs,
3043 int indexAdjustment, UnsignedOrNone NumExpansions,
3044 bool ExpectParameterPack, bool EvaluateConstraint) {
3045 TypeSourceInfo *OldTSI = OldParm->getTypeSourceInfo();
3046 TypeSourceInfo *NewTSI = nullptr;
3047
3048 TypeLoc OldTL = OldTSI->getTypeLoc();
3049 if (PackExpansionTypeLoc ExpansionTL = OldTL.getAs<PackExpansionTypeLoc>()) {
3050
3051 // We have a function parameter pack. Substitute into the pattern of the
3052 // expansion.
3053 NewTSI = SubstType(ExpansionTL.getPatternLoc(), TemplateArgs,
3054 OldParm->getLocation(), OldParm->getDeclName());
3055 if (!NewTSI)
3056 return nullptr;
3057
3058 if (NewTSI->getType()->containsUnexpandedParameterPack()) {
3059 // We still have unexpanded parameter packs, which means that
3060 // our function parameter is still a function parameter pack.
3061 // Therefore, make its type a pack expansion type.
3062 NewTSI = CheckPackExpansion(NewTSI, ExpansionTL.getEllipsisLoc(),
3063 NumExpansions);
3064 } else if (ExpectParameterPack) {
3065 // We expected to get a parameter pack but didn't (because the type
3066 // itself is not a pack expansion type), so complain. This can occur when
3067 // the substitution goes through an alias template that "loses" the
3068 // pack expansion.
3069 Diag(OldParm->getLocation(),
3070 diag::err_function_parameter_pack_without_parameter_packs)
3071 << NewTSI->getType();
3072 return nullptr;
3073 }
3074 } else {
3075 NewTSI = SubstType(OldTSI, TemplateArgs, OldParm->getLocation(),
3076 OldParm->getDeclName());
3077 }
3078
3079 if (!NewTSI)
3080 return nullptr;
3081
3082 if (NewTSI->getType()->isVoidType()) {
3083 Diag(OldParm->getLocation(), diag::err_param_with_void_type);
3084 return nullptr;
3085 }
3086
3087 // In abbreviated templates, TemplateTypeParmDecls with possible
3088 // TypeConstraints are created when the parameter list is originally parsed.
3089 // The TypeConstraints can therefore reference other functions parameters in
3090 // the abbreviated function template, which is why we must instantiate them
3091 // here, when the instantiated versions of those referenced parameters are in
3092 // scope.
3093 if (TemplateTypeParmDecl *TTP =
3094 GetContainedInventedTypeParmVisitor().Visit(OldTSI->getType())) {
3095 if (const TypeConstraint *TC = TTP->getTypeConstraint()) {
3096 auto *Inst = cast_or_null<TemplateTypeParmDecl>(
3097 FindInstantiatedDecl(TTP->getLocation(), TTP, TemplateArgs));
3098 // We will first get here when instantiating the abbreviated function
3099 // template's described function, but we might also get here later.
3100 // Make sure we do not instantiate the TypeConstraint more than once.
3101 if (Inst && !Inst->getTypeConstraint()) {
3102 if (SubstTypeConstraint(Inst, TC, TemplateArgs, EvaluateConstraint))
3103 return nullptr;
3104 }
3105 }
3106 }
3107
3108 ParmVarDecl *NewParm = CheckParameter(
3109 Context.getTranslationUnitDecl(), OldParm->getInnerLocStart(),
3110 OldParm->getLocation(), OldParm->getIdentifier(), NewTSI->getType(),
3111 NewTSI, OldParm->getStorageClass());
3112 if (!NewParm)
3113 return nullptr;
3114
3115 // Mark the (new) default argument as uninstantiated (if any).
3116 if (OldParm->hasUninstantiatedDefaultArg()) {
3117 Expr *Arg = OldParm->getUninstantiatedDefaultArg();
3118 NewParm->setUninstantiatedDefaultArg(Arg);
3119 } else if (OldParm->hasUnparsedDefaultArg()) {
3120 NewParm->setUnparsedDefaultArg();
3121 UnparsedDefaultArgInstantiations[OldParm].push_back(NewParm);
3122 } else if (Expr *Arg = OldParm->getDefaultArg()) {
3123 // Default arguments cannot be substituted until the declaration context
3124 // for the associated function or lambda capture class is available.
3125 // This is necessary for cases like the following where construction of
3126 // the lambda capture class for the outer lambda is dependent on the
3127 // parameter types but where the default argument is dependent on the
3128 // outer lambda's declaration context.
3129 // template <typename T>
3130 // auto f() {
3131 // return [](T = []{ return T{}; }()) { return 0; };
3132 // }
3133 NewParm->setUninstantiatedDefaultArg(Arg);
3134 }
3135
3139
3140 if (OldParm->isParameterPack() && !NewParm->isParameterPack()) {
3141 // Add the new parameter to the instantiated parameter pack.
3142 CurrentInstantiationScope->InstantiatedLocalPackArg(OldParm, NewParm);
3143 } else {
3144 // Introduce an Old -> New mapping
3145 CurrentInstantiationScope->InstantiatedLocal(OldParm, NewParm);
3146 }
3147
3148 // FIXME: OldParm may come from a FunctionProtoType, in which case CurContext
3149 // can be anything, is this right ?
3150 NewParm->setDeclContext(CurContext);
3151
3152 NewParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
3153 OldParm->getFunctionScopeIndex() + indexAdjustment);
3154
3155 InstantiateAttrs(TemplateArgs, OldParm, NewParm);
3156
3157 return NewParm;
3158}
3159
3162 const FunctionProtoType::ExtParameterInfo *ExtParamInfos,
3163 const MultiLevelTemplateArgumentList &TemplateArgs,
3164 SmallVectorImpl<QualType> &ParamTypes,
3166 ExtParameterInfoBuilder &ParamInfos) {
3167 assert(!CodeSynthesisContexts.empty() &&
3168 "Cannot perform an instantiation without some context on the "
3169 "instantiation stack");
3170
3171 TemplateInstantiator Instantiator(*this, TemplateArgs, Loc,
3172 DeclarationName());
3173 return Instantiator.TransformFunctionTypeParams(
3174 Loc, Params, nullptr, ExtParamInfos, ParamTypes, OutParams, ParamInfos);
3175}
3176
3178 SourceLocation Loc,
3179 ParmVarDecl *Param,
3180 const MultiLevelTemplateArgumentList &TemplateArgs,
3181 bool ForCallExpr) {
3182 FunctionDecl *FD = cast<FunctionDecl>(Param->getDeclContext());
3183 Expr *PatternExpr = Param->getUninstantiatedDefaultArg();
3184
3185 RecursiveInstGuard AlreadyInstantiating(
3187 if (AlreadyInstantiating) {
3188 Param->setInvalidDecl();
3189 return Diag(Param->getBeginLoc(), diag::err_recursive_default_argument)
3190 << FD << PatternExpr->getSourceRange();
3191 }
3192
3195 NonSFINAEContext _(*this);
3196 InstantiatingTemplate Inst(*this, Loc, Param, TemplateArgs.getInnermost());
3197 if (Inst.isInvalid())
3198 return true;
3199
3201 // C++ [dcl.fct.default]p5:
3202 // The names in the [default argument] expression are bound, and
3203 // the semantic constraints are checked, at the point where the
3204 // default argument expression appears.
3205 ContextRAII SavedContext(*this, FD);
3206 {
3207 std::optional<LocalInstantiationScope> LIS;
3208
3209 if (ForCallExpr) {
3210 // When instantiating a default argument due to use in a call expression,
3211 // an instantiation scope that includes the parameters of the callee is
3212 // required to satisfy references from the default argument. For example:
3213 // template<typename T> void f(T a, int = decltype(a)());
3214 // void g() { f(0); }
3215 LIS.emplace(*this);
3217 /*ForDefinition*/ false);
3218 if (addInstantiatedParametersToScope(FD, PatternFD, *LIS, TemplateArgs))
3219 return true;
3220 }
3221
3223 Result = SubstInitializer(PatternExpr, TemplateArgs,
3224 /*DirectInit*/ false);
3225 });
3226 }
3227 if (Result.isInvalid())
3228 return true;
3229
3230 if (ForCallExpr) {
3231 // Check the expression as an initializer for the parameter.
3232 InitializedEntity Entity
3235 Param->getLocation(),
3236 /*FIXME:EqualLoc*/ PatternExpr->getBeginLoc());
3237 Expr *ResultE = Result.getAs<Expr>();
3238
3239 InitializationSequence InitSeq(*this, Entity, Kind, ResultE);
3240 Result = InitSeq.Perform(*this, Entity, Kind, ResultE);
3241 if (Result.isInvalid())
3242 return true;
3243
3244 Result =
3245 ActOnFinishFullExpr(Result.getAs<Expr>(), Param->getOuterLocStart(),
3246 /*DiscardedValue*/ false);
3247 } else {
3248 // FIXME: Obtain the source location for the '=' token.
3249 SourceLocation EqualLoc = PatternExpr->getBeginLoc();
3250 Result = ConvertParamDefaultArgument(Param, Result.getAs<Expr>(), EqualLoc);
3251 }
3252 if (Result.isInvalid())
3253 return true;
3254
3255 // Remember the instantiated default argument.
3256 Param->setDefaultArg(Result.getAs<Expr>());
3257
3258 return false;
3259}
3260
3261// See TreeTransform::PreparePackForExpansion for the relevant comment.
3262// This function implements the same concept for base specifiers.
3263static bool
3265 const MultiLevelTemplateArgumentList &TemplateArgs,
3266 TypeSourceInfo *&Out, UnexpandedInfo &Info) {
3267 SourceRange BaseSourceRange = Base.getSourceRange();
3268 SourceLocation BaseEllipsisLoc = Base.getEllipsisLoc();
3269 Info.Ellipsis = Base.getEllipsisLoc();
3270 auto ComputeInfo = [&S, &TemplateArgs, BaseSourceRange, BaseEllipsisLoc](
3271 TypeSourceInfo *BaseTypeInfo,
3272 bool IsLateExpansionAttempt, UnexpandedInfo &Info) {
3273 // This is a pack expansion. See whether we should expand it now, or
3274 // wait until later.
3276 S.collectUnexpandedParameterPacks(BaseTypeInfo->getTypeLoc(), Unexpanded);
3277 if (IsLateExpansionAttempt) {
3278 // Request expansion only when there is an opportunity to expand a pack
3279 // that required a substituion first.
3280 bool SawPackTypes =
3281 llvm::any_of(Unexpanded, [](UnexpandedParameterPack P) {
3282 return P.first.dyn_cast<const SubstBuiltinTemplatePackType *>();
3283 });
3284 if (!SawPackTypes) {
3285 Info.Expand = false;
3286 return false;
3287 }
3288 }
3289
3290 // Determine whether the set of unexpanded parameter packs can and should be
3291 // expanded.
3292 Info.Expand = false;
3293 Info.RetainExpansion = false;
3294 Info.NumExpansions = std::nullopt;
3296 BaseEllipsisLoc, BaseSourceRange, Unexpanded, TemplateArgs,
3297 /*FailOnPackProducingTemplates=*/false, Info.Expand,
3298 Info.RetainExpansion, Info.NumExpansions);
3299 };
3300
3301 if (ComputeInfo(Base.getTypeSourceInfo(), false, Info))
3302 return true;
3303
3304 if (Info.Expand) {
3305 Out = Base.getTypeSourceInfo();
3306 return false;
3307 }
3308
3309 // The resulting base specifier will (still) be a pack expansion.
3310 {
3311 Sema::ArgPackSubstIndexRAII SubstIndex(S, std::nullopt);
3312 Out = S.SubstType(Base.getTypeSourceInfo(), TemplateArgs,
3313 BaseSourceRange.getBegin(), DeclarationName());
3314 }
3315 if (!Out->getType()->containsUnexpandedParameterPack())
3316 return false;
3317
3318 // Some packs will learn their length after substitution.
3319 // We may need to request their expansion.
3320 if (ComputeInfo(Out, /*IsLateExpansionAttempt=*/true, Info))
3321 return true;
3322 if (Info.Expand)
3323 Info.ExpandUnderForgetSubstitions = true;
3324 return false;
3325}
3326
3327bool
3329 CXXRecordDecl *Pattern,
3330 const MultiLevelTemplateArgumentList &TemplateArgs) {
3331 bool Invalid = false;
3332 SmallVector<CXXBaseSpecifier*, 4> InstantiatedBases;
3333 for (const auto &Base : Pattern->bases()) {
3334 if (!Base.getType()->isDependentType()) {
3335 if (const CXXRecordDecl *RD = Base.getType()->getAsCXXRecordDecl()) {
3336 if (RD->isInvalidDecl())
3337 Instantiation->setInvalidDecl();
3338 }
3339 InstantiatedBases.push_back(new (Context) CXXBaseSpecifier(Base));
3340 continue;
3341 }
3342
3343 SourceLocation EllipsisLoc;
3344 TypeSourceInfo *BaseTypeLoc = nullptr;
3345 if (Base.isPackExpansion()) {
3346 UnexpandedInfo Info;
3347 if (PreparePackForExpansion(*this, Base, TemplateArgs, BaseTypeLoc,
3348 Info)) {
3349 Invalid = true;
3350 continue;
3351 }
3352
3353 // If we should expand this pack expansion now, do so.
3355 const MultiLevelTemplateArgumentList *ArgsForSubst = &TemplateArgs;
3357 ArgsForSubst = &EmptyList;
3358
3359 if (Info.Expand) {
3360 for (unsigned I = 0; I != *Info.NumExpansions; ++I) {
3361 Sema::ArgPackSubstIndexRAII SubstIndex(*this, I);
3362
3363 TypeSourceInfo *Expanded =
3364 SubstType(BaseTypeLoc, *ArgsForSubst,
3365 Base.getSourceRange().getBegin(), DeclarationName());
3366 if (!Expanded) {
3367 Invalid = true;
3368 continue;
3369 }
3370
3371 if (CXXBaseSpecifier *InstantiatedBase = CheckBaseSpecifier(
3372 Instantiation, Base.getSourceRange(), Base.isVirtual(),
3373 Base.getAccessSpecifierAsWritten(), Expanded,
3374 SourceLocation()))
3375 InstantiatedBases.push_back(InstantiatedBase);
3376 else
3377 Invalid = true;
3378 }
3379
3380 continue;
3381 }
3382
3383 // The resulting base specifier will (still) be a pack expansion.
3384 EllipsisLoc = Base.getEllipsisLoc();
3385 Sema::ArgPackSubstIndexRAII SubstIndex(*this, std::nullopt);
3386 BaseTypeLoc =
3387 SubstType(BaseTypeLoc, *ArgsForSubst,
3388 Base.getSourceRange().getBegin(), DeclarationName());
3389 } else {
3390 BaseTypeLoc = SubstType(Base.getTypeSourceInfo(),
3391 TemplateArgs,
3392 Base.getSourceRange().getBegin(),
3393 DeclarationName());
3394 }
3395
3396 if (!BaseTypeLoc) {
3397 Invalid = true;
3398 continue;
3399 }
3400
3401 if (CXXBaseSpecifier *InstantiatedBase
3402 = CheckBaseSpecifier(Instantiation,
3403 Base.getSourceRange(),
3404 Base.isVirtual(),
3405 Base.getAccessSpecifierAsWritten(),
3406 BaseTypeLoc,
3407 EllipsisLoc))
3408 InstantiatedBases.push_back(InstantiatedBase);
3409 else
3410 Invalid = true;
3411 }
3412
3413 if (!Invalid && AttachBaseSpecifiers(Instantiation, InstantiatedBases))
3414 Invalid = true;
3415
3416 return Invalid;
3417}
3418
3419// Defined via #include from SemaTemplateInstantiateDecl.cpp
3420namespace clang {
3421 namespace sema {
3423 const MultiLevelTemplateArgumentList &TemplateArgs);
3425 const Attr *At, ASTContext &C, Sema &S,
3426 const MultiLevelTemplateArgumentList &TemplateArgs);
3427 }
3428}
3429
3430bool Sema::InstantiateClass(SourceLocation PointOfInstantiation,
3431 CXXRecordDecl *Instantiation,
3432 CXXRecordDecl *Pattern,
3433 const MultiLevelTemplateArgumentList &TemplateArgs,
3434 TemplateSpecializationKind TSK, bool Complain) {
3435#ifndef NDEBUG
3436 RecursiveInstGuard AlreadyInstantiating(*this, Instantiation,
3438 assert(!AlreadyInstantiating && "should have been caught by caller");
3439#endif
3440
3441 return InstantiateClassImpl(PointOfInstantiation, Instantiation, Pattern,
3442 TemplateArgs, TSK, Complain);
3443}
3444
3445bool Sema::InstantiateClassImpl(
3446 SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation,
3447 CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs,
3448 TemplateSpecializationKind TSK, bool Complain) {
3449
3450 CXXRecordDecl *PatternDef
3451 = cast_or_null<CXXRecordDecl>(Pattern->getDefinition());
3452 if (DiagnoseUninstantiableTemplate(PointOfInstantiation, Instantiation,
3453 Instantiation->getInstantiatedFromMemberClass(),
3454 Pattern, PatternDef, TSK, Complain))
3455 return true;
3456
3457 llvm::TimeTraceScope TimeScope("InstantiateClass", [&]() {
3458 llvm::TimeTraceMetadata M;
3459 llvm::raw_string_ostream OS(M.Detail);
3460 Instantiation->getNameForDiagnostic(OS, getPrintingPolicy(),
3461 /*Qualified=*/true);
3462 if (llvm::isTimeTraceVerbose()) {
3463 auto Loc = SourceMgr.getExpansionLoc(Instantiation->getLocation());
3464 M.File = SourceMgr.getFilename(Loc);
3465 M.Line = SourceMgr.getExpansionLineNumber(Loc);
3466 }
3467 return M;
3468 });
3469
3470 Pattern = PatternDef;
3471
3472 // Record the point of instantiation.
3473 if (MemberSpecializationInfo *MSInfo
3474 = Instantiation->getMemberSpecializationInfo()) {
3475 MSInfo->setTemplateSpecializationKind(TSK);
3476 MSInfo->setPointOfInstantiation(PointOfInstantiation);
3477 } else if (ClassTemplateSpecializationDecl *Spec
3478 = dyn_cast<ClassTemplateSpecializationDecl>(Instantiation)) {
3479 Spec->setTemplateSpecializationKind(TSK);
3480 Spec->setPointOfInstantiation(PointOfInstantiation);
3481 }
3482
3483 NonSFINAEContext _(*this);
3484 InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation);
3485 if (Inst.isInvalid())
3486 return true;
3487 PrettyDeclStackTraceEntry CrashInfo(Context, Instantiation, SourceLocation(),
3488 "instantiating class definition");
3489
3490 // Enter the scope of this instantiation. We don't use
3491 // PushDeclContext because we don't have a scope.
3492 ContextRAII SavedContext(*this, Instantiation);
3493 EnterExpressionEvaluationContext EvalContext(
3494 *this, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
3495
3496 // If this is an instantiation of a local class, merge this local
3497 // instantiation scope with the enclosing scope. Otherwise, every
3498 // instantiation of a class has its own local instantiation scope.
3499 bool MergeWithParentScope = !Instantiation->isDefinedOutsideFunctionOrMethod();
3500 LocalInstantiationScope Scope(*this, MergeWithParentScope);
3501
3502 // Some class state isn't processed immediately but delayed till class
3503 // instantiation completes. We may not be ready to handle any delayed state
3504 // already on the stack as it might correspond to a different class, so save
3505 // it now and put it back later.
3506 SavePendingParsedClassStateRAII SavedPendingParsedClassState(*this);
3507
3508 // Pull attributes from the pattern onto the instantiation.
3509 InstantiateAttrs(TemplateArgs, Pattern, Instantiation);
3510
3511 // Start the definition of this instantiation.
3512 Instantiation->startDefinition();
3513
3514 // The instantiation is visible here, even if it was first declared in an
3515 // unimported module.
3516 Instantiation->setVisibleDespiteOwningModule();
3517
3518 // FIXME: This loses the as-written tag kind for an explicit instantiation.
3519 Instantiation->setTagKind(Pattern->getTagKind());
3520
3521 // Do substitution on the base class specifiers.
3522 if (SubstBaseSpecifiers(Instantiation, Pattern, TemplateArgs))
3523 Instantiation->setInvalidDecl();
3524
3525 TemplateDeclInstantiator Instantiator(*this, Instantiation, TemplateArgs);
3526 Instantiator.setEvaluateConstraints(false);
3527 SmallVector<Decl*, 4> Fields;
3528 // Delay instantiation of late parsed attributes.
3529 LateInstantiatedAttrVec LateAttrs;
3530 Instantiator.enableLateAttributeInstantiation(&LateAttrs);
3531
3532 bool MightHaveConstexprVirtualFunctions = false;
3533 for (auto *Member : Pattern->decls()) {
3534 // Don't instantiate members not belonging in this semantic context.
3535 // e.g. for:
3536 // @code
3537 // template <int i> class A {
3538 // class B *g;
3539 // };
3540 // @endcode
3541 // 'class B' has the template as lexical context but semantically it is
3542 // introduced in namespace scope.
3543 if (Member->getDeclContext() != Pattern)
3544 continue;
3545
3546 // BlockDecls can appear in a default-member-initializer. They must be the
3547 // child of a BlockExpr, so we only know how to instantiate them from there.
3548 // Similarly, lambda closure types are recreated when instantiating the
3549 // corresponding LambdaExpr.
3550 if (isa<BlockDecl>(Member) ||
3552 continue;
3553
3554 if (Member->isInvalidDecl()) {
3555 Instantiation->setInvalidDecl();
3556 continue;
3557 }
3558
3559 Decl *NewMember = Instantiator.Visit(Member);
3560 if (NewMember) {
3561 if (FieldDecl *Field = dyn_cast<FieldDecl>(NewMember)) {
3562 Fields.push_back(Field);
3563 } else if (EnumDecl *Enum = dyn_cast<EnumDecl>(NewMember)) {
3564 // C++11 [temp.inst]p1: The implicit instantiation of a class template
3565 // specialization causes the implicit instantiation of the definitions
3566 // of unscoped member enumerations.
3567 // Record a point of instantiation for this implicit instantiation.
3568 if (TSK == TSK_ImplicitInstantiation && !Enum->isScoped() &&
3569 Enum->isCompleteDefinition()) {
3570 MemberSpecializationInfo *MSInfo =Enum->getMemberSpecializationInfo();
3571 assert(MSInfo && "no spec info for member enum specialization");
3573 MSInfo->setPointOfInstantiation(PointOfInstantiation);
3574 }
3575 } else if (StaticAssertDecl *SA = dyn_cast<StaticAssertDecl>(NewMember)) {
3576 if (SA->isFailed()) {
3577 // A static_assert failed. Bail out; instantiating this
3578 // class is probably not meaningful.
3579 Instantiation->setInvalidDecl();
3580 break;
3581 }
3582 } else if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewMember)) {
3583 if (MD->isConstexpr() && !MD->getFriendObjectKind() &&
3584 (MD->isVirtualAsWritten() || Instantiation->getNumBases()))
3585 MightHaveConstexprVirtualFunctions = true;
3586 }
3587
3588 if (NewMember->isInvalidDecl())
3589 Instantiation->setInvalidDecl();
3590 } else {
3591 // FIXME: Eventually, a NULL return will mean that one of the
3592 // instantiations was a semantic disaster, and we'll want to mark the
3593 // declaration invalid.
3594 // For now, we expect to skip some members that we can't yet handle.
3595 }
3596 }
3597
3598 // Finish checking fields.
3599 ActOnFields(nullptr, Instantiation->getLocation(), Instantiation, Fields,
3600 SourceLocation(), SourceLocation(), ParsedAttributesView());
3601 CheckCompletedCXXClass(nullptr, Instantiation);
3602
3603 // Default arguments are parsed, if not instantiated. We can go instantiate
3604 // default arg exprs for default constructors if necessary now. Unless we're
3605 // parsing a class, in which case wait until that's finished.
3606 if (ParsingClassDepth == 0)
3607 ActOnFinishCXXNonNestedClass();
3608
3609 // Instantiate late parsed attributes, and attach them to their decls.
3610 // See Sema::InstantiateAttrs
3611 for (LateInstantiatedAttrVec::iterator I = LateAttrs.begin(),
3612 E = LateAttrs.end(); I != E; ++I) {
3613 assert(CurrentInstantiationScope == Instantiator.getStartingScope());
3614 CurrentInstantiationScope = I->Scope;
3615
3616 // Allow 'this' within late-parsed attributes.
3617 auto *ND = cast<NamedDecl>(I->NewDecl);
3618 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext());
3619 CXXThisScopeRAII ThisScope(*this, ThisContext, Qualifiers(),
3620 ND->isCXXInstanceMember());
3621
3622 Attr *NewAttr =
3623 instantiateTemplateAttribute(I->TmplAttr, Context, *this, TemplateArgs);
3624 if (NewAttr)
3625 I->NewDecl->addAttr(NewAttr);
3627 Instantiator.getStartingScope());
3628 }
3629 Instantiator.disableLateAttributeInstantiation();
3630 LateAttrs.clear();
3631
3632 ActOnFinishDelayedMemberInitializers(Instantiation);
3633
3634 // FIXME: We should do something similar for explicit instantiations so they
3635 // end up in the right module.
3636 if (TSK == TSK_ImplicitInstantiation) {
3637 Instantiation->setLocation(Pattern->getLocation());
3638 Instantiation->setLocStart(Pattern->getInnerLocStart());
3639 Instantiation->setBraceRange(Pattern->getBraceRange());
3640 }
3641
3642 if (!Instantiation->isInvalidDecl()) {
3643 // Perform any dependent diagnostics from the pattern.
3644 if (Pattern->isDependentContext())
3645 PerformDependentDiagnostics(Pattern, TemplateArgs);
3646
3647 // Instantiate any out-of-line class template partial
3648 // specializations now.
3650 P = Instantiator.delayed_partial_spec_begin(),
3651 PEnd = Instantiator.delayed_partial_spec_end();
3652 P != PEnd; ++P) {
3653 if (!Instantiator.InstantiateClassTemplatePartialSpecialization(
3654 P->first, P->second)) {
3655 Instantiation->setInvalidDecl();
3656 break;
3657 }
3658 }
3659
3660 // Instantiate any out-of-line variable template partial
3661 // specializations now.
3663 P = Instantiator.delayed_var_partial_spec_begin(),
3664 PEnd = Instantiator.delayed_var_partial_spec_end();
3665 P != PEnd; ++P) {
3666 if (!Instantiator.InstantiateVarTemplatePartialSpecialization(
3667 P->first, P->second)) {
3668 Instantiation->setInvalidDecl();
3669 break;
3670 }
3671 }
3672 }
3673
3674 // Exit the scope of this instantiation.
3675 SavedContext.pop();
3676
3677 if (!Instantiation->isInvalidDecl()) {
3678 // Always emit the vtable for an explicit instantiation definition
3679 // of a polymorphic class template specialization. Otherwise, eagerly
3680 // instantiate only constexpr virtual functions in preparation for their use
3681 // in constant evaluation.
3683 MarkVTableUsed(PointOfInstantiation, Instantiation, true);
3684 else if (MightHaveConstexprVirtualFunctions)
3685 MarkVirtualMembersReferenced(PointOfInstantiation, Instantiation,
3686 /*ConstexprOnly*/ true);
3687 }
3688
3689 Consumer.HandleTagDeclDefinition(Instantiation);
3690
3691 return Instantiation->isInvalidDecl();
3692}
3693
3694bool Sema::InstantiateEnum(SourceLocation PointOfInstantiation,
3695 EnumDecl *Instantiation, EnumDecl *Pattern,
3696 const MultiLevelTemplateArgumentList &TemplateArgs,
3698#ifndef NDEBUG
3699 RecursiveInstGuard AlreadyInstantiating(*this, Instantiation,
3701 assert(!AlreadyInstantiating && "should have been caught by caller");
3702#endif
3703
3704 EnumDecl *PatternDef = Pattern->getDefinition();
3705 if (DiagnoseUninstantiableTemplate(PointOfInstantiation, Instantiation,
3706 Instantiation->getInstantiatedFromMemberEnum(),
3707 Pattern, PatternDef, TSK,/*Complain*/true))
3708 return true;
3709 Pattern = PatternDef;
3710
3711 // Record the point of instantiation.
3712 if (MemberSpecializationInfo *MSInfo
3713 = Instantiation->getMemberSpecializationInfo()) {
3714 MSInfo->setTemplateSpecializationKind(TSK);
3715 MSInfo->setPointOfInstantiation(PointOfInstantiation);
3716 }
3717
3718 NonSFINAEContext _(*this);
3719 InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation);
3720 if (Inst.isInvalid())
3721 return true;
3722 PrettyDeclStackTraceEntry CrashInfo(Context, Instantiation, SourceLocation(),
3723 "instantiating enum definition");
3724
3725 // The instantiation is visible here, even if it was first declared in an
3726 // unimported module.
3727 Instantiation->setVisibleDespiteOwningModule();
3728
3729 // Enter the scope of this instantiation. We don't use
3730 // PushDeclContext because we don't have a scope.
3731 ContextRAII SavedContext(*this, Instantiation);
3734
3735 LocalInstantiationScope Scope(*this, /*MergeWithParentScope*/true);
3736
3737 // Pull attributes from the pattern onto the instantiation.
3738 InstantiateAttrs(TemplateArgs, Pattern, Instantiation);
3739
3740 TemplateDeclInstantiator Instantiator(*this, Instantiation, TemplateArgs);
3741 Instantiator.InstantiateEnumDefinition(Instantiation, Pattern);
3742
3743 // Exit the scope of this instantiation.
3744 SavedContext.pop();
3745
3746 return Instantiation->isInvalidDecl();
3747}
3748
3750 SourceLocation PointOfInstantiation, FieldDecl *Instantiation,
3751 FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs) {
3752 // If there is no initializer, we don't need to do anything.
3753 if (!Pattern->hasInClassInitializer())
3754 return false;
3755
3756 assert(Instantiation->getInClassInitStyle() ==
3757 Pattern->getInClassInitStyle() &&
3758 "pattern and instantiation disagree about init style");
3759
3760 RecursiveInstGuard AlreadyInstantiating(*this, Instantiation,
3762 if (AlreadyInstantiating)
3763 // Error out if we hit an instantiation cycle for this initializer.
3764 return Diag(PointOfInstantiation,
3765 diag::err_default_member_initializer_cycle)
3766 << Instantiation;
3767
3768 // Error out if we haven't parsed the initializer of the pattern yet because
3769 // we are waiting for the closing brace of the outer class.
3770 Expr *OldInit = Pattern->getInClassInitializer();
3771 if (!OldInit) {
3772 RecordDecl *PatternRD = Pattern->getParent();
3773 RecordDecl *OutermostClass = PatternRD->getOuterLexicalRecordContext();
3774 Diag(PointOfInstantiation,
3775 diag::err_default_member_initializer_not_yet_parsed)
3776 << OutermostClass << Pattern;
3777 Diag(Pattern->getEndLoc(),
3778 diag::note_default_member_initializer_not_yet_parsed);
3779 Instantiation->setInvalidDecl();
3780 return true;
3781 }
3782
3783 NonSFINAEContext _(*this);
3784 InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation);
3785 if (Inst.isInvalid())
3786 return true;
3787 PrettyDeclStackTraceEntry CrashInfo(Context, Instantiation, SourceLocation(),
3788 "instantiating default member init");
3789
3790 // Enter the scope of this instantiation. We don't use PushDeclContext because
3791 // we don't have a scope.
3792 ContextRAII SavedContext(*this, Instantiation->getParent());
3795 ExprEvalContexts.back().DelayedDefaultInitializationContext = {
3796 PointOfInstantiation, Instantiation, CurContext};
3797
3798 LocalInstantiationScope Scope(*this, true);
3799
3800 // Instantiate the initializer.
3802 CXXThisScopeRAII ThisScope(*this, Instantiation->getParent(), Qualifiers());
3803
3804 ExprResult NewInit = SubstInitializer(OldInit, TemplateArgs,
3805 /*CXXDirectInit=*/false);
3806 Expr *Init = NewInit.get();
3807 assert((!Init || !isa<ParenListExpr>(Init)) && "call-style init in class");
3809 Instantiation, Init ? Init->getBeginLoc() : SourceLocation(), Init);
3810
3811 if (auto *L = getASTMutationListener())
3812 L->DefaultMemberInitializerInstantiated(Instantiation);
3813
3814 // Return true if the in-class initializer is still missing.
3815 return !Instantiation->getInClassInitializer();
3816}
3817
3818namespace {
3819 /// A partial specialization whose template arguments have matched
3820 /// a given template-id.
3821 struct PartialSpecMatchResult {
3824 };
3825}
3826
3828 SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec) {
3829 if (ClassTemplateSpec->getTemplateSpecializationKind() ==
3831 return true;
3832
3834 ClassTemplateDecl *CTD = ClassTemplateSpec->getSpecializedTemplate();
3835 CTD->getPartialSpecializations(PartialSpecs);
3836 for (ClassTemplatePartialSpecializationDecl *CTPSD : PartialSpecs) {
3837 // C++ [temp.spec.partial.member]p2:
3838 // If the primary member template is explicitly specialized for a given
3839 // (implicit) specialization of the enclosing class template, the partial
3840 // specializations of the member template are ignored for this
3841 // specialization of the enclosing class template. If a partial
3842 // specialization of the member template is explicitly specialized for a
3843 // given (implicit) specialization of the enclosing class template, the
3844 // primary member template and its other partial specializations are still
3845 // considered for this specialization of the enclosing class template.
3847 !CTPSD->getMostRecentDecl()->isMemberSpecialization())
3848 continue;
3849
3850 TemplateDeductionInfo Info(Loc);
3851 if (DeduceTemplateArguments(CTPSD,
3852 ClassTemplateSpec->getTemplateArgs().asArray(),
3854 return true;
3855 }
3856
3857 return false;
3858}
3859
3860/// Get the instantiation pattern to use to instantiate the definition of a
3861/// given ClassTemplateSpecializationDecl (either the pattern of the primary
3862/// template or of a partial specialization).
3864 Sema &S, SourceLocation PointOfInstantiation,
3865 ClassTemplateSpecializationDecl *ClassTemplateSpec,
3866 TemplateSpecializationKind TSK, bool PrimaryStrictPackMatch) {
3867 std::optional<Sema::NonSFINAEContext> NSC(S);
3868 Sema::InstantiatingTemplate Inst(S, PointOfInstantiation, ClassTemplateSpec);
3869 if (Inst.isInvalid())
3870 return {/*Invalid=*/true};
3871
3872 llvm::PointerUnion<ClassTemplateDecl *,
3874 Specialized = ClassTemplateSpec->getSpecializedTemplateOrPartial();
3876 // Find best matching specialization.
3877 ClassTemplateDecl *Template = ClassTemplateSpec->getSpecializedTemplate();
3878
3879 // C++ [temp.class.spec.match]p1:
3880 // When a class template is used in a context that requires an
3881 // instantiation of the class, it is necessary to determine
3882 // whether the instantiation is to be generated using the primary
3883 // template or one of the partial specializations. This is done by
3884 // matching the template arguments of the class template
3885 // specialization with the template argument lists of the partial
3886 // specializations.
3887 typedef PartialSpecMatchResult MatchResult;
3888 SmallVector<MatchResult, 4> Matched, ExtraMatched;
3890 Template->getPartialSpecializations(PartialSpecs);
3891 TemplateSpecCandidateSet FailedCandidates(PointOfInstantiation);
3892 for (ClassTemplatePartialSpecializationDecl *Partial : PartialSpecs) {
3893 // C++ [temp.spec.partial.member]p2:
3894 // If the primary member template is explicitly specialized for a given
3895 // (implicit) specialization of the enclosing class template, the
3896 // partial specializations of the member template are ignored for this
3897 // specialization of the enclosing class template. If a partial
3898 // specialization of the member template is explicitly specialized for a
3899 // given (implicit) specialization of the enclosing class template, the
3900 // primary member template and its other partial specializations are
3901 // still considered for this specialization of the enclosing class
3902 // template.
3903 if (Template->getMostRecentDecl()->isMemberSpecialization() &&
3904 !Partial->getMostRecentDecl()->isMemberSpecialization())
3905 continue;
3906
3907 TemplateDeductionInfo Info(FailedCandidates.getLocation());
3909 Partial, ClassTemplateSpec->getTemplateArgs().asArray(), Info);
3911 // Store the failed-deduction information for use in diagnostics, later.
3912 // TODO: Actually use the failed-deduction info?
3913 FailedCandidates.addCandidate().set(
3915 MakeDeductionFailureInfo(S.Context, Result, Info));
3916 (void)Result;
3917 } else {
3918 auto &List = Info.hasStrictPackMatch() ? ExtraMatched : Matched;
3919 List.push_back(MatchResult{Partial, Info.takeCanonical()});
3920 }
3921 }
3922 if (Matched.empty() && PrimaryStrictPackMatch)
3923 Matched = std::move(ExtraMatched);
3924
3925 // If we're dealing with a member template where the template parameters
3926 // have been instantiated, this provides the original template parameters
3927 // from which the member template's parameters were instantiated.
3928
3929 if (Matched.size() >= 1) {
3930 SmallVectorImpl<MatchResult>::iterator Best = Matched.begin();
3931 if (Matched.size() == 1) {
3932 // -- If exactly one matching specialization is found, the
3933 // instantiation is generated from that specialization.
3934 // We don't need to do anything for this.
3935 } else {
3936 // -- If more than one matching specialization is found, the
3937 // partial order rules (14.5.4.2) are used to determine
3938 // whether one of the specializations is more specialized
3939 // than the others. If none of the specializations is more
3940 // specialized than all of the other matching
3941 // specializations, then the use of the class template is
3942 // ambiguous and the program is ill-formed.
3944 PEnd = Matched.end();
3945 P != PEnd; ++P) {
3947 P->Partial, Best->Partial, PointOfInstantiation) ==
3948 P->Partial)
3949 Best = P;
3950 }
3951
3952 // Determine if the best partial specialization is more specialized than
3953 // the others.
3954 bool Ambiguous = false;
3955 for (SmallVectorImpl<MatchResult>::iterator P = Matched.begin(),
3956 PEnd = Matched.end();
3957 P != PEnd; ++P) {
3958 if (P != Best && S.getMoreSpecializedPartialSpecialization(
3959 P->Partial, Best->Partial,
3960 PointOfInstantiation) != Best->Partial) {
3961 Ambiguous = true;
3962 break;
3963 }
3964 }
3965
3966 if (Ambiguous) {
3967 // Partial ordering did not produce a clear winner. Complain.
3968 Inst.Clear();
3969 NSC.reset();
3970 S.Diag(PointOfInstantiation,
3971 diag::err_partial_spec_ordering_ambiguous)
3972 << ClassTemplateSpec;
3973
3974 // Print the matching partial specializations.
3975 for (SmallVectorImpl<MatchResult>::iterator P = Matched.begin(),
3976 PEnd = Matched.end();
3977 P != PEnd; ++P)
3978 S.Diag(P->Partial->getLocation(), diag::note_partial_spec_match)
3980 P->Partial->getTemplateParameters(), *P->Args);
3981
3982 return {/*Invalid=*/true};
3983 }
3984 }
3985
3986 ClassTemplateSpec->setInstantiationOf(Best->Partial, Best->Args);
3987 } else {
3988 // -- If no matches are found, the instantiation is generated
3989 // from the primary template.
3990 }
3991 }
3992
3993 CXXRecordDecl *Pattern = nullptr;
3994 Specialized = ClassTemplateSpec->getSpecializedTemplateOrPartial();
3995 if (auto *PartialSpec =
3996 Specialized.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) {
3997 // Instantiate using the best class template partial specialization.
3998 while (PartialSpec->getInstantiatedFromMember()) {
3999 // If we've found an explicit specialization of this class template,
4000 // stop here and use that as the pattern.
4001 if (PartialSpec->isMemberSpecialization())
4002 break;
4003
4004 PartialSpec = PartialSpec->getInstantiatedFromMember();
4005 }
4006 Pattern = PartialSpec;
4007 } else {
4008 ClassTemplateDecl *Template = ClassTemplateSpec->getSpecializedTemplate();
4009 while (Template->getInstantiatedFromMemberTemplate()) {
4010 // If we've found an explicit specialization of this class template,
4011 // stop here and use that as the pattern.
4012 if (Template->isMemberSpecialization())
4013 break;
4014
4015 Template = Template->getInstantiatedFromMemberTemplate();
4016 }
4017 Pattern = Template->getTemplatedDecl();
4018 }
4019
4020 return Pattern;
4021}
4022
4024 SourceLocation PointOfInstantiation,
4025 ClassTemplateSpecializationDecl *ClassTemplateSpec,
4026 TemplateSpecializationKind TSK, bool Complain,
4027 bool PrimaryStrictPackMatch) {
4028 // Perform the actual instantiation on the canonical declaration.
4029 ClassTemplateSpec = cast<ClassTemplateSpecializationDecl>(
4030 ClassTemplateSpec->getCanonicalDecl());
4031 if (ClassTemplateSpec->isInvalidDecl())
4032 return true;
4033
4034 Sema::RecursiveInstGuard AlreadyInstantiating(
4035 *this, ClassTemplateSpec, Sema::RecursiveInstGuard::Kind::Template);
4036 if (AlreadyInstantiating)
4037 return false;
4038
4039 bool HadAvaibilityWarning =
4040 ShouldDiagnoseAvailabilityOfDecl(ClassTemplateSpec, nullptr, nullptr)
4041 .first != AR_Available;
4042
4044 getPatternForClassTemplateSpecialization(*this, PointOfInstantiation,
4045 ClassTemplateSpec, TSK,
4046 PrimaryStrictPackMatch);
4047
4048 if (!Pattern.isUsable())
4049 return Pattern.isInvalid();
4050
4051 bool Err = InstantiateClassImpl(
4052 PointOfInstantiation, ClassTemplateSpec, Pattern.get(),
4053 getTemplateInstantiationArgs(ClassTemplateSpec), TSK, Complain);
4054
4055 // If we haven't already warn on avaibility, consider the avaibility
4056 // attributes of the partial specialization.
4057 // Note that - because we need to have deduced the partial specialization -
4058 // We can only emit these warnings when the specialization is instantiated.
4059 if (!Err && !HadAvaibilityWarning) {
4060 assert(ClassTemplateSpec->getTemplateSpecializationKind() !=
4062 DiagnoseAvailabilityOfDecl(ClassTemplateSpec, PointOfInstantiation);
4063 }
4064 return Err;
4065}
4066
4067void
4069 CXXRecordDecl *Instantiation,
4070 const MultiLevelTemplateArgumentList &TemplateArgs,
4072 // FIXME: We need to notify the ASTMutationListener that we did all of these
4073 // things, in case we have an explicit instantiation definition in a PCM, a
4074 // module, or preamble, and the declaration is in an imported AST.
4075 assert(
4078 (TSK == TSK_ImplicitInstantiation && Instantiation->isLocalClass())) &&
4079 "Unexpected template specialization kind!");
4080 for (auto *D : Instantiation->decls()) {
4081 bool SuppressNew = false;
4082 if (auto *Function = dyn_cast<FunctionDecl>(D)) {
4083 if (FunctionDecl *Pattern =
4084 Function->getInstantiatedFromMemberFunction()) {
4085
4086 if (Function->getTrailingRequiresClause()) {
4087 ConstraintSatisfaction Satisfaction;
4088 if (CheckFunctionConstraints(Function, Satisfaction) ||
4089 !Satisfaction.IsSatisfied) {
4090 continue;
4091 }
4092 }
4093
4094 if (Function->hasAttr<ExcludeFromExplicitInstantiationAttr>())
4095 continue;
4096
4098 Function->getTemplateSpecializationKind();
4099 if (PrevTSK == TSK_ExplicitSpecialization)
4100 continue;
4101
4103 PointOfInstantiation, TSK, Function, PrevTSK,
4104 Function->getPointOfInstantiation(), SuppressNew) ||
4105 SuppressNew)
4106 continue;
4107
4108 // C++11 [temp.explicit]p8:
4109 // An explicit instantiation definition that names a class template
4110 // specialization explicitly instantiates the class template
4111 // specialization and is only an explicit instantiation definition
4112 // of members whose definition is visible at the point of
4113 // instantiation.
4114 if (TSK == TSK_ExplicitInstantiationDefinition && !Pattern->isDefined())
4115 continue;
4116
4117 Function->setTemplateSpecializationKind(TSK, PointOfInstantiation);
4118
4119 if (Function->isDefined()) {
4120 // Let the ASTConsumer know that this function has been explicitly
4121 // instantiated now, and its linkage might have changed.
4122 Consumer.HandleTopLevelDecl(DeclGroupRef(Function));
4123 } else if (TSK == TSK_ExplicitInstantiationDefinition) {
4124 InstantiateFunctionDefinition(PointOfInstantiation, Function);
4125 } else if (TSK == TSK_ImplicitInstantiation) {
4127 std::make_pair(Function, PointOfInstantiation));
4128 }
4129 }
4130 } else if (auto *Var = dyn_cast<VarDecl>(D)) {
4132 continue;
4133
4134 if (Var->isStaticDataMember()) {
4135 if (Var->hasAttr<ExcludeFromExplicitInstantiationAttr>())
4136 continue;
4137
4139 assert(MSInfo && "No member specialization information?");
4140 if (MSInfo->getTemplateSpecializationKind()
4142 continue;
4143
4144 if (CheckSpecializationInstantiationRedecl(PointOfInstantiation, TSK,
4145 Var,
4147 MSInfo->getPointOfInstantiation(),
4148 SuppressNew) ||
4149 SuppressNew)
4150 continue;
4151
4153 // C++0x [temp.explicit]p8:
4154 // An explicit instantiation definition that names a class template
4155 // specialization explicitly instantiates the class template
4156 // specialization and is only an explicit instantiation definition
4157 // of members whose definition is visible at the point of
4158 // instantiation.
4160 continue;
4161
4162 Var->setTemplateSpecializationKind(TSK, PointOfInstantiation);
4163 InstantiateVariableDefinition(PointOfInstantiation, Var);
4164 } else {
4165 Var->setTemplateSpecializationKind(TSK, PointOfInstantiation);
4166 }
4167 }
4168 } else if (auto *Record = dyn_cast<CXXRecordDecl>(D)) {
4169 if (Record->hasAttr<ExcludeFromExplicitInstantiationAttr>())
4170 continue;
4171
4172 // Always skip the injected-class-name, along with any
4173 // redeclarations of nested classes, since both would cause us
4174 // to try to instantiate the members of a class twice.
4175 // Skip closure types; they'll get instantiated when we instantiate
4176 // the corresponding lambda-expression.
4177 if (Record->isInjectedClassName() || Record->getPreviousDecl() ||
4178 Record->isLambda())
4179 continue;
4180
4181 MemberSpecializationInfo *MSInfo = Record->getMemberSpecializationInfo();
4182 assert(MSInfo && "No member specialization information?");
4183
4184 if (MSInfo->getTemplateSpecializationKind()
4186 continue;
4187
4188 if (Context.getTargetInfo().getTriple().isOSWindows() &&
4190 // On Windows, explicit instantiation decl of the outer class doesn't
4191 // affect the inner class. Typically extern template declarations are
4192 // used in combination with dll import/export annotations, but those
4193 // are not propagated from the outer class templates to inner classes.
4194 // Therefore, do not instantiate inner classes on this platform, so
4195 // that users don't end up with undefined symbols during linking.
4196 continue;
4197 }
4198
4199 if (CheckSpecializationInstantiationRedecl(PointOfInstantiation, TSK,
4200 Record,
4202 MSInfo->getPointOfInstantiation(),
4203 SuppressNew) ||
4204 SuppressNew)
4205 continue;
4206
4207 CXXRecordDecl *Pattern = Record->getInstantiatedFromMemberClass();
4208 assert(Pattern && "Missing instantiated-from-template information");
4209
4210 if (!Record->getDefinition()) {
4211 if (!Pattern->getDefinition()) {
4212 // C++0x [temp.explicit]p8:
4213 // An explicit instantiation definition that names a class template
4214 // specialization explicitly instantiates the class template
4215 // specialization and is only an explicit instantiation definition
4216 // of members whose definition is visible at the point of
4217 // instantiation.
4219 MSInfo->setTemplateSpecializationKind(TSK);
4220 MSInfo->setPointOfInstantiation(PointOfInstantiation);
4221 }
4222
4223 continue;
4224 }
4225
4226 InstantiateClass(PointOfInstantiation, Record, Pattern,
4227 TemplateArgs,
4228 TSK);
4229 } else {
4231 Record->getTemplateSpecializationKind() ==
4233 Record->setTemplateSpecializationKind(TSK);
4234 MarkVTableUsed(PointOfInstantiation, Record, true);
4235 }
4236 }
4237
4238 Pattern = cast_or_null<CXXRecordDecl>(Record->getDefinition());
4239 if (Pattern)
4240 InstantiateClassMembers(PointOfInstantiation, Pattern, TemplateArgs,
4241 TSK);
4242 } else if (auto *Enum = dyn_cast<EnumDecl>(D)) {
4243 MemberSpecializationInfo *MSInfo = Enum->getMemberSpecializationInfo();
4244 assert(MSInfo && "No member specialization information?");
4245
4246 if (MSInfo->getTemplateSpecializationKind()
4248 continue;
4249
4251 PointOfInstantiation, TSK, Enum,
4253 MSInfo->getPointOfInstantiation(), SuppressNew) ||
4254 SuppressNew)
4255 continue;
4256
4257 if (Enum->getDefinition())
4258 continue;
4259
4260 EnumDecl *Pattern = Enum->getTemplateInstantiationPattern();
4261 assert(Pattern && "Missing instantiated-from-template information");
4262
4264 if (!Pattern->getDefinition())
4265 continue;
4266
4267 InstantiateEnum(PointOfInstantiation, Enum, Pattern, TemplateArgs, TSK);
4268 } else {
4269 MSInfo->setTemplateSpecializationKind(TSK);
4270 MSInfo->setPointOfInstantiation(PointOfInstantiation);
4271 }
4272 } else if (auto *Field = dyn_cast<FieldDecl>(D)) {
4273 // No need to instantiate in-class initializers during explicit
4274 // instantiation.
4275 if (Field->hasInClassInitializer() && TSK == TSK_ImplicitInstantiation) {
4276 // Handle local classes which could have substituted template params.
4277 CXXRecordDecl *ClassPattern =
4278 Instantiation->isLocalClass()
4279 ? Instantiation->getInstantiatedFromMemberClass()
4280 : Instantiation->getTemplateInstantiationPattern();
4281
4283 ClassPattern->lookup(Field->getDeclName());
4284 FieldDecl *Pattern = Lookup.find_first<FieldDecl>();
4285 assert(Pattern);
4286 InstantiateInClassInitializer(PointOfInstantiation, Field, Pattern,
4287 TemplateArgs);
4288 }
4289 }
4290 }
4291}
4292
4293void
4295 SourceLocation PointOfInstantiation,
4296 ClassTemplateSpecializationDecl *ClassTemplateSpec,
4298 // C++0x [temp.explicit]p7:
4299 // An explicit instantiation that names a class template
4300 // specialization is an explicit instantion of the same kind
4301 // (declaration or definition) of each of its members (not
4302 // including members inherited from base classes) that has not
4303 // been previously explicitly specialized in the translation unit
4304 // containing the explicit instantiation, except as described
4305 // below.
4306 InstantiateClassMembers(PointOfInstantiation, ClassTemplateSpec,
4307 getTemplateInstantiationArgs(ClassTemplateSpec),
4308 TSK);
4309}
4310
4313 if (!S)
4314 return S;
4315
4316 TemplateInstantiator Instantiator(*this, TemplateArgs,
4318 DeclarationName());
4319 return Instantiator.TransformStmt(S);
4320}
4321
4323 const TemplateArgumentLoc &Input,
4324 const MultiLevelTemplateArgumentList &TemplateArgs,
4326 const DeclarationName &Entity) {
4327 TemplateInstantiator Instantiator(*this, TemplateArgs, Loc, Entity);
4328 return Instantiator.TransformTemplateArgument(Input, Output);
4329}
4330
4333 const MultiLevelTemplateArgumentList &TemplateArgs,
4335 TemplateInstantiator Instantiator(*this, TemplateArgs, SourceLocation(),
4336 DeclarationName());
4337 return Instantiator.TransformTemplateArguments(Args.begin(), Args.end(), Out);
4338}
4339
4342 const MultiLevelTemplateArgumentList &TemplateArgs,
4343 TemplateArgumentListInfo &Out, bool BuildPackExpansionTypes) {
4344 TemplateInstantiator Instantiator(
4345 TemplateInstantiator::ForParameterMappingSubstitution, *this, BaseLoc,
4346 TemplateArgs, BuildPackExpansionTypes);
4347 return Instantiator.TransformTemplateArguments(Args.begin(), Args.end(), Out);
4348}
4349
4352 if (!E)
4353 return E;
4354
4355 TemplateInstantiator Instantiator(*this, TemplateArgs,
4357 DeclarationName());
4358 return Instantiator.TransformExpr(E);
4359}
4360
4363 const MultiLevelTemplateArgumentList &TemplateArgs) {
4364 if (!E)
4365 return E;
4366
4367 TemplateInstantiator Instantiator(*this, TemplateArgs, SourceLocation(),
4368 DeclarationName());
4369 return Instantiator.TransformAddressOfOperand(E);
4370}
4371
4374 const MultiLevelTemplateArgumentList &TemplateArgs) {
4375 // FIXME: should call SubstExpr directly if this function is equivalent or
4376 // should it be different?
4377 return SubstExpr(E, TemplateArgs);
4378}
4379
4381 Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs) {
4382 if (!E)
4383 return E;
4384
4385 TemplateInstantiator Instantiator(*this, TemplateArgs, SourceLocation(),
4386 DeclarationName());
4387 Instantiator.setEvaluateConstraints(false);
4388 return Instantiator.TransformExpr(E);
4389}
4390
4392 const ConceptSpecializationExpr *CSE, const Expr *ConstraintExpr,
4393 const MultiLevelTemplateArgumentList &MLTAL) {
4394 TemplateInstantiator Instantiator(*this, MLTAL, SourceLocation(),
4395 DeclarationName());
4396 const ASTTemplateArgumentListInfo *ArgsAsWritten =
4398 TemplateArgumentListInfo SubstArgs(ArgsAsWritten->getLAngleLoc(),
4399 ArgsAsWritten->getRAngleLoc());
4400
4401 NonSFINAEContext _(*this);
4403 *this, ArgsAsWritten->arguments().front().getSourceRange().getBegin(),
4405 CSE->getNamedConcept(),
4406 ArgsAsWritten->arguments().front().getSourceRange());
4407
4408 if (Inst.isInvalid())
4409 return ExprError();
4410
4411 if (Instantiator.TransformConceptTemplateArguments(
4412 ArgsAsWritten->getTemplateArgs(),
4413 ArgsAsWritten->getTemplateArgs() +
4414 ArgsAsWritten->getNumTemplateArgs(),
4415 SubstArgs))
4416 return true;
4417
4418 llvm::SmallVector<TemplateArgument, 4> NewArgList = llvm::map_to_vector(
4419 SubstArgs.arguments(),
4420 [](const TemplateArgumentLoc &Loc) { return Loc.getArgument(); });
4421
4422 MultiLevelTemplateArgumentList MLTALForConstraint =
4424 CSE->getNamedConcept(),
4426 /*Final=*/false,
4427 /*Innermost=*/NewArgList,
4428 /*RelativeToPrimary=*/true,
4429 /*Pattern=*/nullptr,
4430 /*ForConstraintInstantiation=*/true);
4431
4432 // Rebuild a constraint, only substituting non-dependent concept names
4433 // and nothing else.
4434 // Given C<SomeType, SomeValue, SomeConceptName, SomeDependentConceptName>.
4435 // only SomeConceptName is substituted, in the constraint expression of C.
4436 struct ConstraintExprTransformer : TreeTransform<ConstraintExprTransformer> {
4439
4440 ConstraintExprTransformer(Sema &SemaRef,
4442 : TreeTransform(SemaRef), MLTAL(MLTAL) {}
4443
4444 ExprResult TransformExpr(Expr *E) {
4445 if (!E)
4446 return E;
4447 switch (E->getStmtClass()) {
4448 case Stmt::BinaryOperatorClass:
4449 case Stmt::ConceptSpecializationExprClass:
4450 case Stmt::ParenExprClass:
4451 case Stmt::UnresolvedLookupExprClass:
4452 return Base::TransformExpr(E);
4453 default:
4454 break;
4455 }
4456 return E;
4457 }
4458
4459 // Rebuild both branches of a conjunction / disjunction
4460 // even if there is a substitution failure in one of
4461 // the branch.
4462 ExprResult TransformBinaryOperator(BinaryOperator *E) {
4463 if (!(E->getOpcode() == BinaryOperatorKind::BO_LAnd ||
4464 E->getOpcode() == BinaryOperatorKind::BO_LOr))
4465 return E;
4466
4467 ExprResult LHS = TransformExpr(E->getLHS());
4468 ExprResult RHS = TransformExpr(E->getRHS());
4469
4470 if (LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
4471 return E;
4472
4473 return BinaryOperator::Create(SemaRef.Context, LHS.get(), RHS.get(),
4474 E->getOpcode(), SemaRef.Context.BoolTy,
4477 }
4478
4479 bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
4480 TemplateArgumentLoc &Output,
4481 bool Uneval = false) {
4483 return Base::TransformTemplateArgument(Input, Output, Uneval);
4484
4485 Output = Input;
4486 return false;
4487 }
4488
4489 ExprResult TransformUnresolvedLookupExpr(UnresolvedLookupExpr *E,
4490 bool IsAddressOfOperand = false) {
4491 if (E->isConceptReference()) {
4492 ExprResult Res = SemaRef.SubstExpr(E, MLTAL);
4493 return Res;
4494 }
4495 return E;
4496 }
4497 };
4498
4499 ConstraintExprTransformer Transformer(*this, MLTALForConstraint);
4500 ExprResult Res =
4501 Transformer.TransformExpr(const_cast<Expr *>(ConstraintExpr));
4502 return Res;
4503}
4504
4506 const MultiLevelTemplateArgumentList &TemplateArgs,
4507 bool CXXDirectInit) {
4508 TemplateInstantiator Instantiator(*this, TemplateArgs, SourceLocation(),
4509 DeclarationName());
4510 return Instantiator.TransformInitializer(Init, CXXDirectInit);
4511}
4512
4513bool Sema::SubstExprs(ArrayRef<Expr *> Exprs, bool IsCall,
4514 const MultiLevelTemplateArgumentList &TemplateArgs,
4515 SmallVectorImpl<Expr *> &Outputs) {
4516 if (Exprs.empty())
4517 return false;
4518
4519 TemplateInstantiator Instantiator(*this, TemplateArgs,
4521 DeclarationName());
4522 return Instantiator.TransformExprs(Exprs.data(), Exprs.size(),
4523 IsCall, Outputs);
4524}
4525
4528 const MultiLevelTemplateArgumentList &TemplateArgs) {
4529 if (!NNS)
4530 return NestedNameSpecifierLoc();
4531
4532 TemplateInstantiator Instantiator(*this, TemplateArgs, NNS.getBeginLoc(),
4533 DeclarationName());
4534 return Instantiator.TransformNestedNameSpecifierLoc(NNS);
4535}
4536
4539 const MultiLevelTemplateArgumentList &TemplateArgs) {
4540 TemplateInstantiator Instantiator(*this, TemplateArgs, NameInfo.getLoc(),
4541 NameInfo.getName());
4542 return Instantiator.TransformDeclarationNameInfo(NameInfo);
4543}
4544
4547 NestedNameSpecifierLoc &QualifierLoc, TemplateName Name,
4548 SourceLocation NameLoc,
4549 const MultiLevelTemplateArgumentList &TemplateArgs) {
4550 TemplateInstantiator Instantiator(*this, TemplateArgs, NameLoc,
4551 DeclarationName());
4552 return Instantiator.TransformTemplateName(QualifierLoc, TemplateKWLoc, Name,
4553 NameLoc);
4554}
4555
4556static const Decl *getCanonicalParmVarDecl(const Decl *D) {
4557 // When storing ParmVarDecls in the local instantiation scope, we always
4558 // want to use the ParmVarDecl from the canonical function declaration,
4559 // since the map is then valid for any redeclaration or definition of that
4560 // function.
4561 if (const ParmVarDecl *PV = dyn_cast<ParmVarDecl>(D)) {
4562 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(PV->getDeclContext())) {
4563 unsigned i = PV->getFunctionScopeIndex();
4564 // This parameter might be from a freestanding function type within the
4565 // function and isn't necessarily referring to one of FD's parameters.
4566 if (i < FD->getNumParams() && FD->getParamDecl(i) == PV)
4567 return FD->getCanonicalDecl()->getParamDecl(i);
4568 }
4569 }
4570 return D;
4571}
4572
4573llvm::PointerUnion<Decl *, LocalInstantiationScope::DeclArgumentPack *> *
4576 for (LocalInstantiationScope *Current = this; Current;
4577 Current = Current->Outer) {
4578
4579 // Check if we found something within this scope.
4580 const Decl *CheckD = D;
4581 do {
4582 LocalDeclsMap::iterator Found = Current->LocalDecls.find(CheckD);
4583 if (Found != Current->LocalDecls.end())
4584 return &Found->second;
4585
4586 // If this is a tag declaration, it's possible that we need to look for
4587 // a previous declaration.
4588 if (const TagDecl *Tag = dyn_cast<TagDecl>(CheckD))
4589 CheckD = Tag->getPreviousDecl();
4590 else
4591 CheckD = nullptr;
4592 } while (CheckD);
4593
4594 // If we aren't combined with our outer scope, we're done.
4595 if (!Current->CombineWithOuterScope)
4596 break;
4597 }
4598
4599 return nullptr;
4600}
4601
4602llvm::PointerUnion<Decl *, LocalInstantiationScope::DeclArgumentPack *> *
4605 if (Result)
4606 return Result;
4607 // If we're performing a partial substitution during template argument
4608 // deduction, we may not have values for template parameters yet.
4611 return nullptr;
4612
4613 // Local types referenced prior to definition may require instantiation.
4614 if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D))
4615 if (RD->isLocalClass())
4616 return nullptr;
4617
4618 // Enumeration types referenced prior to definition may appear as a result of
4619 // error recovery.
4620 if (isa<EnumDecl>(D))
4621 return nullptr;
4622
4623 // Materialized typedefs/type alias for implicit deduction guides may require
4624 // instantiation.
4625 if (isa<TypedefNameDecl>(D) &&
4627 return nullptr;
4628
4629 // If we didn't find the decl, then we either have a sema bug, or we have a
4630 // forward reference to a label declaration. Return null to indicate that
4631 // we have an uninstantiated label.
4632 assert(isa<LabelDecl>(D) && "declaration not instantiated in this scope");
4633 return nullptr;
4634}
4635
4638 llvm::PointerUnion<Decl *, DeclArgumentPack *> &Stored = LocalDecls[D];
4639 if (Stored.isNull()) {
4640#ifndef NDEBUG
4641 // It should not be present in any surrounding scope either.
4642 LocalInstantiationScope *Current = this;
4643 while (Current->CombineWithOuterScope && Current->Outer) {
4644 Current = Current->Outer;
4645 assert(!Current->LocalDecls.contains(D) &&
4646 "Instantiated local in inner and outer scopes");
4647 }
4648#endif
4649 Stored = Inst;
4650 } else if (DeclArgumentPack *Pack = dyn_cast<DeclArgumentPack *>(Stored)) {
4651 Pack->push_back(cast<ValueDecl>(Inst));
4652 } else {
4653 assert(cast<Decl *>(Stored) == Inst && "Already instantiated this local");
4654 }
4655}
4656
4658 VarDecl *Inst) {
4660 DeclArgumentPack *Pack = cast<DeclArgumentPack *>(LocalDecls[D]);
4661 Pack->push_back(Inst);
4662}
4663
4665#ifndef NDEBUG
4666 // This should be the first time we've been told about this decl.
4667 for (LocalInstantiationScope *Current = this;
4668 Current && Current->CombineWithOuterScope; Current = Current->Outer)
4669 assert(!Current->LocalDecls.contains(D) &&
4670 "Creating local pack after instantiation of local");
4671#endif
4672
4674 llvm::PointerUnion<Decl *, DeclArgumentPack *> &Stored = LocalDecls[D];
4676 Stored = Pack;
4677 ArgumentPacks.push_back(Pack);
4678}
4679
4681 for (DeclArgumentPack *Pack : ArgumentPacks)
4682 if (llvm::is_contained(*Pack, D))
4683 return true;
4684 return false;
4685}
4686
4688 const TemplateArgument *ExplicitArgs,
4689 unsigned NumExplicitArgs) {
4690 assert((!PartiallySubstitutedPack || PartiallySubstitutedPack == Pack) &&
4691 "Already have a partially-substituted pack");
4692 assert((!PartiallySubstitutedPack
4693 || NumArgsInPartiallySubstitutedPack == NumExplicitArgs) &&
4694 "Wrong number of arguments in partially-substituted pack");
4695 PartiallySubstitutedPack = Pack;
4696 ArgsInPartiallySubstitutedPack = ExplicitArgs;
4697 NumArgsInPartiallySubstitutedPack = NumExplicitArgs;
4698}
4699
4701 const TemplateArgument **ExplicitArgs,
4702 unsigned *NumExplicitArgs) const {
4703 if (ExplicitArgs)
4704 *ExplicitArgs = nullptr;
4705 if (NumExplicitArgs)
4706 *NumExplicitArgs = 0;
4707
4708 for (const LocalInstantiationScope *Current = this; Current;
4709 Current = Current->Outer) {
4710 if (Current->PartiallySubstitutedPack) {
4711 if (ExplicitArgs)
4712 *ExplicitArgs = Current->ArgsInPartiallySubstitutedPack;
4713 if (NumExplicitArgs)
4714 *NumExplicitArgs = Current->NumArgsInPartiallySubstitutedPack;
4715
4716 return Current->PartiallySubstitutedPack;
4717 }
4718
4719 if (!Current->CombineWithOuterScope)
4720 break;
4721 }
4722
4723 return nullptr;
4724}
This file provides AST data structures related to concepts.
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
Defines Expressions and AST nodes for C++2a concepts.
FormatToken * Next
The next token in the unwrapped line.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
Definition MachO.h:31
static TemplateDeductionResult DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams, ArrayRef< TemplateArgument > Ps, ArrayRef< TemplateArgument > As, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool NumberOfArgumentsMustMatch, bool PartialOrdering, PackFold PackFold, bool *HasDeducedAnyParam)
static bool PreparePackForExpansion(Sema &S, const CXXBaseSpecifier &Base, const MultiLevelTemplateArgumentList &TemplateArgs, TypeSourceInfo *&Out, UnexpandedInfo &Info)
static const Decl * getCanonicalParmVarDecl(const Decl *D)
static ActionResult< CXXRecordDecl * > getPatternForClassTemplateSpecialization(Sema &S, SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK, bool PrimaryStrictPackMatch)
Get the instantiation pattern to use to instantiate the definition of a given ClassTemplateSpecializa...
static bool NeedsInstantiationAsFunctionType(TypeSourceInfo *T)
static concepts::Requirement::SubstitutionDiagnostic * createSubstDiag(Sema &S, TemplateDeductionInfo &Info, Sema::EntityPrinter Printer)
static std::string convertCallArgsToString(Sema &S, llvm::ArrayRef< const Expr * > Args)
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:220
const clang::PrintingPolicy & getPrintingPolicy() const
Definition ASTContext.h:825
The result of parsing/analyzing an expression, statement etc.
Definition Ownership.h:154
PtrTy get() const
Definition Ownership.h:171
bool isInvalid() const
Definition Ownership.h:167
bool isUsable() const
Definition Ownership.h:169
Attr - This represents one attribute.
Definition Attr.h:45
A builtin binary operation expression such as "x + y" or "x <= y".
Definition Expr.h:3972
Expr * getLHS() const
Definition Expr.h:4022
SourceLocation getOperatorLoc() const
Definition Expr.h:4014
Expr * getRHS() const
Definition Expr.h:4024
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
Definition Expr.cpp:4977
Opcode getOpcode() const
Definition Expr.h:4017
Represents a base class of a C++ class.
Definition DeclCXX.h:146
SourceLocation getUsedLocation() const
Retrieve the location where this default argument was actually used.
Definition ExprCXX.h:1344
const ParmVarDecl * getParam() const
Definition ExprCXX.h:1312
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
Decl * getLambdaContextDecl() const
Retrieve the declaration that provides additional context for a lambda, when the normal declaration c...
Definition DeclCXX.cpp:1828
const FunctionDecl * isLocalClass() const
If the class is a local class [class.local], returns the enclosing function declaration.
Definition DeclCXX.h:1554
CXXRecordDecl * getInstantiatedFromMemberClass() const
If this record is an instantiation of a member class, retrieves the member class from which it was in...
Definition DeclCXX.cpp:2020
base_class_range bases()
Definition DeclCXX.h:608
bool isLambda() const
Determine whether this class describes a lambda function object.
Definition DeclCXX.h:1018
CXXRecordDecl * getDefinition() const
Definition DeclCXX.h:548
unsigned getNumBases() const
Retrieves the number of base classes of this class.
Definition DeclCXX.h:602
const CXXRecordDecl * getTemplateInstantiationPattern() const
Retrieve the record declaration from which this record could be instantiated.
Definition DeclCXX.cpp:2075
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
Definition DeclCXX.cpp:2050
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
Definition DeclCXX.cpp:2042
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
Definition DeclCXX.cpp:2027
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
Definition DeclCXX.cpp:1736
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition DeclCXX.h:522
Declaration of a class template.
ClassTemplateDecl * getMostRecentDecl()
llvm::FoldingSetVector< ClassTemplatePartialSpecializationDecl > & getPartialSpecializations() const
Retrieve the set of partial specializations of this class template.
Represents a class template specialization, which refers to a class template with a given set of temp...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
bool isClassScopeExplicitSpecialization() const
Is this an explicit specialization at class scope (within the class that owns the primary template)?
llvm::PointerUnion< ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl * > getSpecializedTemplateOrPartial() const
Retrieve the class template or class template partial specialization which was specialized by this.
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the class template specialization.
const TemplateArgumentList & getTemplateInstantiationArgs() const
Retrieve the set of template arguments that should be used to instantiate members of the class templa...
void setInstantiationOf(ClassTemplatePartialSpecializationDecl *PartialSpec, const TemplateArgumentList *TemplateArgs)
Note that this class template specialization is actually an instantiation of the given class template...
NamedDecl * getFoundDecl() const
Definition ASTConcept.h:197
Represents the specialization of a concept - evaluates to a prvalue of type bool.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
ConceptDecl * getNamedConcept() const
const TypeClass * getTypePtr() const
Definition TypeLoc.h:433
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Definition ASTConcept.h:47
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1449
bool isFileContext() const
Definition DeclBase.h:2180
DeclContextLookupResult lookup_result
Definition DeclBase.h:2577
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
RecordDecl * getOuterLexicalRecordContext()
Retrieve the outermost lexically enclosing record context.
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Definition DeclBase.h:2373
ValueDecl * getDecl()
Definition Expr.h:1338
SourceLocation getLocation() const
Definition Expr.h:1346
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Definition DeclBase.h:1061
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
Definition DeclBase.cpp:285
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
Definition DeclBase.h:1226
bool isParameterPack() const
Whether this declaration is a parameter pack.
Definition DeclBase.cpp:266
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Definition DeclBase.cpp:178
bool isFileContextDecl() const
Definition DeclBase.cpp:454
static Decl * castFromDeclContext(const DeclContext *)
unsigned getTemplateDepth() const
Determine the number of levels of template parameter surrounding this declaration.
Definition DeclBase.cpp:320
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
bool isInvalidDecl() const
Definition DeclBase.h:588
SourceLocation getLocation() const
Definition DeclBase.h:439
void setLocation(SourceLocation L)
Definition DeclBase.h:440
bool isDefinedOutsideFunctionOrMethod() const
isDefinedOutsideFunctionOrMethod - This predicate returns true if this scoped decl is defined outside...
Definition DeclBase.h:949
DeclContext * getDeclContext()
Definition DeclBase.h:448
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
Definition DeclBase.cpp:382
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition DeclBase.h:918
bool hasAttr() const
Definition DeclBase.h:577
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
Definition DeclBase.h:870
The name of a declaration.
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
Definition Decl.h:822
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
Definition Decl.h:837
TypeSourceInfo * getTypeSourceInfo() const
Definition Decl.h:809
RAII object that enters a new expression evaluation context.
Represents an enum.
Definition Decl.h:4007
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
Definition Decl.h:4270
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
Definition Decl.cpp:5084
EnumDecl * getDefinition() const
Definition Decl.h:4110
This represents one expression.
Definition Expr.h:112
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Definition Expr.h:194
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
Definition Expr.h:223
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:273
QualType getType() const
Definition Expr.h:144
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
Definition Expr.h:523
ExprDependence getDependence() const
Definition Expr.h:164
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Definition Decl.h:3160
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
Definition Decl.cpp:4717
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
Definition Decl.h:3340
InClassInitStyle getInClassInitStyle() const
Get the kind of (C++11) default member initializer that this field has.
Definition Decl.h:3334
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
Definition Decl.h:3396
Represents a function declaration or definition.
Definition Decl.h:2000
ArrayRef< ParmVarDecl * > parameters() const
Definition Decl.h:2774
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
Definition Decl.cpp:4256
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
Definition Decl.cpp:4305
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
Definition Decl.h:2470
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
Definition Decl.h:2344
static FunctionParmPackExpr * Create(const ASTContext &Context, QualType T, ValueDecl *ParamPack, SourceLocation NameLoc, ArrayRef< ValueDecl * > Params)
Definition ExprCXX.cpp:1816
ValueDecl * getExpansion(unsigned I) const
Get an expansion of the parameter pack by index.
Definition ExprCXX.h:4882
ValueDecl *const * iterator
Iterators over the parameters which the parameter pack expanded into.
Definition ExprCXX.h:4874
ValueDecl * getParameterPack() const
Get the parameter pack which this expression refers to.
Definition ExprCXX.h:4867
iterator end() const
Definition ExprCXX.h:4876
unsigned getNumExpansions() const
Get the number of parameters in this parameter pack.
Definition ExprCXX.h:4879
SourceLocation getParameterPackLocation() const
Get the location of the parameter pack.
Definition ExprCXX.h:4870
iterator begin() const
Definition ExprCXX.h:4875
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5254
QualType desugar() const
Definition TypeBase.h:5835
ExtProtoInfo getExtProtoInfo() const
Definition TypeBase.h:5543
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
ArrayRef< ParmVarDecl * > getParams() const
Definition TypeLoc.h:1678
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
Definition TypeBase.h:4476
QualType getReturnType() const
Definition TypeBase.h:4790
ArrayRef< TemplateArgument > getTemplateArguments() const
const TypeClass * getTypePtr() const
Definition TypeLoc.h:526
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
Describes an entity that is being initialized.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
Definition ExprCXX.h:1968
A stack-allocated class that identifies which local variable declaration instantiations are present i...
Definition Template.h:369
LocalInstantiationScope(Sema &SemaRef, bool CombineWithOuterScope=false, bool InstantiatingLambdaOrBlock=false)
Definition Template.h:437
void SetPartiallySubstitutedPack(NamedDecl *Pack, const TemplateArgument *ExplicitArgs, unsigned NumExplicitArgs)
Note that the given parameter pack has been partially substituted via explicit specification of templ...
NamedDecl * getPartiallySubstitutedPack(const TemplateArgument **ExplicitArgs=nullptr, unsigned *NumExplicitArgs=nullptr) const
Retrieve the partially-substitued template parameter pack.
bool isLocalPackExpansion(const Decl *D)
Determine whether D is a pack expansion created in this scope.
SmallVector< ValueDecl *, 4 > DeclArgumentPack
A set of declarations.
Definition Template.h:372
llvm::PointerUnion< Decl *, DeclArgumentPack * > * getInstantiationOfIfExists(const Decl *D)
Similar to findInstantiationOf(), but it wouldn't assert if the instantiation was not found within th...
static void deleteScopes(LocalInstantiationScope *Scope, LocalInstantiationScope *Outermost)
deletes the given scope, and all outer scopes, down to the given outermost scope.
Definition Template.h:509
void InstantiatedLocal(const Decl *D, Decl *Inst)
void InstantiatedLocalPackArg(const Decl *D, VarDecl *Inst)
bool isLambdaOrBlock() const
Determine whether this scope is for instantiating a lambda or block.
Definition Template.h:575
llvm::PointerUnion< Decl *, DeclArgumentPack * > * findInstantiationOf(const Decl *D)
Find the instantiation of the declaration D within the current instantiation scope.
Provides information a specialization of a member of a class template, which may be a member function...
void setTemplateSpecializationKind(TemplateSpecializationKind TSK)
Set the template specialization kind.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template specialization this is.
SourceLocation getPointOfInstantiation() const
Retrieve the first point of instantiation of this member.
void setPointOfInstantiation(SourceLocation POI)
Set the first point of instantiation.
Describes a module or submodule.
Definition Module.h:144
Data structure that captures multiple levels of template argument lists for use in template instantia...
Definition Template.h:76
bool hasTemplateArgument(unsigned Depth, unsigned Index) const
Determine whether there is a non-NULL template argument at the given depth and index.
Definition Template.h:175
const ArgList & getInnermost() const
Retrieve the innermost template argument list.
Definition Template.h:269
std::pair< Decl *, bool > getAssociatedDecl(unsigned Depth) const
A template-like entity which owns the whole pattern being substituted.
Definition Template.h:164
unsigned getNumLevels() const
Determine the number of levels in this template argument list.
Definition Template.h:123
unsigned getNumSubstitutedLevels() const
Determine the number of substituted levels in this template argument list.
Definition Template.h:129
unsigned getNewDepth(unsigned OldDepth) const
Determine how many of the OldDepth outermost template parameter lists would be removed by substitutin...
Definition Template.h:145
void setArgument(unsigned Depth, unsigned Index, TemplateArgument Arg)
Clear out a specific template argument.
Definition Template.h:197
bool isRewrite() const
Determine whether we are rewriting template parameters rather than substituting for them.
Definition Template.h:117
This represents a decl that may have a name.
Definition Decl.h:274
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition Decl.h:295
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Definition Decl.h:301
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:340
virtual void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const
Appends a human-readable name for this declaration into the given stream.
Definition Decl.cpp:1837
virtual void printName(raw_ostream &OS, const PrintingPolicy &Policy) const
Pretty-print the unqualified name of this declaration.
Definition Decl.cpp:1672
A C++ nested-name-specifier augmented with source location information.
SourceLocation getBeginLoc() const
Retrieve the location of the beginning of this nested-name-specifier.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
bool isParameterPack() const
Whether this parameter is a non-type template parameter pack.
unsigned getDepth() const
Get the nesting depth of the template parameter.
SourceLocation getEllipsisLoc() const
Definition TypeLoc.h:2600
TypeLoc getPatternLoc() const
Definition TypeLoc.h:2616
Represents a parameter to a function.
Definition Decl.h:1790
unsigned getFunctionScopeIndex() const
Returns the index of this parameter in its prototype or method scope.
Definition Decl.h:1850
SourceLocation getExplicitObjectParamThisLoc() const
Definition Decl.h:1886
void setUnparsedDefaultArg()
Specify that this parameter has an unparsed default argument.
Definition Decl.h:1931
bool hasUnparsedDefaultArg() const
Determines whether this parameter has a default argument that has not yet been parsed.
Definition Decl.h:1919
void setUninstantiatedDefaultArg(Expr *arg)
Definition Decl.cpp:3039
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
Definition Decl.h:1823
bool hasUninstantiatedDefaultArg() const
Definition Decl.h:1923
bool hasInheritedDefaultArg() const
Definition Decl.h:1935
void setExplicitObjectParameterLoc(SourceLocation Loc)
Definition Decl.h:1882
Expr * getDefaultArg()
Definition Decl.cpp:3002
Expr * getUninstantiatedDefaultArg()
Definition Decl.cpp:3044
unsigned getFunctionScopeDepth() const
Definition Decl.h:1840
void setHasInheritedDefaultArg(bool I=true)
Definition Decl.h:1939
PredefinedIdentKind getIdentKind() const
Definition Expr.h:2040
SourceLocation getLocation() const
Definition Expr.h:2046
PrettyDeclStackTraceEntry - If a crash occurs in the parser while parsing something related to a decl...
A (possibly-)qualified type.
Definition TypeBase.h:937
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
Definition Type.cpp:3555
void addConst()
Add the const type qualifier to this QualType.
Definition TypeBase.h:1156
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1004
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
The collection of all-type qualifiers we support.
Definition TypeBase.h:331
void removeObjCLifetime()
Definition TypeBase.h:551
Represents a struct/union/class.
Definition Decl.h:4312
bool isMemberSpecialization() const
Determines whether this template was a specialization of a member template.
Represents the body of a requires-expression.
Definition DeclCXX.h:2098
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
RequiresExprBodyDecl * getBody() const
Scope - A scope is a transient data structure that is used while parsing the program.
Definition Scope.h:41
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
Definition SemaBase.cpp:33
Sema & SemaRef
Definition SemaBase.h:40
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
Definition SemaBase.cpp:61
RAII object used to change the argument pack substitution index within a Sema object.
Definition Sema.h:13594
RAII object used to temporarily allow the C++ 'this' expression to be used, with the given qualifiers...
Definition Sema.h:8423
A RAII object to temporarily push a declaration context.
Definition Sema.h:3467
For a defaulted function, the kind of defaulted function that it is.
Definition Sema.h:6338
DefaultedComparisonKind asComparison() const
Definition Sema.h:6370
CXXSpecialMemberKind asSpecialMember() const
Definition Sema.h:6367
A helper class for building up ExtParameterInfos.
Definition Sema.h:12987
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition Sema.h:12422
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:854
llvm::DenseSet< Module * > LookupModulesCache
Cache of additional modules that should be used for name lookup within the current template instantia...
Definition Sema.h:13549
bool SubstTypeConstraint(TemplateTypeParmDecl *Inst, const TypeConstraint *TC, const MultiLevelTemplateArgumentList &TemplateArgs, bool EvaluateConstraint)
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
Definition Sema.h:13533
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition Sema.h:13016
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD)
Determine the kind of defaulting that would be done for a given function.
ExprResult SubstConceptTemplateArguments(const ConceptSpecializationExpr *CSE, const Expr *ConstraintExpr, const MultiLevelTemplateArgumentList &MLTAL)
Substitute concept template arguments in the constraint expression of a concept-id.
NamedDecl * FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, bool FindingInstantiatedContext=false)
Find the instantiation of the given declaration within the current instantiation.
llvm::function_ref< void(SourceLocation, PartialDiagnostic)> InstantiationContextDiagFuncRef
Definition Sema.h:2281
TemplateName SubstTemplateName(SourceLocation TemplateKWLoc, NestedNameSpecifierLoc &QualifierLoc, TemplateName Name, SourceLocation NameLoc, const MultiLevelTemplateArgumentList &TemplateArgs)
ParmVarDecl * SubstParmVarDecl(ParmVarDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, int indexAdjustment, UnsignedOrNone NumExpansions, bool ExpectParameterPack, bool EvaluateConstraints=true)
void InstantiateClassTemplateSpecializationMembers(SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK)
Instantiate the definitions of all of the members of the given class template specialization,...
ClassTemplatePartialSpecializationDecl * getMoreSpecializedPartialSpecialization(ClassTemplatePartialSpecializationDecl *PS1, ClassTemplatePartialSpecializationDecl *PS2, SourceLocation Loc)
Returns the more specialized class template partial specialization according to the rules of partial ...
ExprResult SubstInitializer(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs, bool CXXDirectInit)
llvm::function_ref< void(llvm::raw_ostream &)> EntityPrinter
Definition Sema.h:13911
void SubstExceptionSpec(FunctionDecl *New, const FunctionProtoType *Proto, const MultiLevelTemplateArgumentList &Args)
concepts::Requirement::SubstitutionDiagnostic * createSubstDiagAt(SourceLocation Location, EntityPrinter Printer)
create a Requirement::SubstitutionDiagnostic with only a SubstitutedEntity and DiagLoc using ASTConte...
bool SubstExprs(ArrayRef< Expr * > Exprs, bool IsCall, const MultiLevelTemplateArgumentList &TemplateArgs, SmallVectorImpl< Expr * > &Outputs)
Substitute the given template arguments into a list of expressions, expanding pack expansions if requ...
StmtResult SubstStmt(Stmt *S, const MultiLevelTemplateArgumentList &TemplateArgs)
ASTContext & Context
Definition Sema.h:1283
bool InstantiateClassTemplateSpecialization(SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK, bool Complain, bool PrimaryStrictPackMatch)
ExprResult SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
DiagnosticsEngine & getDiagnostics() const
Definition Sema.h:922
bool CheckParameterPacksForExpansion(SourceLocation EllipsisLoc, SourceRange PatternRange, ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs, bool FailOnPackProducingTemplates, bool &ShouldExpand, bool &RetainExpansion, UnsignedOrNone &NumExpansions, bool Diagnose=true)
Determine whether we could expand a pack expansion with the given set of parameter packs into separat...
ExprResult SubstConstraintExprWithoutSatisfaction(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
void PrintInstantiationStack()
Definition Sema.h:13622
ASTContext & getASTContext() const
Definition Sema.h:925
TypeSourceInfo * SubstType(TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, DeclarationName Entity, bool AllowDeducedTST=false)
Perform substitution on the type T with a given set of template arguments.
void InstantiateVariableDefinition(SourceLocation PointOfInstantiation, VarDecl *Var, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given variable from its template.
void ActOnStartCXXInClassMemberInitializer()
Enter a new C++ default initializer scope.
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
Definition Sema.h:1191
bool pushCodeSynthesisContext(CodeSynthesisContext Ctx)
bool SubstTemplateArguments(ArrayRef< TemplateArgumentLoc > Args, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentListInfo &Outputs)
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
Definition Sema.cpp:272
void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)
const LangOptions & getLangOpts() const
Definition Sema.h:918
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
void InstantiateClassMembers(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK)
Instantiates the definitions of all of the member of the given class, which is an instantiation of a ...
DeclarationNameInfo SubstDeclarationNameInfo(const DeclarationNameInfo &NameInfo, const MultiLevelTemplateArgumentList &TemplateArgs)
Do template substitution on declaration name info.
void MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class, bool DefinitionRequired=false)
Note that the vtable for the given class was used at the given location.
TemplateArgument getPackSubstitutedTemplateArgument(TemplateArgument Arg) const
Definition Sema.h:11740
bool usesPartialOrExplicitSpecialization(SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec)
bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero)
CXXBaseSpecifier * CheckBaseSpecifier(CXXRecordDecl *Class, SourceRange SpecifierRange, bool Virtual, AccessSpecifier Access, TypeSourceInfo *TInfo, SourceLocation EllipsisLoc)
Check the validity of a C++ base class specifier.
UnparsedDefaultArgInstantiationsMap UnparsedDefaultArgInstantiations
A mapping from parameters with unparsed default arguments to the set of instantiations of each parame...
Definition Sema.h:13028
bool SubstParmTypes(SourceLocation Loc, ArrayRef< ParmVarDecl * > Params, const FunctionProtoType::ExtParameterInfo *ExtParamInfos, const MultiLevelTemplateArgumentList &TemplateArgs, SmallVectorImpl< QualType > &ParamTypes, SmallVectorImpl< ParmVarDecl * > *OutParams, ExtParameterInfoBuilder &ParamInfos)
Substitute the given template arguments into the given set of parameters, producing the set of parame...
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition Sema.h:1414
MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, const DeclContext *DC=nullptr, bool Final=false, std::optional< ArrayRef< TemplateArgument > > Innermost=std::nullopt, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false, bool ForDefaultArgumentSubstitution=false)
Retrieve the template argument list(s) that should be used to instantiate the definition of the given...
std::deque< PendingImplicitInstantiation > PendingLocalImplicitInstantiations
The queue of implicit template instantiations that are required and must be performed within the curr...
Definition Sema.h:13960
ParmVarDecl * CheckParameter(DeclContext *DC, SourceLocation StartLoc, SourceLocation NameLoc, const IdentifierInfo *Name, QualType T, TypeSourceInfo *TSInfo, StorageClass SC)
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
bool CheckSpecializationInstantiationRedecl(SourceLocation NewLoc, TemplateSpecializationKind ActOnExplicitInstantiationNewTSK, NamedDecl *PrevDecl, TemplateSpecializationKind PrevTSK, SourceLocation PrevPtOfInstantiation, bool &SuppressNew)
Diagnose cases where we have an explicit template specialization before/after an explicit template in...
unsigned NonInstantiationEntries
The number of CodeSynthesisContexts that are not template instantiations and, therefore,...
Definition Sema.h:13564
bool CheckNoInlineAttr(const Stmt *OrigSt, const Stmt *CurSt, const AttributeCommonInfo &A)
void ActOnFinishCXXInClassMemberInitializer(Decl *VarDecl, SourceLocation EqualLoc, ExprResult Init)
This is invoked after parsing an in-class initializer for a non-static C++ class member,...
bool inConstraintSubstitution() const
Determine whether we are currently performing constraint substitution.
Definition Sema.h:13900
bool CheckAlwaysInlineAttr(const Stmt *OrigSt, const Stmt *CurSt, const AttributeCommonInfo &A)
void DiagnoseAvailabilityOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass, bool ObjCPropertyAccess, bool AvoidPartialAvailabilityChecks, ObjCInterfaceDecl *ClassReceiver)
bool AttachTypeConstraint(NestedNameSpecifierLoc NS, DeclarationNameInfo NameInfo, TemplateDecl *NamedConcept, NamedDecl *FoundDecl, const TemplateArgumentListInfo *TemplateArgs, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc)
Attach a type-constraint to a template parameter.
std::pair< AvailabilityResult, const NamedDecl * > ShouldDiagnoseAvailabilityOfDecl(const NamedDecl *D, std::string *Message, ObjCInterfaceDecl *ClassReceiver)
The diagnostic we should emit for D, and the declaration that originated it, or AR_Available.
bool InstantiateInClassInitializer(SourceLocation PointOfInstantiation, FieldDecl *Instantiation, FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the definition of a field from the given pattern.
UnsignedOrNone ArgPackSubstIndex
The current index into pack expansion arguments that will be used for substitution of parameter packs...
Definition Sema.h:13588
bool InstantiateClass(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK, bool Complain=true)
Instantiate the definition of a class from a given pattern.
bool SubstTemplateArgument(const TemplateArgumentLoc &Input, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentLoc &Output, SourceLocation Loc={}, const DeclarationName &Entity={})
void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given function from its template.
bool SubstDefaultArgument(SourceLocation Loc, ParmVarDecl *Param, const MultiLevelTemplateArgumentList &TemplateArgs, bool ForCallExpr=false)
Substitute the given template arguments into the default argument.
ExprResult SubstConstraintExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
ASTConsumer & Consumer
Definition Sema.h:1284
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
Definition Sema.h:6713
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
Definition Sema.h:6723
unsigned LastEmittedCodeSynthesisContextDepth
The depth of the context stack at the point when the most recent error or warning was produced.
Definition Sema.h:13572
bool inParameterMappingSubstitution() const
Definition Sema.h:13905
NestedNameSpecifierLoc SubstNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, const MultiLevelTemplateArgumentList &TemplateArgs)
bool RebuildingImmediateInvocation
Whether the AST is currently being rebuilt to correct immediate invocations.
Definition Sema.h:8142
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
Definition Sema.h:8292
bool DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, NamedDecl *Instantiation, bool InstantiatedFromMember, const NamedDecl *Pattern, const NamedDecl *PatternDef, TemplateSpecializationKind TSK, bool Complain=true, bool *Unreachable=nullptr)
Determine whether we would be unable to instantiate this template (because it either has no definitio...
DiagnosticsEngine & Diags
Definition Sema.h:1285
bool AttachBaseSpecifiers(CXXRecordDecl *Class, MutableArrayRef< CXXBaseSpecifier * > Bases)
Performs the actual work of attaching the given base class specifiers to a C++ class.
friend class InitializationSequence
Definition Sema.h:1556
SmallVector< Module *, 16 > CodeSynthesisContextLookupModules
Extra modules inspected when performing a lookup during a template instantiation.
Definition Sema.h:13544
ExprResult ConvertParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg, SourceLocation EqualLoc)
TemplateDeductionResult DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, ArrayRef< TemplateArgument > TemplateArgs, sema::TemplateDeductionInfo &Info)
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
Definition Sema.cpp:625
bool SubstTemplateArgumentsInParameterMapping(ArrayRef< TemplateArgumentLoc > Args, SourceLocation BaseLoc, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentListInfo &Out, bool BuildPackExpansionTypes)
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
bool InstantiateEnum(SourceLocation PointOfInstantiation, EnumDecl *Instantiation, EnumDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK)
Instantiate the definition of an enum from a given pattern.
void UpdateExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI)
ExprResult SubstCXXIdExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
Substitute an expression as if it is a address-of-operand, which makes it act like a CXXIdExpression ...
std::string getTemplateArgumentBindingsText(const TemplateParameterList *Params, const TemplateArgumentList &Args)
Produces a formatted string that describes the binding of template parameters to template arguments.
bool SubstBaseSpecifiers(CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
Perform substitution on the base class specifiers of the given class template specialization.
void PerformDependentDiagnostics(const DeclContext *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
TypeSourceInfo * CheckPackExpansion(TypeSourceInfo *Pattern, SourceLocation EllipsisLoc, UnsignedOrNone NumExpansions)
Construct a pack expansion type from the pattern of the pack expansion.
ASTMutationListener * getASTMutationListener() const
Definition Sema.cpp:651
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
Definition Sema.h:8631
TypeSourceInfo * SubstFunctionDeclType(TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, DeclarationName Entity, CXXRecordDecl *ThisContext, Qualifiers ThisTypeQuals, bool EvaluateConstraints=true)
A form of SubstType intended specifically for instantiating the type of a FunctionDecl.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
Stmt - This represents one statement.
Definition Stmt.h:85
SourceLocation getEndLoc() const LLVM_READONLY
Definition Stmt.cpp:362
void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
StmtClass getStmtClass() const
Definition Stmt.h:1472
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition Stmt.cpp:338
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Stmt.cpp:350
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3717
void setTagKind(TagKind TK)
Definition Decl.h:3915
void startDefinition()
Starts the definition of this tag declaration.
Definition Decl.cpp:4898
void setBraceRange(SourceRange R)
Definition Decl.h:3789
SourceLocation getNameLoc() const
Definition TypeLoc.h:822
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
ArrayRef< TemplateArgumentLoc > arguments() const
A template argument list.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
Location wrapper for a TemplateArgument.
const TemplateArgument & getArgument() const
Represents a template argument.
ArrayRef< TemplateArgument > getPackAsArray() const
Return the array of arguments in this template argument pack.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
bool isDependent() const
Whether this template argument is dependent on a template parameter such that its result can change f...
pack_iterator pack_begin() const
Iterator referencing the first argument of a template argument pack.
bool isConceptOrConceptTemplateParameter() const
QualType getAsType() const
Retrieve the type for a type template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
TemplateArgument getPackExpansionPattern() const
When the template argument is a pack expansion, returns the pattern of the pack expansion.
bool isNull() const
Determine whether this template argument has no value.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
@ Template
The template argument is a template name that was provided for a template template parameter.
@ Pack
The template argument is actually a parameter pack.
@ Type
The template argument is a type.
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
bool isPackExpansion() const
Determine whether this template argument is a pack expansion.
SmallVectorImpl< std::pair< ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl * > >::iterator delayed_partial_spec_iterator
Definition Template.h:684
void InstantiateEnumDefinition(EnumDecl *Enum, EnumDecl *Pattern)
SmallVectorImpl< std::pair< VarTemplateDecl *, VarTemplatePartialSpecializationDecl * > >::iterator delayed_var_partial_spec_iterator
Definition Template.h:687
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
NameKind getKind() const
@ Template
A single template declaration.
SubstTemplateTemplateParmPackStorage * getAsSubstTemplateTemplateParmPack() const
Retrieve the substituted template template parameter pack, if known.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation getTemplateLoc() const
TemplateSpecCandidateSet - A set of generalized overload candidates, used in template specializations...
SourceLocation getLocation() const
TemplateSpecCandidate & addCandidate()
Add a new candidate with NumConversions conversion sequence slots to the overload set.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
unsigned getDepth() const
Get the nesting depth of the template parameter.
Declaration of a template type parameter.
void setTypeConstraint(ConceptReference *CR, Expr *ImmediatelyDeclaredConstraint, UnsignedOrNone ArgPackSubstIndex)
bool isParameterPack() const
Returns whether this is a parameter pack.
A semantic tree transformation that allows one to transform one abstract syntax tree into another.
QualType TransformTemplateSpecializationType(TypeLocBuilder &TLB, TemplateSpecializationTypeLoc TL, QualType ObjectType, NamedDecl *FirstQualifierInScope, bool AllowInjectedClassName)
Declaration of an alias template.
TypeAliasDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Definition ASTConcept.h:227
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Definition ASTConcept.h:266
UnsignedOrNone getArgPackSubstIndex() const
Definition ASTConcept.h:250
Expr * getImmediatelyDeclaredConstraint() const
Get the immediately-declared constraint expression introduced by this type-constraint,...
Definition ASTConcept.h:244
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const
Definition ASTConcept.h:276
TemplateDecl * getNamedConcept() const
Definition ASTConcept.h:254
const DeclarationNameInfo & getConceptNameInfo() const
Definition ASTConcept.h:280
ConceptReference * getConceptReference() const
Definition ASTConcept.h:248
void setLocStart(SourceLocation L)
Definition Decl.h:3548
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
void pushFullCopy(TypeLoc L)
Pushes a copy of the given TypeLoc onto this builder.
void reserve(size_t Requested)
Ensures that this buffer has at least as much capacity as described.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
void pushTrivial(ASTContext &Context, QualType T, SourceLocation Loc)
Pushes 'T' with all locations pointing to 'Loc'.
Base wrapper for a particular "section" of type source info.
Definition TypeLoc.h:59
QualType getType() const
Get the type for which this source info wrapper provides information.
Definition TypeLoc.h:133
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
Definition TypeLoc.h:89
TypeLoc IgnoreParens() const
Definition TypeLoc.h:1408
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
Definition TypeLoc.h:78
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
Definition TypeLoc.h:154
unsigned getFullDataSize() const
Returns the size of the type source info data block.
Definition TypeLoc.h:165
SourceLocation getBeginLoc() const
Get the begin source location.
Definition TypeLoc.cpp:193
A container of type source information.
Definition TypeBase.h:8249
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition TypeLoc.h:267
QualType getType() const
Return the type wrapped by this type source info.
Definition TypeBase.h:8260
SourceLocation getNameLoc() const
Definition TypeLoc.h:547
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:551
An operation on a type.
Definition TypeVisitor.h:64
The base class of the type hierarchy.
Definition TypeBase.h:1833
bool isVoidType() const
Definition TypeBase.h:8871
bool isReferenceType() const
Definition TypeBase.h:8539
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:752
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
Definition TypeBase.h:2790
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
Definition TypeBase.h:2405
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
Definition TypeBase.h:2800
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9091
bool isRecordType() const
Definition TypeBase.h:8642
QualType getUnderlyingType() const
Definition Decl.h:3617
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Definition ExprCXX.h:3390
QualType getType() const
Definition Decl.h:723
bool isParameterPack() const
Determine whether this value is actually a function parameter pack, init-capture pack,...
Definition Decl.cpp:5516
Represents a variable declaration or definition.
Definition Decl.h:926
bool isStaticDataMember() const
Determines whether this is a static data member.
Definition Decl.h:1283
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
Definition Decl.cpp:2369
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
Definition Decl.cpp:2775
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
For a static data member that was instantiated from a static data member of a class template,...
Definition Decl.cpp:2910
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:1168
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this variable is an instantiation of a static data member of a class template specialization,...
Definition Decl.cpp:2901
Declaration of a variable template.
Represents a variable template specialization, which refers to a variable template with a given set o...
const TemplateArgumentList & getTemplateInstantiationArgs() const
Retrieve the set of template arguments that should be used to instantiate the initializer of the vari...
llvm::PointerUnion< VarTemplateDecl *, VarTemplatePartialSpecializationDecl * > getSpecializedTemplateOrPartial() const
Retrieve the variable template or variable template partial specialization which was specialized by t...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
VarTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
SubstitutionDiagnostic * getExprSubstitutionDiagnostic() const
const ReturnTypeRequirement & getReturnTypeRequirement() const
SourceLocation getNoexceptLoc() const
A requires-expression requirement which is satisfied when a general constraint expression is satisfie...
const ASTConstraintSatisfaction & getConstraintSatisfaction() const
A static requirement that can be used in a requires-expression to check properties of types and expre...
SubstitutionDiagnostic * getSubstitutionDiagnostic() const
TypeSourceInfo * getType() const
CXXMethodDecl * CallOperator
The lambda's compiler-generated operator().
Definition ScopeInfo.h:874
Provides information about an attempted template argument deduction, whose success or failure was des...
TemplateArgumentList * takeCanonical()
SourceLocation getLocation() const
Returns the location at which template argument is occurring.
bool hasSFINAEDiagnostic() const
Is a SFINAE diagnostic available?
void takeSFINAEDiagnostic(PartialDiagnosticAt &PD)
Take ownership of the SFINAE diagnostic.
#define bool
Definition gpuintrin.h:32
Defines the clang::TargetInfo interface.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
Attr * instantiateTemplateAttribute(const Attr *At, ASTContext &C, Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs)
Attr * instantiateTemplateAttributeForDecl(const Attr *At, ASTContext &C, Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs)
The JSON file list parser is used to communicate input to InstallAPI.
void atTemplateEnd(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema, const Sema::CodeSynthesisContext &Inst)
bool isa(CodeGen::Address addr)
Definition Address.h:330
@ CPlusPlus11
void atTemplateBegin(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema, const Sema::CodeSynthesisContext &Inst)
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
Definition Template.h:50
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
Definition Lookup.h:64
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
Definition Parser.h:61
NamedDecl * getAsNamedDecl(TemplateParameter P)
@ OK_Ordinary
An ordinary object is located at an address in memory.
Definition Specifiers.h:151
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl *, const TemplateSpecializationType *, const SubstBuiltinTemplatePackType * >, SourceLocation > UnexpandedParameterPack
Definition Sema.h:236
bool isPackProducingBuiltinTemplateName(TemplateName N)
@ AS_public
Definition Specifiers.h:124
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool isGenericLambdaCallOperatorOrStaticInvokerSpecialization(const DeclContext *DC)
Definition ASTLambda.h:89
bool isLambdaCallOperator(const CXXMethodDecl *MD)
Definition ASTLambda.h:28
@ Result
The result type of a method or function.
Definition TypeBase.h:905
std::pair< unsigned, unsigned > getDepthAndIndex(const NamedDecl *ND)
Retrieve the depth and index of a template parameter.
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
Definition Parser.h:81
DeductionFailureInfo MakeDeductionFailureInfo(ASTContext &Context, TemplateDeductionResult TDK, sema::TemplateDeductionInfo &Info)
Convert from Sema's representation of template deduction information to the form used in overload-can...
ExprResult ExprError()
Definition Ownership.h:265
@ Type
The name was classified as a type.
Definition Sema.h:562
@ AR_Available
Definition DeclBase.h:73
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition Specifiers.h:135
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition Specifiers.h:139
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
TemplateDeductionResult
Describes the result of template argument deduction.
Definition Sema.h:367
@ Success
Template argument deduction was successful.
Definition Sema.h:369
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition Specifiers.h:188
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
Definition Specifiers.h:206
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
Definition Specifiers.h:202
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
Definition Specifiers.h:198
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
Definition Specifiers.h:194
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
Definition Specifiers.h:191
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5867
ActionResult< Expr * > ExprResult
Definition Ownership.h:249
@ EST_Uninstantiated
not instantiated yet
@ EST_None
no exception specification
ActionResult< Stmt * > StmtResult
Definition Ownership.h:250
#define false
Definition stdbool.h:26
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
SourceLocation RAngleLoc
The source location of the right angle bracket ('>').
const TemplateArgumentLoc * getTemplateArgs() const
Retrieve the template arguments.
SourceLocation LAngleLoc
The source location of the left angle bracket ('<').
SourceLocation getLAngleLoc() const
ArrayRef< TemplateArgumentLoc > arguments() const
SourceLocation getRAngleLoc() const
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
Holds information about the various types of exception specification.
Definition TypeBase.h:5311
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition TypeBase.h:5313
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
Definition Sema.h:13064
SourceRange InstantiationRange
The source range that covers the construct that cause the instantiation, e.g., the template-id that c...
Definition Sema.h:13227
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
const TemplateArgument * TemplateArgs
The list of template arguments we are substituting, if they are not part of the entity.
Definition Sema.h:13200
SourceLocation PointOfInstantiation
The point of instantiation or synthesis within the source code.
Definition Sema.h:13187
SynthesisKind
The kind of template instantiation we are performing.
Definition Sema.h:13066
@ MarkingClassDllexported
We are marking a class as __dllexport.
Definition Sema.h:13158
@ DefaultTemplateArgumentInstantiation
We are instantiating a default argument for a template parameter.
Definition Sema.h:13076
@ ExplicitTemplateArgumentSubstitution
We are substituting explicit template arguments provided for a function template.
Definition Sema.h:13085
@ DefaultTemplateArgumentChecking
We are checking the validity of a default template argument that has been used when naming a template...
Definition Sema.h:13104
@ InitializingStructuredBinding
We are initializing a structured binding.
Definition Sema.h:13155
@ ExceptionSpecInstantiation
We are instantiating the exception specification for a function template which was deferred until it ...
Definition Sema.h:13112
@ NestedRequirementConstraintsCheck
We are checking the satisfaction of a nested requirement of a requires expression.
Definition Sema.h:13119
@ BuildingBuiltinDumpStructCall
We are building an implied call from __builtin_dump_struct.
Definition Sema.h:13162
@ DefiningSynthesizedFunction
We are defining a synthesized function (such as a defaulted special member).
Definition Sema.h:13130
@ Memoization
Added for Template instantiation observation.
Definition Sema.h:13168
@ LambdaExpressionSubstitution
We are substituting into a lambda expression.
Definition Sema.h:13095
@ TypeAliasTemplateInstantiation
We are instantiating a type alias template declaration.
Definition Sema.h:13174
@ BuildingDeductionGuides
We are building deduction guides for a class.
Definition Sema.h:13171
@ PartialOrderingTTP
We are performing partial ordering for template template parameters.
Definition Sema.h:13177
@ DeducedTemplateArgumentSubstitution
We are substituting template argument determined as part of template argument deduction for either a ...
Definition Sema.h:13092
@ PriorTemplateArgumentSubstitution
We are substituting prior template arguments into a new template parameter.
Definition Sema.h:13100
@ ExceptionSpecEvaluation
We are computing the exception specification for a defaulted special member function.
Definition Sema.h:13108
@ TemplateInstantiation
We are instantiating a template declaration.
Definition Sema.h:13069
@ DeclaringSpecialMember
We are declaring an implicit special member function.
Definition Sema.h:13122
@ DeclaringImplicitEqualityComparison
We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.
Definition Sema.h:13126
@ DefaultFunctionArgumentInstantiation
We are instantiating a default argument for a function.
Definition Sema.h:13081
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
Definition Sema.h:13152
@ RequirementInstantiation
We are instantiating a requirement of a requires expression.
Definition Sema.h:13115
Decl * Entity
The entity that is being synthesized.
Definition Sema.h:13190
bool isInstantiationRecord() const
Determines whether this template is an actual instantiation that should be counted toward the maximum...
A stack object to be created when performing template instantiation.
Definition Sema.h:13250
bool isInvalid() const
Determines whether we have exceeded the maximum recursive template instantiations.
Definition Sema.h:13403
InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, Decl *Entity, SourceRange InstantiationRange=SourceRange())
Note that we are instantiating a class template, function template, variable template,...
void Clear()
Note that we have finished instantiating this template.
void set(DeclAccessPair Found, Decl *Spec, DeductionFailureInfo Info)
SourceLocation Ellipsis
UnsignedOrNone NumExpansions