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" 13 #include "clang/AST/ASTConcept.h" 14 #include "clang/AST/ASTConsumer.h" 15 #include "clang/AST/ASTContext.h" 16 #include "clang/AST/ASTLambda.h" 17 #include "clang/AST/ASTMutationListener.h" 18 #include "clang/AST/DeclBase.h" 19 #include "clang/AST/DeclTemplate.h" 20 #include "clang/AST/Expr.h" 21 #include "clang/AST/ExprConcepts.h" 22 #include "clang/AST/PrettyDeclStackTrace.h" 23 #include "clang/AST/RecursiveASTVisitor.h" 24 #include "clang/AST/Type.h" 25 #include "clang/AST/TypeLoc.h" 26 #include "clang/AST/TypeVisitor.h" 27 #include "clang/Basic/LangOptions.h" 28 #include "clang/Basic/Stack.h" 29 #include "clang/Basic/TargetInfo.h" 30 #include "clang/Sema/DeclSpec.h" 31 #include "clang/Sema/EnterExpressionEvaluationContext.h" 32 #include "clang/Sema/Initialization.h" 33 #include "clang/Sema/Lookup.h" 34 #include "clang/Sema/Sema.h" 35 #include "clang/Sema/SemaConcept.h" 36 #include "clang/Sema/SemaInternal.h" 37 #include "clang/Sema/Template.h" 38 #include "clang/Sema/TemplateDeduction.h" 39 #include "clang/Sema/TemplateInstCallback.h" 40 #include "llvm/ADT/STLForwardCompat.h" 41 #include "llvm/ADT/StringExtras.h" 42 #include "llvm/Support/ErrorHandling.h" 43 #include "llvm/Support/TimeProfiler.h" 44 #include <optional> 45 46 using namespace clang; 47 using namespace sema; 48 49 //===----------------------------------------------------------------------===/ 50 // Template Instantiation Support 51 //===----------------------------------------------------------------------===/ 52 53 namespace { 54 namespace TemplateInstArgsHelpers { 55 struct Response { 56 const Decl *NextDecl = nullptr; 57 bool IsDone = false; 58 bool ClearRelativeToPrimary = true; 59 static Response Done() { 60 Response R; 61 R.IsDone = true; 62 return R; 63 } 64 static Response ChangeDecl(const Decl *ND) { 65 Response R; 66 R.NextDecl = ND; 67 return R; 68 } 69 static Response ChangeDecl(const DeclContext *Ctx) { 70 Response R; 71 R.NextDecl = Decl::castFromDeclContext(Ctx); 72 return R; 73 } 74 75 static Response UseNextDecl(const Decl *CurDecl) { 76 return ChangeDecl(CurDecl->getDeclContext()); 77 } 78 79 static Response DontClearRelativeToPrimaryNextDecl(const Decl *CurDecl) { 80 Response R = Response::UseNextDecl(CurDecl); 81 R.ClearRelativeToPrimary = false; 82 return R; 83 } 84 }; 85 86 // Retrieve the primary template for a lambda call operator. It's 87 // unfortunate that we only have the mappings of call operators rather 88 // than lambda classes. 89 const FunctionDecl * 90 getPrimaryTemplateOfGenericLambda(const FunctionDecl *LambdaCallOperator) { 91 if (!isLambdaCallOperator(LambdaCallOperator)) 92 return LambdaCallOperator; 93 while (true) { 94 if (auto *FTD = dyn_cast_if_present<FunctionTemplateDecl>( 95 LambdaCallOperator->getDescribedTemplate()); 96 FTD && FTD->getInstantiatedFromMemberTemplate()) { 97 LambdaCallOperator = 98 FTD->getInstantiatedFromMemberTemplate()->getTemplatedDecl(); 99 } else if (LambdaCallOperator->getPrimaryTemplate()) { 100 // Cases where the lambda operator is instantiated in 101 // TemplateDeclInstantiator::VisitCXXMethodDecl. 102 LambdaCallOperator = 103 LambdaCallOperator->getPrimaryTemplate()->getTemplatedDecl(); 104 } else if (auto *Prev = cast<CXXMethodDecl>(LambdaCallOperator) 105 ->getInstantiatedFromMemberFunction()) 106 LambdaCallOperator = Prev; 107 else 108 break; 109 } 110 return LambdaCallOperator; 111 } 112 113 struct EnclosingTypeAliasTemplateDetails { 114 TypeAliasTemplateDecl *Template = nullptr; 115 TypeAliasTemplateDecl *PrimaryTypeAliasDecl = nullptr; 116 ArrayRef<TemplateArgument> AssociatedTemplateArguments; 117 118 explicit operator bool() noexcept { return Template; } 119 }; 120 121 // Find the enclosing type alias template Decl from CodeSynthesisContexts, as 122 // well as its primary template and instantiating template arguments. 123 EnclosingTypeAliasTemplateDetails 124 getEnclosingTypeAliasTemplateDecl(Sema &SemaRef) { 125 for (auto &CSC : llvm::reverse(SemaRef.CodeSynthesisContexts)) { 126 if (CSC.Kind != Sema::CodeSynthesisContext::SynthesisKind:: 127 TypeAliasTemplateInstantiation) 128 continue; 129 EnclosingTypeAliasTemplateDetails Result; 130 auto *TATD = cast<TypeAliasTemplateDecl>(CSC.Entity), 131 *Next = TATD->getInstantiatedFromMemberTemplate(); 132 Result = { 133 /*Template=*/TATD, 134 /*PrimaryTypeAliasDecl=*/TATD, 135 /*AssociatedTemplateArguments=*/CSC.template_arguments(), 136 }; 137 while (Next) { 138 Result.PrimaryTypeAliasDecl = Next; 139 Next = Next->getInstantiatedFromMemberTemplate(); 140 } 141 return Result; 142 } 143 return {}; 144 } 145 146 // Check if we are currently inside of a lambda expression that is 147 // surrounded by a using alias declaration. e.g. 148 // template <class> using type = decltype([](auto) { ^ }()); 149 // We have to do so since a TypeAliasTemplateDecl (or a TypeAliasDecl) is never 150 // a DeclContext, nor does it have an associated specialization Decl from which 151 // we could collect these template arguments. 152 bool isLambdaEnclosedByTypeAliasDecl( 153 const FunctionDecl *LambdaCallOperator, 154 const TypeAliasTemplateDecl *PrimaryTypeAliasDecl) { 155 struct Visitor : RecursiveASTVisitor<Visitor> { 156 Visitor(const FunctionDecl *CallOperator) : CallOperator(CallOperator) {} 157 bool VisitLambdaExpr(const LambdaExpr *LE) { 158 // Return true to bail out of the traversal, implying the Decl contains 159 // the lambda. 160 return getPrimaryTemplateOfGenericLambda(LE->getCallOperator()) != 161 CallOperator; 162 } 163 const FunctionDecl *CallOperator; 164 }; 165 166 QualType Underlying = 167 PrimaryTypeAliasDecl->getTemplatedDecl()->getUnderlyingType(); 168 169 return !Visitor(getPrimaryTemplateOfGenericLambda(LambdaCallOperator)) 170 .TraverseType(Underlying); 171 } 172 173 // Add template arguments from a variable template instantiation. 174 Response 175 HandleVarTemplateSpec(const VarTemplateSpecializationDecl *VarTemplSpec, 176 MultiLevelTemplateArgumentList &Result, 177 bool SkipForSpecialization) { 178 // For a class-scope explicit specialization, there are no template arguments 179 // at this level, but there may be enclosing template arguments. 180 if (VarTemplSpec->isClassScopeExplicitSpecialization()) 181 return Response::DontClearRelativeToPrimaryNextDecl(VarTemplSpec); 182 183 // We're done when we hit an explicit specialization. 184 if (VarTemplSpec->getSpecializationKind() == TSK_ExplicitSpecialization && 185 !isa<VarTemplatePartialSpecializationDecl>(VarTemplSpec)) 186 return Response::Done(); 187 188 // If this variable template specialization was instantiated from a 189 // specialized member that is a variable template, we're done. 190 assert(VarTemplSpec->getSpecializedTemplate() && "No variable template?"); 191 llvm::PointerUnion<VarTemplateDecl *, VarTemplatePartialSpecializationDecl *> 192 Specialized = VarTemplSpec->getSpecializedTemplateOrPartial(); 193 if (VarTemplatePartialSpecializationDecl *Partial = 194 Specialized.dyn_cast<VarTemplatePartialSpecializationDecl *>()) { 195 if (!SkipForSpecialization) 196 Result.addOuterTemplateArguments( 197 Partial, VarTemplSpec->getTemplateInstantiationArgs().asArray(), 198 /*Final=*/false); 199 if (Partial->isMemberSpecialization()) 200 return Response::Done(); 201 } else { 202 VarTemplateDecl *Tmpl = Specialized.get<VarTemplateDecl *>(); 203 if (!SkipForSpecialization) 204 Result.addOuterTemplateArguments( 205 Tmpl, VarTemplSpec->getTemplateInstantiationArgs().asArray(), 206 /*Final=*/false); 207 if (Tmpl->isMemberSpecialization()) 208 return Response::Done(); 209 } 210 return Response::DontClearRelativeToPrimaryNextDecl(VarTemplSpec); 211 } 212 213 // If we have a template template parameter with translation unit context, 214 // then we're performing substitution into a default template argument of 215 // this template template parameter before we've constructed the template 216 // that will own this template template parameter. In this case, we 217 // use empty template parameter lists for all of the outer templates 218 // to avoid performing any substitutions. 219 Response 220 HandleDefaultTempArgIntoTempTempParam(const TemplateTemplateParmDecl *TTP, 221 MultiLevelTemplateArgumentList &Result) { 222 for (unsigned I = 0, N = TTP->getDepth() + 1; I != N; ++I) 223 Result.addOuterTemplateArguments(std::nullopt); 224 return Response::Done(); 225 } 226 227 Response HandlePartialClassTemplateSpec( 228 const ClassTemplatePartialSpecializationDecl *PartialClassTemplSpec, 229 MultiLevelTemplateArgumentList &Result, bool SkipForSpecialization) { 230 if (!SkipForSpecialization) 231 Result.addOuterRetainedLevels(PartialClassTemplSpec->getTemplateDepth()); 232 return Response::Done(); 233 } 234 235 // Add template arguments from a class template instantiation. 236 Response 237 HandleClassTemplateSpec(const ClassTemplateSpecializationDecl *ClassTemplSpec, 238 MultiLevelTemplateArgumentList &Result, 239 bool SkipForSpecialization) { 240 if (!ClassTemplSpec->isClassScopeExplicitSpecialization()) { 241 // We're done when we hit an explicit specialization. 242 if (ClassTemplSpec->getSpecializationKind() == TSK_ExplicitSpecialization && 243 !isa<ClassTemplatePartialSpecializationDecl>(ClassTemplSpec)) 244 return Response::Done(); 245 246 if (!SkipForSpecialization) 247 Result.addOuterTemplateArguments( 248 const_cast<ClassTemplateSpecializationDecl *>(ClassTemplSpec), 249 ClassTemplSpec->getTemplateInstantiationArgs().asArray(), 250 /*Final=*/false); 251 252 // If this class template specialization was instantiated from a 253 // specialized member that is a class template, we're done. 254 assert(ClassTemplSpec->getSpecializedTemplate() && "No class template?"); 255 if (ClassTemplSpec->getSpecializedTemplate()->isMemberSpecialization()) 256 return Response::Done(); 257 258 // If this was instantiated from a partial template specialization, we need 259 // to get the next level of declaration context from the partial 260 // specialization, as the ClassTemplateSpecializationDecl's 261 // DeclContext/LexicalDeclContext will be for the primary template. 262 if (auto *InstFromPartialTempl = ClassTemplSpec->getSpecializedTemplateOrPartial() 263 .dyn_cast<ClassTemplatePartialSpecializationDecl *>()) 264 return Response::ChangeDecl(InstFromPartialTempl->getLexicalDeclContext()); 265 } 266 return Response::UseNextDecl(ClassTemplSpec); 267 } 268 269 Response HandleFunction(Sema &SemaRef, const FunctionDecl *Function, 270 MultiLevelTemplateArgumentList &Result, 271 const FunctionDecl *Pattern, bool RelativeToPrimary, 272 bool ForConstraintInstantiation) { 273 // Add template arguments from a function template specialization. 274 if (!RelativeToPrimary && 275 Function->getTemplateSpecializationKindForInstantiation() == 276 TSK_ExplicitSpecialization) 277 return Response::Done(); 278 279 if (!RelativeToPrimary && 280 Function->getTemplateSpecializationKind() == TSK_ExplicitSpecialization) { 281 // This is an implicit instantiation of an explicit specialization. We 282 // don't get any template arguments from this function but might get 283 // some from an enclosing template. 284 return Response::UseNextDecl(Function); 285 } else if (const TemplateArgumentList *TemplateArgs = 286 Function->getTemplateSpecializationArgs()) { 287 // Add the template arguments for this specialization. 288 Result.addOuterTemplateArguments(const_cast<FunctionDecl *>(Function), 289 TemplateArgs->asArray(), 290 /*Final=*/false); 291 292 if (RelativeToPrimary && 293 (Function->getTemplateSpecializationKind() == 294 TSK_ExplicitSpecialization || 295 (Function->getFriendObjectKind() && 296 !Function->getPrimaryTemplate()->getFriendObjectKind()))) 297 return Response::UseNextDecl(Function); 298 299 // If this function was instantiated from a specialized member that is 300 // a function template, we're done. 301 assert(Function->getPrimaryTemplate() && "No function template?"); 302 if (Function->getPrimaryTemplate()->isMemberSpecialization()) 303 return Response::Done(); 304 305 // If this function is a generic lambda specialization, we are done. 306 if (!ForConstraintInstantiation && 307 isGenericLambdaCallOperatorOrStaticInvokerSpecialization(Function)) 308 return Response::Done(); 309 310 } else if (Function->getDescribedFunctionTemplate()) { 311 assert( 312 (ForConstraintInstantiation || Result.getNumSubstitutedLevels() == 0) && 313 "Outer template not instantiated?"); 314 } 315 // If this is a friend or local declaration and it declares an entity at 316 // namespace scope, take arguments from its lexical parent 317 // instead of its semantic parent, unless of course the pattern we're 318 // instantiating actually comes from the file's context! 319 if ((Function->getFriendObjectKind() || Function->isLocalExternDecl()) && 320 Function->getNonTransparentDeclContext()->isFileContext() && 321 (!Pattern || !Pattern->getLexicalDeclContext()->isFileContext())) { 322 return Response::ChangeDecl(Function->getLexicalDeclContext()); 323 } 324 325 if (ForConstraintInstantiation && Function->getFriendObjectKind()) 326 return Response::ChangeDecl(Function->getLexicalDeclContext()); 327 return Response::UseNextDecl(Function); 328 } 329 330 Response HandleFunctionTemplateDecl(const FunctionTemplateDecl *FTD, 331 MultiLevelTemplateArgumentList &Result) { 332 if (!isa<ClassTemplateSpecializationDecl>(FTD->getDeclContext())) { 333 Result.addOuterTemplateArguments( 334 const_cast<FunctionTemplateDecl *>(FTD), 335 const_cast<FunctionTemplateDecl *>(FTD)->getInjectedTemplateArgs(), 336 /*Final=*/false); 337 338 NestedNameSpecifier *NNS = FTD->getTemplatedDecl()->getQualifier(); 339 340 while (const Type *Ty = NNS ? NNS->getAsType() : nullptr) { 341 if (NNS->isInstantiationDependent()) { 342 if (const auto *TSTy = Ty->getAs<TemplateSpecializationType>()) { 343 ArrayRef<TemplateArgument> Arguments = TSTy->template_arguments(); 344 // Prefer template arguments from the injected-class-type if possible. 345 // For example, 346 // ```cpp 347 // template <class... Pack> struct S { 348 // template <class T> void foo(); 349 // }; 350 // template <class... Pack> template <class T> 351 // ^^^^^^^^^^^^^ InjectedTemplateArgs 352 // They're of kind TemplateArgument::Pack, not of 353 // TemplateArgument::Type. 354 // void S<Pack...>::foo() {} 355 // ^^^^^^^ 356 // TSTy->template_arguments() (which are of PackExpansionType) 357 // ``` 358 // This meets the contract in 359 // TreeTransform::TryExpandParameterPacks that the template arguments 360 // for unexpanded parameters should be of a Pack kind. 361 if (TSTy->isCurrentInstantiation()) { 362 auto *RD = TSTy->getCanonicalTypeInternal()->getAsCXXRecordDecl(); 363 if (ClassTemplateDecl *CTD = RD->getDescribedClassTemplate()) 364 Arguments = CTD->getInjectedTemplateArgs(); 365 else if (auto *Specialization = 366 dyn_cast<ClassTemplateSpecializationDecl>(RD)) 367 Arguments = 368 Specialization->getTemplateInstantiationArgs().asArray(); 369 } 370 Result.addOuterTemplateArguments( 371 const_cast<FunctionTemplateDecl *>(FTD), Arguments, 372 /*Final=*/false); 373 } 374 } 375 376 NNS = NNS->getPrefix(); 377 } 378 } 379 380 return Response::ChangeDecl(FTD->getLexicalDeclContext()); 381 } 382 383 Response HandleRecordDecl(Sema &SemaRef, const CXXRecordDecl *Rec, 384 MultiLevelTemplateArgumentList &Result, 385 ASTContext &Context, 386 bool ForConstraintInstantiation) { 387 if (ClassTemplateDecl *ClassTemplate = Rec->getDescribedClassTemplate()) { 388 assert( 389 (ForConstraintInstantiation || Result.getNumSubstitutedLevels() == 0) && 390 "Outer template not instantiated?"); 391 if (ClassTemplate->isMemberSpecialization()) 392 return Response::Done(); 393 if (ForConstraintInstantiation) 394 Result.addOuterTemplateArguments(const_cast<CXXRecordDecl *>(Rec), 395 ClassTemplate->getInjectedTemplateArgs(), 396 /*Final=*/false); 397 } 398 399 if (const MemberSpecializationInfo *MSInfo = 400 Rec->getMemberSpecializationInfo()) 401 if (MSInfo->getTemplateSpecializationKind() == TSK_ExplicitSpecialization) 402 return Response::Done(); 403 404 bool IsFriend = Rec->getFriendObjectKind() || 405 (Rec->getDescribedClassTemplate() && 406 Rec->getDescribedClassTemplate()->getFriendObjectKind()); 407 if (ForConstraintInstantiation && IsFriend && 408 Rec->getNonTransparentDeclContext()->isFileContext()) { 409 return Response::ChangeDecl(Rec->getLexicalDeclContext()); 410 } 411 412 // This is to make sure we pick up the VarTemplateSpecializationDecl or the 413 // TypeAliasTemplateDecl that this lambda is defined inside of. 414 if (Rec->isLambda()) { 415 if (const Decl *LCD = Rec->getLambdaContextDecl()) 416 return Response::ChangeDecl(LCD); 417 // Retrieve the template arguments for a using alias declaration. 418 // This is necessary for constraint checking, since we always keep 419 // constraints relative to the primary template. 420 if (auto TypeAlias = getEnclosingTypeAliasTemplateDecl(SemaRef); 421 ForConstraintInstantiation && TypeAlias) { 422 if (isLambdaEnclosedByTypeAliasDecl(Rec->getLambdaCallOperator(), 423 TypeAlias.PrimaryTypeAliasDecl)) { 424 Result.addOuterTemplateArguments(TypeAlias.Template, 425 TypeAlias.AssociatedTemplateArguments, 426 /*Final=*/false); 427 // Visit the parent of the current type alias declaration rather than 428 // the lambda thereof. 429 // E.g., in the following example: 430 // struct S { 431 // template <class> using T = decltype([]<Concept> {} ()); 432 // }; 433 // void foo() { 434 // S::T var; 435 // } 436 // The instantiated lambda expression (which we're visiting at 'var') 437 // has a function DeclContext 'foo' rather than the Record DeclContext 438 // S. This seems to be an oversight to me that we may want to set a 439 // Sema Context from the CXXScopeSpec before substituting into T. 440 return Response::ChangeDecl(TypeAlias.Template->getDeclContext()); 441 } 442 } 443 } 444 445 return Response::UseNextDecl(Rec); 446 } 447 448 Response HandleImplicitConceptSpecializationDecl( 449 const ImplicitConceptSpecializationDecl *CSD, 450 MultiLevelTemplateArgumentList &Result) { 451 Result.addOuterTemplateArguments( 452 const_cast<ImplicitConceptSpecializationDecl *>(CSD), 453 CSD->getTemplateArguments(), 454 /*Final=*/false); 455 return Response::UseNextDecl(CSD); 456 } 457 458 Response HandleGenericDeclContext(const Decl *CurDecl) { 459 return Response::UseNextDecl(CurDecl); 460 } 461 } // namespace TemplateInstArgsHelpers 462 } // namespace 463 464 MultiLevelTemplateArgumentList Sema::getTemplateInstantiationArgs( 465 const NamedDecl *ND, const DeclContext *DC, bool Final, 466 std::optional<ArrayRef<TemplateArgument>> Innermost, bool RelativeToPrimary, 467 const FunctionDecl *Pattern, bool ForConstraintInstantiation, 468 bool SkipForSpecialization) { 469 assert((ND || DC) && "Can't find arguments for a decl if one isn't provided"); 470 // Accumulate the set of template argument lists in this structure. 471 MultiLevelTemplateArgumentList Result; 472 473 using namespace TemplateInstArgsHelpers; 474 const Decl *CurDecl = ND; 475 476 if (!CurDecl) 477 CurDecl = Decl::castFromDeclContext(DC); 478 479 if (Innermost) { 480 Result.addOuterTemplateArguments(const_cast<NamedDecl *>(ND), *Innermost, 481 Final); 482 // Populate placeholder template arguments for TemplateTemplateParmDecls. 483 // This is essential for the case e.g. 484 // 485 // template <class> concept Concept = false; 486 // template <template <Concept C> class T> void foo(T<int>) 487 // 488 // where parameter C has a depth of 1 but the substituting argument `int` 489 // has a depth of 0. 490 if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(CurDecl)) 491 HandleDefaultTempArgIntoTempTempParam(TTP, Result); 492 CurDecl = Response::UseNextDecl(CurDecl).NextDecl; 493 } 494 495 while (!CurDecl->isFileContextDecl()) { 496 Response R; 497 if (const auto *VarTemplSpec = 498 dyn_cast<VarTemplateSpecializationDecl>(CurDecl)) { 499 R = HandleVarTemplateSpec(VarTemplSpec, Result, SkipForSpecialization); 500 } else if (const auto *PartialClassTemplSpec = 501 dyn_cast<ClassTemplatePartialSpecializationDecl>(CurDecl)) { 502 R = HandlePartialClassTemplateSpec(PartialClassTemplSpec, Result, 503 SkipForSpecialization); 504 } else if (const auto *ClassTemplSpec = 505 dyn_cast<ClassTemplateSpecializationDecl>(CurDecl)) { 506 R = HandleClassTemplateSpec(ClassTemplSpec, Result, 507 SkipForSpecialization); 508 } else if (const auto *Function = dyn_cast<FunctionDecl>(CurDecl)) { 509 R = HandleFunction(*this, Function, Result, Pattern, RelativeToPrimary, 510 ForConstraintInstantiation); 511 } else if (const auto *Rec = dyn_cast<CXXRecordDecl>(CurDecl)) { 512 R = HandleRecordDecl(*this, Rec, Result, Context, 513 ForConstraintInstantiation); 514 } else if (const auto *CSD = 515 dyn_cast<ImplicitConceptSpecializationDecl>(CurDecl)) { 516 R = HandleImplicitConceptSpecializationDecl(CSD, Result); 517 } else if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(CurDecl)) { 518 R = HandleFunctionTemplateDecl(FTD, Result); 519 } else if (const auto *CTD = dyn_cast<ClassTemplateDecl>(CurDecl)) { 520 R = Response::ChangeDecl(CTD->getLexicalDeclContext()); 521 } else if (!isa<DeclContext>(CurDecl)) { 522 R = Response::DontClearRelativeToPrimaryNextDecl(CurDecl); 523 if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(CurDecl)) { 524 R = HandleDefaultTempArgIntoTempTempParam(TTP, Result); 525 } 526 } else { 527 R = HandleGenericDeclContext(CurDecl); 528 } 529 530 if (R.IsDone) 531 return Result; 532 if (R.ClearRelativeToPrimary) 533 RelativeToPrimary = false; 534 assert(R.NextDecl); 535 CurDecl = R.NextDecl; 536 } 537 538 return Result; 539 } 540 541 bool Sema::CodeSynthesisContext::isInstantiationRecord() const { 542 switch (Kind) { 543 case TemplateInstantiation: 544 case ExceptionSpecInstantiation: 545 case DefaultTemplateArgumentInstantiation: 546 case DefaultFunctionArgumentInstantiation: 547 case ExplicitTemplateArgumentSubstitution: 548 case DeducedTemplateArgumentSubstitution: 549 case PriorTemplateArgumentSubstitution: 550 case ConstraintsCheck: 551 case NestedRequirementConstraintsCheck: 552 return true; 553 554 case RequirementInstantiation: 555 case RequirementParameterInstantiation: 556 case DefaultTemplateArgumentChecking: 557 case DeclaringSpecialMember: 558 case DeclaringImplicitEqualityComparison: 559 case DefiningSynthesizedFunction: 560 case ExceptionSpecEvaluation: 561 case ConstraintSubstitution: 562 case ParameterMappingSubstitution: 563 case ConstraintNormalization: 564 case RewritingOperatorAsSpaceship: 565 case InitializingStructuredBinding: 566 case MarkingClassDllexported: 567 case BuildingBuiltinDumpStructCall: 568 case LambdaExpressionSubstitution: 569 case BuildingDeductionGuides: 570 case TypeAliasTemplateInstantiation: 571 return false; 572 573 // This function should never be called when Kind's value is Memoization. 574 case Memoization: 575 break; 576 } 577 578 llvm_unreachable("Invalid SynthesisKind!"); 579 } 580 581 Sema::InstantiatingTemplate::InstantiatingTemplate( 582 Sema &SemaRef, CodeSynthesisContext::SynthesisKind Kind, 583 SourceLocation PointOfInstantiation, SourceRange InstantiationRange, 584 Decl *Entity, NamedDecl *Template, ArrayRef<TemplateArgument> TemplateArgs, 585 sema::TemplateDeductionInfo *DeductionInfo) 586 : SemaRef(SemaRef) { 587 // Don't allow further instantiation if a fatal error and an uncompilable 588 // error have occurred. Any diagnostics we might have raised will not be 589 // visible, and we do not need to construct a correct AST. 590 if (SemaRef.Diags.hasFatalErrorOccurred() && 591 SemaRef.hasUncompilableErrorOccurred()) { 592 Invalid = true; 593 return; 594 } 595 Invalid = CheckInstantiationDepth(PointOfInstantiation, InstantiationRange); 596 if (!Invalid) { 597 CodeSynthesisContext Inst; 598 Inst.Kind = Kind; 599 Inst.PointOfInstantiation = PointOfInstantiation; 600 Inst.Entity = Entity; 601 Inst.Template = Template; 602 Inst.TemplateArgs = TemplateArgs.data(); 603 Inst.NumTemplateArgs = TemplateArgs.size(); 604 Inst.DeductionInfo = DeductionInfo; 605 Inst.InstantiationRange = InstantiationRange; 606 SemaRef.pushCodeSynthesisContext(Inst); 607 608 AlreadyInstantiating = !Inst.Entity ? false : 609 !SemaRef.InstantiatingSpecializations 610 .insert({Inst.Entity->getCanonicalDecl(), Inst.Kind}) 611 .second; 612 atTemplateBegin(SemaRef.TemplateInstCallbacks, SemaRef, Inst); 613 } 614 } 615 616 Sema::InstantiatingTemplate::InstantiatingTemplate( 617 Sema &SemaRef, SourceLocation PointOfInstantiation, Decl *Entity, 618 SourceRange InstantiationRange) 619 : InstantiatingTemplate(SemaRef, 620 CodeSynthesisContext::TemplateInstantiation, 621 PointOfInstantiation, InstantiationRange, Entity) {} 622 623 Sema::InstantiatingTemplate::InstantiatingTemplate( 624 Sema &SemaRef, SourceLocation PointOfInstantiation, FunctionDecl *Entity, 625 ExceptionSpecification, SourceRange InstantiationRange) 626 : InstantiatingTemplate( 627 SemaRef, CodeSynthesisContext::ExceptionSpecInstantiation, 628 PointOfInstantiation, InstantiationRange, Entity) {} 629 630 Sema::InstantiatingTemplate::InstantiatingTemplate( 631 Sema &SemaRef, SourceLocation PointOfInstantiation, TemplateParameter Param, 632 TemplateDecl *Template, ArrayRef<TemplateArgument> TemplateArgs, 633 SourceRange InstantiationRange) 634 : InstantiatingTemplate( 635 SemaRef, 636 CodeSynthesisContext::DefaultTemplateArgumentInstantiation, 637 PointOfInstantiation, InstantiationRange, getAsNamedDecl(Param), 638 Template, TemplateArgs) {} 639 640 Sema::InstantiatingTemplate::InstantiatingTemplate( 641 Sema &SemaRef, SourceLocation PointOfInstantiation, 642 FunctionTemplateDecl *FunctionTemplate, 643 ArrayRef<TemplateArgument> TemplateArgs, 644 CodeSynthesisContext::SynthesisKind Kind, 645 sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) 646 : InstantiatingTemplate(SemaRef, Kind, PointOfInstantiation, 647 InstantiationRange, FunctionTemplate, nullptr, 648 TemplateArgs, &DeductionInfo) { 649 assert(Kind == CodeSynthesisContext::ExplicitTemplateArgumentSubstitution || 650 Kind == CodeSynthesisContext::DeducedTemplateArgumentSubstitution || 651 Kind == CodeSynthesisContext::BuildingDeductionGuides); 652 } 653 654 Sema::InstantiatingTemplate::InstantiatingTemplate( 655 Sema &SemaRef, SourceLocation PointOfInstantiation, 656 TemplateDecl *Template, 657 ArrayRef<TemplateArgument> TemplateArgs, 658 sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) 659 : InstantiatingTemplate( 660 SemaRef, 661 CodeSynthesisContext::DeducedTemplateArgumentSubstitution, 662 PointOfInstantiation, InstantiationRange, Template, nullptr, 663 TemplateArgs, &DeductionInfo) {} 664 665 Sema::InstantiatingTemplate::InstantiatingTemplate( 666 Sema &SemaRef, SourceLocation PointOfInstantiation, 667 ClassTemplatePartialSpecializationDecl *PartialSpec, 668 ArrayRef<TemplateArgument> TemplateArgs, 669 sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) 670 : InstantiatingTemplate( 671 SemaRef, 672 CodeSynthesisContext::DeducedTemplateArgumentSubstitution, 673 PointOfInstantiation, InstantiationRange, PartialSpec, nullptr, 674 TemplateArgs, &DeductionInfo) {} 675 676 Sema::InstantiatingTemplate::InstantiatingTemplate( 677 Sema &SemaRef, SourceLocation PointOfInstantiation, 678 VarTemplatePartialSpecializationDecl *PartialSpec, 679 ArrayRef<TemplateArgument> TemplateArgs, 680 sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) 681 : InstantiatingTemplate( 682 SemaRef, 683 CodeSynthesisContext::DeducedTemplateArgumentSubstitution, 684 PointOfInstantiation, InstantiationRange, PartialSpec, nullptr, 685 TemplateArgs, &DeductionInfo) {} 686 687 Sema::InstantiatingTemplate::InstantiatingTemplate( 688 Sema &SemaRef, SourceLocation PointOfInstantiation, ParmVarDecl *Param, 689 ArrayRef<TemplateArgument> TemplateArgs, SourceRange InstantiationRange) 690 : InstantiatingTemplate( 691 SemaRef, 692 CodeSynthesisContext::DefaultFunctionArgumentInstantiation, 693 PointOfInstantiation, InstantiationRange, Param, nullptr, 694 TemplateArgs) {} 695 696 Sema::InstantiatingTemplate::InstantiatingTemplate( 697 Sema &SemaRef, SourceLocation PointOfInstantiation, NamedDecl *Template, 698 NonTypeTemplateParmDecl *Param, ArrayRef<TemplateArgument> TemplateArgs, 699 SourceRange InstantiationRange) 700 : InstantiatingTemplate( 701 SemaRef, 702 CodeSynthesisContext::PriorTemplateArgumentSubstitution, 703 PointOfInstantiation, InstantiationRange, Param, Template, 704 TemplateArgs) {} 705 706 Sema::InstantiatingTemplate::InstantiatingTemplate( 707 Sema &SemaRef, SourceLocation PointOfInstantiation, NamedDecl *Template, 708 TemplateTemplateParmDecl *Param, ArrayRef<TemplateArgument> TemplateArgs, 709 SourceRange InstantiationRange) 710 : InstantiatingTemplate( 711 SemaRef, 712 CodeSynthesisContext::PriorTemplateArgumentSubstitution, 713 PointOfInstantiation, InstantiationRange, Param, Template, 714 TemplateArgs) {} 715 716 Sema::InstantiatingTemplate::InstantiatingTemplate( 717 Sema &SemaRef, SourceLocation PointOfInstantiation, 718 TypeAliasTemplateDecl *Entity, ArrayRef<TemplateArgument> TemplateArgs, 719 SourceRange InstantiationRange) 720 : InstantiatingTemplate( 721 SemaRef, CodeSynthesisContext::TypeAliasTemplateInstantiation, 722 PointOfInstantiation, InstantiationRange, /*Entity=*/Entity, 723 /*Template=*/nullptr, TemplateArgs) {} 724 725 Sema::InstantiatingTemplate::InstantiatingTemplate( 726 Sema &SemaRef, SourceLocation PointOfInstantiation, TemplateDecl *Template, 727 NamedDecl *Param, ArrayRef<TemplateArgument> TemplateArgs, 728 SourceRange InstantiationRange) 729 : InstantiatingTemplate( 730 SemaRef, CodeSynthesisContext::DefaultTemplateArgumentChecking, 731 PointOfInstantiation, InstantiationRange, Param, Template, 732 TemplateArgs) {} 733 734 Sema::InstantiatingTemplate::InstantiatingTemplate( 735 Sema &SemaRef, SourceLocation PointOfInstantiation, 736 concepts::Requirement *Req, sema::TemplateDeductionInfo &DeductionInfo, 737 SourceRange InstantiationRange) 738 : InstantiatingTemplate( 739 SemaRef, CodeSynthesisContext::RequirementInstantiation, 740 PointOfInstantiation, InstantiationRange, /*Entity=*/nullptr, 741 /*Template=*/nullptr, /*TemplateArgs=*/std::nullopt, &DeductionInfo) { 742 } 743 744 Sema::InstantiatingTemplate::InstantiatingTemplate( 745 Sema &SemaRef, SourceLocation PointOfInstantiation, 746 concepts::NestedRequirement *Req, ConstraintsCheck, 747 SourceRange InstantiationRange) 748 : InstantiatingTemplate( 749 SemaRef, CodeSynthesisContext::NestedRequirementConstraintsCheck, 750 PointOfInstantiation, InstantiationRange, /*Entity=*/nullptr, 751 /*Template=*/nullptr, /*TemplateArgs=*/std::nullopt) {} 752 753 Sema::InstantiatingTemplate::InstantiatingTemplate( 754 Sema &SemaRef, SourceLocation PointOfInstantiation, const RequiresExpr *RE, 755 sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) 756 : InstantiatingTemplate( 757 SemaRef, CodeSynthesisContext::RequirementParameterInstantiation, 758 PointOfInstantiation, InstantiationRange, /*Entity=*/nullptr, 759 /*Template=*/nullptr, /*TemplateArgs=*/std::nullopt, &DeductionInfo) { 760 } 761 762 Sema::InstantiatingTemplate::InstantiatingTemplate( 763 Sema &SemaRef, SourceLocation PointOfInstantiation, 764 ConstraintsCheck, NamedDecl *Template, 765 ArrayRef<TemplateArgument> TemplateArgs, SourceRange InstantiationRange) 766 : InstantiatingTemplate( 767 SemaRef, CodeSynthesisContext::ConstraintsCheck, 768 PointOfInstantiation, InstantiationRange, Template, nullptr, 769 TemplateArgs) {} 770 771 Sema::InstantiatingTemplate::InstantiatingTemplate( 772 Sema &SemaRef, SourceLocation PointOfInstantiation, 773 ConstraintSubstitution, NamedDecl *Template, 774 sema::TemplateDeductionInfo &DeductionInfo, SourceRange InstantiationRange) 775 : InstantiatingTemplate( 776 SemaRef, CodeSynthesisContext::ConstraintSubstitution, 777 PointOfInstantiation, InstantiationRange, Template, nullptr, 778 {}, &DeductionInfo) {} 779 780 Sema::InstantiatingTemplate::InstantiatingTemplate( 781 Sema &SemaRef, SourceLocation PointOfInstantiation, 782 ConstraintNormalization, NamedDecl *Template, 783 SourceRange InstantiationRange) 784 : InstantiatingTemplate( 785 SemaRef, CodeSynthesisContext::ConstraintNormalization, 786 PointOfInstantiation, InstantiationRange, Template) {} 787 788 Sema::InstantiatingTemplate::InstantiatingTemplate( 789 Sema &SemaRef, SourceLocation PointOfInstantiation, 790 ParameterMappingSubstitution, NamedDecl *Template, 791 SourceRange InstantiationRange) 792 : InstantiatingTemplate( 793 SemaRef, CodeSynthesisContext::ParameterMappingSubstitution, 794 PointOfInstantiation, InstantiationRange, Template) {} 795 796 Sema::InstantiatingTemplate::InstantiatingTemplate( 797 Sema &SemaRef, SourceLocation PointOfInstantiation, TemplateDecl *Entity, 798 BuildingDeductionGuidesTag, SourceRange InstantiationRange) 799 : InstantiatingTemplate( 800 SemaRef, CodeSynthesisContext::BuildingDeductionGuides, 801 PointOfInstantiation, InstantiationRange, Entity) {} 802 803 804 void Sema::pushCodeSynthesisContext(CodeSynthesisContext Ctx) { 805 Ctx.SavedInNonInstantiationSFINAEContext = InNonInstantiationSFINAEContext; 806 InNonInstantiationSFINAEContext = false; 807 808 CodeSynthesisContexts.push_back(Ctx); 809 810 if (!Ctx.isInstantiationRecord()) 811 ++NonInstantiationEntries; 812 813 // Check to see if we're low on stack space. We can't do anything about this 814 // from here, but we can at least warn the user. 815 if (isStackNearlyExhausted()) 816 warnStackExhausted(Ctx.PointOfInstantiation); 817 } 818 819 void Sema::popCodeSynthesisContext() { 820 auto &Active = CodeSynthesisContexts.back(); 821 if (!Active.isInstantiationRecord()) { 822 assert(NonInstantiationEntries > 0); 823 --NonInstantiationEntries; 824 } 825 826 InNonInstantiationSFINAEContext = Active.SavedInNonInstantiationSFINAEContext; 827 828 // Name lookup no longer looks in this template's defining module. 829 assert(CodeSynthesisContexts.size() >= 830 CodeSynthesisContextLookupModules.size() && 831 "forgot to remove a lookup module for a template instantiation"); 832 if (CodeSynthesisContexts.size() == 833 CodeSynthesisContextLookupModules.size()) { 834 if (Module *M = CodeSynthesisContextLookupModules.back()) 835 LookupModulesCache.erase(M); 836 CodeSynthesisContextLookupModules.pop_back(); 837 } 838 839 // If we've left the code synthesis context for the current context stack, 840 // stop remembering that we've emitted that stack. 841 if (CodeSynthesisContexts.size() == 842 LastEmittedCodeSynthesisContextDepth) 843 LastEmittedCodeSynthesisContextDepth = 0; 844 845 CodeSynthesisContexts.pop_back(); 846 } 847 848 void Sema::InstantiatingTemplate::Clear() { 849 if (!Invalid) { 850 if (!AlreadyInstantiating) { 851 auto &Active = SemaRef.CodeSynthesisContexts.back(); 852 if (Active.Entity) 853 SemaRef.InstantiatingSpecializations.erase( 854 {Active.Entity->getCanonicalDecl(), Active.Kind}); 855 } 856 857 atTemplateEnd(SemaRef.TemplateInstCallbacks, SemaRef, 858 SemaRef.CodeSynthesisContexts.back()); 859 860 SemaRef.popCodeSynthesisContext(); 861 Invalid = true; 862 } 863 } 864 865 static std::string convertCallArgsToString(Sema &S, 866 llvm::ArrayRef<const Expr *> Args) { 867 std::string Result; 868 llvm::raw_string_ostream OS(Result); 869 llvm::ListSeparator Comma; 870 for (const Expr *Arg : Args) { 871 OS << Comma; 872 Arg->IgnoreParens()->printPretty(OS, nullptr, 873 S.Context.getPrintingPolicy()); 874 } 875 return Result; 876 } 877 878 bool Sema::InstantiatingTemplate::CheckInstantiationDepth( 879 SourceLocation PointOfInstantiation, 880 SourceRange InstantiationRange) { 881 assert(SemaRef.NonInstantiationEntries <= 882 SemaRef.CodeSynthesisContexts.size()); 883 if ((SemaRef.CodeSynthesisContexts.size() - 884 SemaRef.NonInstantiationEntries) 885 <= SemaRef.getLangOpts().InstantiationDepth) 886 return false; 887 888 SemaRef.Diag(PointOfInstantiation, 889 diag::err_template_recursion_depth_exceeded) 890 << SemaRef.getLangOpts().InstantiationDepth 891 << InstantiationRange; 892 SemaRef.Diag(PointOfInstantiation, diag::note_template_recursion_depth) 893 << SemaRef.getLangOpts().InstantiationDepth; 894 return true; 895 } 896 897 void Sema::PrintInstantiationStack() { 898 // Determine which template instantiations to skip, if any. 899 unsigned SkipStart = CodeSynthesisContexts.size(), SkipEnd = SkipStart; 900 unsigned Limit = Diags.getTemplateBacktraceLimit(); 901 if (Limit && Limit < CodeSynthesisContexts.size()) { 902 SkipStart = Limit / 2 + Limit % 2; 903 SkipEnd = CodeSynthesisContexts.size() - Limit / 2; 904 } 905 906 // FIXME: In all of these cases, we need to show the template arguments 907 unsigned InstantiationIdx = 0; 908 for (SmallVectorImpl<CodeSynthesisContext>::reverse_iterator 909 Active = CodeSynthesisContexts.rbegin(), 910 ActiveEnd = CodeSynthesisContexts.rend(); 911 Active != ActiveEnd; 912 ++Active, ++InstantiationIdx) { 913 // Skip this instantiation? 914 if (InstantiationIdx >= SkipStart && InstantiationIdx < SkipEnd) { 915 if (InstantiationIdx == SkipStart) { 916 // Note that we're skipping instantiations. 917 Diags.Report(Active->PointOfInstantiation, 918 diag::note_instantiation_contexts_suppressed) 919 << unsigned(CodeSynthesisContexts.size() - Limit); 920 } 921 continue; 922 } 923 924 switch (Active->Kind) { 925 case CodeSynthesisContext::TemplateInstantiation: { 926 Decl *D = Active->Entity; 927 if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(D)) { 928 unsigned DiagID = diag::note_template_member_class_here; 929 if (isa<ClassTemplateSpecializationDecl>(Record)) 930 DiagID = diag::note_template_class_instantiation_here; 931 Diags.Report(Active->PointOfInstantiation, DiagID) 932 << Record << Active->InstantiationRange; 933 } else if (FunctionDecl *Function = dyn_cast<FunctionDecl>(D)) { 934 unsigned DiagID; 935 if (Function->getPrimaryTemplate()) 936 DiagID = diag::note_function_template_spec_here; 937 else 938 DiagID = diag::note_template_member_function_here; 939 Diags.Report(Active->PointOfInstantiation, DiagID) 940 << Function 941 << Active->InstantiationRange; 942 } else if (VarDecl *VD = dyn_cast<VarDecl>(D)) { 943 Diags.Report(Active->PointOfInstantiation, 944 VD->isStaticDataMember()? 945 diag::note_template_static_data_member_def_here 946 : diag::note_template_variable_def_here) 947 << VD 948 << Active->InstantiationRange; 949 } else if (EnumDecl *ED = dyn_cast<EnumDecl>(D)) { 950 Diags.Report(Active->PointOfInstantiation, 951 diag::note_template_enum_def_here) 952 << ED 953 << Active->InstantiationRange; 954 } else if (FieldDecl *FD = dyn_cast<FieldDecl>(D)) { 955 Diags.Report(Active->PointOfInstantiation, 956 diag::note_template_nsdmi_here) 957 << FD << Active->InstantiationRange; 958 } else if (ClassTemplateDecl *CTD = dyn_cast<ClassTemplateDecl>(D)) { 959 Diags.Report(Active->PointOfInstantiation, 960 diag::note_template_class_instantiation_here) 961 << CTD << Active->InstantiationRange; 962 } 963 break; 964 } 965 966 case CodeSynthesisContext::DefaultTemplateArgumentInstantiation: { 967 TemplateDecl *Template = cast<TemplateDecl>(Active->Template); 968 SmallString<128> TemplateArgsStr; 969 llvm::raw_svector_ostream OS(TemplateArgsStr); 970 Template->printName(OS, getPrintingPolicy()); 971 printTemplateArgumentList(OS, Active->template_arguments(), 972 getPrintingPolicy()); 973 Diags.Report(Active->PointOfInstantiation, 974 diag::note_default_arg_instantiation_here) 975 << OS.str() 976 << Active->InstantiationRange; 977 break; 978 } 979 980 case CodeSynthesisContext::ExplicitTemplateArgumentSubstitution: { 981 FunctionTemplateDecl *FnTmpl = cast<FunctionTemplateDecl>(Active->Entity); 982 Diags.Report(Active->PointOfInstantiation, 983 diag::note_explicit_template_arg_substitution_here) 984 << FnTmpl 985 << getTemplateArgumentBindingsText(FnTmpl->getTemplateParameters(), 986 Active->TemplateArgs, 987 Active->NumTemplateArgs) 988 << Active->InstantiationRange; 989 break; 990 } 991 992 case CodeSynthesisContext::DeducedTemplateArgumentSubstitution: { 993 if (FunctionTemplateDecl *FnTmpl = 994 dyn_cast<FunctionTemplateDecl>(Active->Entity)) { 995 Diags.Report(Active->PointOfInstantiation, 996 diag::note_function_template_deduction_instantiation_here) 997 << FnTmpl 998 << getTemplateArgumentBindingsText(FnTmpl->getTemplateParameters(), 999 Active->TemplateArgs, 1000 Active->NumTemplateArgs) 1001 << Active->InstantiationRange; 1002 } else { 1003 bool IsVar = isa<VarTemplateDecl>(Active->Entity) || 1004 isa<VarTemplateSpecializationDecl>(Active->Entity); 1005 bool IsTemplate = false; 1006 TemplateParameterList *Params; 1007 if (auto *D = dyn_cast<TemplateDecl>(Active->Entity)) { 1008 IsTemplate = true; 1009 Params = D->getTemplateParameters(); 1010 } else if (auto *D = dyn_cast<ClassTemplatePartialSpecializationDecl>( 1011 Active->Entity)) { 1012 Params = D->getTemplateParameters(); 1013 } else if (auto *D = dyn_cast<VarTemplatePartialSpecializationDecl>( 1014 Active->Entity)) { 1015 Params = D->getTemplateParameters(); 1016 } else { 1017 llvm_unreachable("unexpected template kind"); 1018 } 1019 1020 Diags.Report(Active->PointOfInstantiation, 1021 diag::note_deduced_template_arg_substitution_here) 1022 << IsVar << IsTemplate << cast<NamedDecl>(Active->Entity) 1023 << getTemplateArgumentBindingsText(Params, Active->TemplateArgs, 1024 Active->NumTemplateArgs) 1025 << Active->InstantiationRange; 1026 } 1027 break; 1028 } 1029 1030 case CodeSynthesisContext::DefaultFunctionArgumentInstantiation: { 1031 ParmVarDecl *Param = cast<ParmVarDecl>(Active->Entity); 1032 FunctionDecl *FD = cast<FunctionDecl>(Param->getDeclContext()); 1033 1034 SmallString<128> TemplateArgsStr; 1035 llvm::raw_svector_ostream OS(TemplateArgsStr); 1036 FD->printName(OS, getPrintingPolicy()); 1037 printTemplateArgumentList(OS, Active->template_arguments(), 1038 getPrintingPolicy()); 1039 Diags.Report(Active->PointOfInstantiation, 1040 diag::note_default_function_arg_instantiation_here) 1041 << OS.str() 1042 << Active->InstantiationRange; 1043 break; 1044 } 1045 1046 case CodeSynthesisContext::PriorTemplateArgumentSubstitution: { 1047 NamedDecl *Parm = cast<NamedDecl>(Active->Entity); 1048 std::string Name; 1049 if (!Parm->getName().empty()) 1050 Name = std::string(" '") + Parm->getName().str() + "'"; 1051 1052 TemplateParameterList *TemplateParams = nullptr; 1053 if (TemplateDecl *Template = dyn_cast<TemplateDecl>(Active->Template)) 1054 TemplateParams = Template->getTemplateParameters(); 1055 else 1056 TemplateParams = 1057 cast<ClassTemplatePartialSpecializationDecl>(Active->Template) 1058 ->getTemplateParameters(); 1059 Diags.Report(Active->PointOfInstantiation, 1060 diag::note_prior_template_arg_substitution) 1061 << isa<TemplateTemplateParmDecl>(Parm) 1062 << Name 1063 << getTemplateArgumentBindingsText(TemplateParams, 1064 Active->TemplateArgs, 1065 Active->NumTemplateArgs) 1066 << Active->InstantiationRange; 1067 break; 1068 } 1069 1070 case CodeSynthesisContext::DefaultTemplateArgumentChecking: { 1071 TemplateParameterList *TemplateParams = nullptr; 1072 if (TemplateDecl *Template = dyn_cast<TemplateDecl>(Active->Template)) 1073 TemplateParams = Template->getTemplateParameters(); 1074 else 1075 TemplateParams = 1076 cast<ClassTemplatePartialSpecializationDecl>(Active->Template) 1077 ->getTemplateParameters(); 1078 1079 Diags.Report(Active->PointOfInstantiation, 1080 diag::note_template_default_arg_checking) 1081 << getTemplateArgumentBindingsText(TemplateParams, 1082 Active->TemplateArgs, 1083 Active->NumTemplateArgs) 1084 << Active->InstantiationRange; 1085 break; 1086 } 1087 1088 case CodeSynthesisContext::ExceptionSpecEvaluation: 1089 Diags.Report(Active->PointOfInstantiation, 1090 diag::note_evaluating_exception_spec_here) 1091 << cast<FunctionDecl>(Active->Entity); 1092 break; 1093 1094 case CodeSynthesisContext::ExceptionSpecInstantiation: 1095 Diags.Report(Active->PointOfInstantiation, 1096 diag::note_template_exception_spec_instantiation_here) 1097 << cast<FunctionDecl>(Active->Entity) 1098 << Active->InstantiationRange; 1099 break; 1100 1101 case CodeSynthesisContext::RequirementInstantiation: 1102 Diags.Report(Active->PointOfInstantiation, 1103 diag::note_template_requirement_instantiation_here) 1104 << Active->InstantiationRange; 1105 break; 1106 case CodeSynthesisContext::RequirementParameterInstantiation: 1107 Diags.Report(Active->PointOfInstantiation, 1108 diag::note_template_requirement_params_instantiation_here) 1109 << Active->InstantiationRange; 1110 break; 1111 1112 case CodeSynthesisContext::NestedRequirementConstraintsCheck: 1113 Diags.Report(Active->PointOfInstantiation, 1114 diag::note_nested_requirement_here) 1115 << Active->InstantiationRange; 1116 break; 1117 1118 case CodeSynthesisContext::DeclaringSpecialMember: 1119 Diags.Report(Active->PointOfInstantiation, 1120 diag::note_in_declaration_of_implicit_special_member) 1121 << cast<CXXRecordDecl>(Active->Entity) 1122 << llvm::to_underlying(Active->SpecialMember); 1123 break; 1124 1125 case CodeSynthesisContext::DeclaringImplicitEqualityComparison: 1126 Diags.Report(Active->Entity->getLocation(), 1127 diag::note_in_declaration_of_implicit_equality_comparison); 1128 break; 1129 1130 case CodeSynthesisContext::DefiningSynthesizedFunction: { 1131 // FIXME: For synthesized functions that are not defaulted, 1132 // produce a note. 1133 auto *FD = dyn_cast<FunctionDecl>(Active->Entity); 1134 DefaultedFunctionKind DFK = 1135 FD ? getDefaultedFunctionKind(FD) : DefaultedFunctionKind(); 1136 if (DFK.isSpecialMember()) { 1137 auto *MD = cast<CXXMethodDecl>(FD); 1138 Diags.Report(Active->PointOfInstantiation, 1139 diag::note_member_synthesized_at) 1140 << MD->isExplicitlyDefaulted() 1141 << llvm::to_underlying(DFK.asSpecialMember()) 1142 << Context.getTagDeclType(MD->getParent()); 1143 } else if (DFK.isComparison()) { 1144 QualType RecordType = FD->getParamDecl(0) 1145 ->getType() 1146 .getNonReferenceType() 1147 .getUnqualifiedType(); 1148 Diags.Report(Active->PointOfInstantiation, 1149 diag::note_comparison_synthesized_at) 1150 << (int)DFK.asComparison() << RecordType; 1151 } 1152 break; 1153 } 1154 1155 case CodeSynthesisContext::RewritingOperatorAsSpaceship: 1156 Diags.Report(Active->Entity->getLocation(), 1157 diag::note_rewriting_operator_as_spaceship); 1158 break; 1159 1160 case CodeSynthesisContext::InitializingStructuredBinding: 1161 Diags.Report(Active->PointOfInstantiation, 1162 diag::note_in_binding_decl_init) 1163 << cast<BindingDecl>(Active->Entity); 1164 break; 1165 1166 case CodeSynthesisContext::MarkingClassDllexported: 1167 Diags.Report(Active->PointOfInstantiation, 1168 diag::note_due_to_dllexported_class) 1169 << cast<CXXRecordDecl>(Active->Entity) << !getLangOpts().CPlusPlus11; 1170 break; 1171 1172 case CodeSynthesisContext::BuildingBuiltinDumpStructCall: 1173 Diags.Report(Active->PointOfInstantiation, 1174 diag::note_building_builtin_dump_struct_call) 1175 << convertCallArgsToString( 1176 *this, llvm::ArrayRef(Active->CallArgs, Active->NumCallArgs)); 1177 break; 1178 1179 case CodeSynthesisContext::Memoization: 1180 break; 1181 1182 case CodeSynthesisContext::LambdaExpressionSubstitution: 1183 Diags.Report(Active->PointOfInstantiation, 1184 diag::note_lambda_substitution_here); 1185 break; 1186 case CodeSynthesisContext::ConstraintsCheck: { 1187 unsigned DiagID = 0; 1188 if (!Active->Entity) { 1189 Diags.Report(Active->PointOfInstantiation, 1190 diag::note_nested_requirement_here) 1191 << Active->InstantiationRange; 1192 break; 1193 } 1194 if (isa<ConceptDecl>(Active->Entity)) 1195 DiagID = diag::note_concept_specialization_here; 1196 else if (isa<TemplateDecl>(Active->Entity)) 1197 DiagID = diag::note_checking_constraints_for_template_id_here; 1198 else if (isa<VarTemplatePartialSpecializationDecl>(Active->Entity)) 1199 DiagID = diag::note_checking_constraints_for_var_spec_id_here; 1200 else if (isa<ClassTemplatePartialSpecializationDecl>(Active->Entity)) 1201 DiagID = diag::note_checking_constraints_for_class_spec_id_here; 1202 else { 1203 assert(isa<FunctionDecl>(Active->Entity)); 1204 DiagID = diag::note_checking_constraints_for_function_here; 1205 } 1206 SmallString<128> TemplateArgsStr; 1207 llvm::raw_svector_ostream OS(TemplateArgsStr); 1208 cast<NamedDecl>(Active->Entity)->printName(OS, getPrintingPolicy()); 1209 if (!isa<FunctionDecl>(Active->Entity)) { 1210 printTemplateArgumentList(OS, Active->template_arguments(), 1211 getPrintingPolicy()); 1212 } 1213 Diags.Report(Active->PointOfInstantiation, DiagID) << OS.str() 1214 << Active->InstantiationRange; 1215 break; 1216 } 1217 case CodeSynthesisContext::ConstraintSubstitution: 1218 Diags.Report(Active->PointOfInstantiation, 1219 diag::note_constraint_substitution_here) 1220 << Active->InstantiationRange; 1221 break; 1222 case CodeSynthesisContext::ConstraintNormalization: 1223 Diags.Report(Active->PointOfInstantiation, 1224 diag::note_constraint_normalization_here) 1225 << cast<NamedDecl>(Active->Entity)->getName() 1226 << Active->InstantiationRange; 1227 break; 1228 case CodeSynthesisContext::ParameterMappingSubstitution: 1229 Diags.Report(Active->PointOfInstantiation, 1230 diag::note_parameter_mapping_substitution_here) 1231 << Active->InstantiationRange; 1232 break; 1233 case CodeSynthesisContext::BuildingDeductionGuides: 1234 Diags.Report(Active->PointOfInstantiation, 1235 diag::note_building_deduction_guide_here); 1236 break; 1237 case CodeSynthesisContext::TypeAliasTemplateInstantiation: 1238 Diags.Report(Active->PointOfInstantiation, 1239 diag::note_template_type_alias_instantiation_here) 1240 << cast<TypeAliasTemplateDecl>(Active->Entity) 1241 << Active->InstantiationRange; 1242 break; 1243 } 1244 } 1245 } 1246 1247 std::optional<TemplateDeductionInfo *> Sema::isSFINAEContext() const { 1248 if (InNonInstantiationSFINAEContext) 1249 return std::optional<TemplateDeductionInfo *>(nullptr); 1250 1251 for (SmallVectorImpl<CodeSynthesisContext>::const_reverse_iterator 1252 Active = CodeSynthesisContexts.rbegin(), 1253 ActiveEnd = CodeSynthesisContexts.rend(); 1254 Active != ActiveEnd; 1255 ++Active) 1256 { 1257 switch (Active->Kind) { 1258 case CodeSynthesisContext::TypeAliasTemplateInstantiation: 1259 // An instantiation of an alias template may or may not be a SFINAE 1260 // context, depending on what else is on the stack. 1261 if (isa<TypeAliasTemplateDecl>(Active->Entity)) 1262 break; 1263 [[fallthrough]]; 1264 case CodeSynthesisContext::TemplateInstantiation: 1265 case CodeSynthesisContext::DefaultFunctionArgumentInstantiation: 1266 case CodeSynthesisContext::ExceptionSpecInstantiation: 1267 case CodeSynthesisContext::ConstraintsCheck: 1268 case CodeSynthesisContext::ParameterMappingSubstitution: 1269 case CodeSynthesisContext::ConstraintNormalization: 1270 case CodeSynthesisContext::NestedRequirementConstraintsCheck: 1271 // This is a template instantiation, so there is no SFINAE. 1272 return std::nullopt; 1273 case CodeSynthesisContext::LambdaExpressionSubstitution: 1274 // [temp.deduct]p9 1275 // A lambda-expression appearing in a function type or a template 1276 // parameter is not considered part of the immediate context for the 1277 // purposes of template argument deduction. 1278 // CWG2672: A lambda-expression body is never in the immediate context. 1279 return std::nullopt; 1280 1281 case CodeSynthesisContext::DefaultTemplateArgumentInstantiation: 1282 case CodeSynthesisContext::PriorTemplateArgumentSubstitution: 1283 case CodeSynthesisContext::DefaultTemplateArgumentChecking: 1284 case CodeSynthesisContext::RewritingOperatorAsSpaceship: 1285 // A default template argument instantiation and substitution into 1286 // template parameters with arguments for prior parameters may or may 1287 // not be a SFINAE context; look further up the stack. 1288 break; 1289 1290 case CodeSynthesisContext::ExplicitTemplateArgumentSubstitution: 1291 case CodeSynthesisContext::DeducedTemplateArgumentSubstitution: 1292 // We're either substituting explicitly-specified template arguments, 1293 // deduced template arguments. SFINAE applies unless we are in a lambda 1294 // body, see [temp.deduct]p9. 1295 case CodeSynthesisContext::ConstraintSubstitution: 1296 case CodeSynthesisContext::RequirementInstantiation: 1297 case CodeSynthesisContext::RequirementParameterInstantiation: 1298 // SFINAE always applies in a constraint expression or a requirement 1299 // in a requires expression. 1300 assert(Active->DeductionInfo && "Missing deduction info pointer"); 1301 return Active->DeductionInfo; 1302 1303 case CodeSynthesisContext::DeclaringSpecialMember: 1304 case CodeSynthesisContext::DeclaringImplicitEqualityComparison: 1305 case CodeSynthesisContext::DefiningSynthesizedFunction: 1306 case CodeSynthesisContext::InitializingStructuredBinding: 1307 case CodeSynthesisContext::MarkingClassDllexported: 1308 case CodeSynthesisContext::BuildingBuiltinDumpStructCall: 1309 case CodeSynthesisContext::BuildingDeductionGuides: 1310 // This happens in a context unrelated to template instantiation, so 1311 // there is no SFINAE. 1312 return std::nullopt; 1313 1314 case CodeSynthesisContext::ExceptionSpecEvaluation: 1315 // FIXME: This should not be treated as a SFINAE context, because 1316 // we will cache an incorrect exception specification. However, clang 1317 // bootstrap relies this! See PR31692. 1318 break; 1319 1320 case CodeSynthesisContext::Memoization: 1321 break; 1322 } 1323 1324 // The inner context was transparent for SFINAE. If it occurred within a 1325 // non-instantiation SFINAE context, then SFINAE applies. 1326 if (Active->SavedInNonInstantiationSFINAEContext) 1327 return std::optional<TemplateDeductionInfo *>(nullptr); 1328 } 1329 1330 return std::nullopt; 1331 } 1332 1333 //===----------------------------------------------------------------------===/ 1334 // Template Instantiation for Types 1335 //===----------------------------------------------------------------------===/ 1336 namespace { 1337 class TemplateInstantiator : public TreeTransform<TemplateInstantiator> { 1338 const MultiLevelTemplateArgumentList &TemplateArgs; 1339 SourceLocation Loc; 1340 DeclarationName Entity; 1341 // Whether to evaluate the C++20 constraints or simply substitute into them. 1342 bool EvaluateConstraints = true; 1343 1344 public: 1345 typedef TreeTransform<TemplateInstantiator> inherited; 1346 1347 TemplateInstantiator(Sema &SemaRef, 1348 const MultiLevelTemplateArgumentList &TemplateArgs, 1349 SourceLocation Loc, DeclarationName Entity) 1350 : inherited(SemaRef), TemplateArgs(TemplateArgs), Loc(Loc), 1351 Entity(Entity) {} 1352 1353 void setEvaluateConstraints(bool B) { 1354 EvaluateConstraints = B; 1355 } 1356 bool getEvaluateConstraints() { 1357 return EvaluateConstraints; 1358 } 1359 1360 /// Determine whether the given type \p T has already been 1361 /// transformed. 1362 /// 1363 /// For the purposes of template instantiation, a type has already been 1364 /// transformed if it is NULL or if it is not dependent. 1365 bool AlreadyTransformed(QualType T); 1366 1367 /// Returns the location of the entity being instantiated, if known. 1368 SourceLocation getBaseLocation() { return Loc; } 1369 1370 /// Returns the name of the entity being instantiated, if any. 1371 DeclarationName getBaseEntity() { return Entity; } 1372 1373 /// Sets the "base" location and entity when that 1374 /// information is known based on another transformation. 1375 void setBase(SourceLocation Loc, DeclarationName Entity) { 1376 this->Loc = Loc; 1377 this->Entity = Entity; 1378 } 1379 1380 unsigned TransformTemplateDepth(unsigned Depth) { 1381 return TemplateArgs.getNewDepth(Depth); 1382 } 1383 1384 std::optional<unsigned> getPackIndex(TemplateArgument Pack) { 1385 int Index = getSema().ArgumentPackSubstitutionIndex; 1386 if (Index == -1) 1387 return std::nullopt; 1388 return Pack.pack_size() - 1 - Index; 1389 } 1390 1391 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 1392 SourceRange PatternRange, 1393 ArrayRef<UnexpandedParameterPack> Unexpanded, 1394 bool &ShouldExpand, bool &RetainExpansion, 1395 std::optional<unsigned> &NumExpansions) { 1396 return getSema().CheckParameterPacksForExpansion(EllipsisLoc, 1397 PatternRange, Unexpanded, 1398 TemplateArgs, 1399 ShouldExpand, 1400 RetainExpansion, 1401 NumExpansions); 1402 } 1403 1404 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { 1405 SemaRef.CurrentInstantiationScope->MakeInstantiatedLocalArgPack(Pack); 1406 } 1407 1408 TemplateArgument ForgetPartiallySubstitutedPack() { 1409 TemplateArgument Result; 1410 if (NamedDecl *PartialPack 1411 = SemaRef.CurrentInstantiationScope->getPartiallySubstitutedPack()){ 1412 MultiLevelTemplateArgumentList &TemplateArgs 1413 = const_cast<MultiLevelTemplateArgumentList &>(this->TemplateArgs); 1414 unsigned Depth, Index; 1415 std::tie(Depth, Index) = getDepthAndIndex(PartialPack); 1416 if (TemplateArgs.hasTemplateArgument(Depth, Index)) { 1417 Result = TemplateArgs(Depth, Index); 1418 TemplateArgs.setArgument(Depth, Index, TemplateArgument()); 1419 } 1420 } 1421 1422 return Result; 1423 } 1424 1425 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { 1426 if (Arg.isNull()) 1427 return; 1428 1429 if (NamedDecl *PartialPack 1430 = SemaRef.CurrentInstantiationScope->getPartiallySubstitutedPack()){ 1431 MultiLevelTemplateArgumentList &TemplateArgs 1432 = const_cast<MultiLevelTemplateArgumentList &>(this->TemplateArgs); 1433 unsigned Depth, Index; 1434 std::tie(Depth, Index) = getDepthAndIndex(PartialPack); 1435 TemplateArgs.setArgument(Depth, Index, Arg); 1436 } 1437 } 1438 1439 /// Transform the given declaration by instantiating a reference to 1440 /// this declaration. 1441 Decl *TransformDecl(SourceLocation Loc, Decl *D); 1442 1443 void transformAttrs(Decl *Old, Decl *New) { 1444 SemaRef.InstantiateAttrs(TemplateArgs, Old, New); 1445 } 1446 1447 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> NewDecls) { 1448 if (Old->isParameterPack()) { 1449 SemaRef.CurrentInstantiationScope->MakeInstantiatedLocalArgPack(Old); 1450 for (auto *New : NewDecls) 1451 SemaRef.CurrentInstantiationScope->InstantiatedLocalPackArg( 1452 Old, cast<VarDecl>(New)); 1453 return; 1454 } 1455 1456 assert(NewDecls.size() == 1 && 1457 "should only have multiple expansions for a pack"); 1458 Decl *New = NewDecls.front(); 1459 1460 // If we've instantiated the call operator of a lambda or the call 1461 // operator template of a generic lambda, update the "instantiation of" 1462 // information. 1463 auto *NewMD = dyn_cast<CXXMethodDecl>(New); 1464 if (NewMD && isLambdaCallOperator(NewMD)) { 1465 auto *OldMD = dyn_cast<CXXMethodDecl>(Old); 1466 if (auto *NewTD = NewMD->getDescribedFunctionTemplate()) 1467 NewTD->setInstantiatedFromMemberTemplate( 1468 OldMD->getDescribedFunctionTemplate()); 1469 else 1470 NewMD->setInstantiationOfMemberFunction(OldMD, 1471 TSK_ImplicitInstantiation); 1472 } 1473 1474 SemaRef.CurrentInstantiationScope->InstantiatedLocal(Old, New); 1475 1476 // We recreated a local declaration, but not by instantiating it. There 1477 // may be pending dependent diagnostics to produce. 1478 if (auto *DC = dyn_cast<DeclContext>(Old); 1479 DC && DC->isDependentContext() && DC->isFunctionOrMethod()) 1480 SemaRef.PerformDependentDiagnostics(DC, TemplateArgs); 1481 } 1482 1483 /// Transform the definition of the given declaration by 1484 /// instantiating it. 1485 Decl *TransformDefinition(SourceLocation Loc, Decl *D); 1486 1487 /// Transform the first qualifier within a scope by instantiating the 1488 /// declaration. 1489 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc); 1490 1491 bool TransformExceptionSpec(SourceLocation Loc, 1492 FunctionProtoType::ExceptionSpecInfo &ESI, 1493 SmallVectorImpl<QualType> &Exceptions, 1494 bool &Changed); 1495 1496 /// Rebuild the exception declaration and register the declaration 1497 /// as an instantiated local. 1498 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 1499 TypeSourceInfo *Declarator, 1500 SourceLocation StartLoc, 1501 SourceLocation NameLoc, 1502 IdentifierInfo *Name); 1503 1504 /// Rebuild the Objective-C exception declaration and register the 1505 /// declaration as an instantiated local. 1506 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1507 TypeSourceInfo *TSInfo, QualType T); 1508 1509 /// Check for tag mismatches when instantiating an 1510 /// elaborated type. 1511 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1512 ElaboratedTypeKeyword Keyword, 1513 NestedNameSpecifierLoc QualifierLoc, 1514 QualType T); 1515 1516 TemplateName 1517 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 1518 SourceLocation NameLoc, 1519 QualType ObjectType = QualType(), 1520 NamedDecl *FirstQualifierInScope = nullptr, 1521 bool AllowInjectedClassName = false); 1522 1523 const CXXAssumeAttr *TransformCXXAssumeAttr(const CXXAssumeAttr *AA); 1524 const LoopHintAttr *TransformLoopHintAttr(const LoopHintAttr *LH); 1525 const NoInlineAttr *TransformStmtNoInlineAttr(const Stmt *OrigS, 1526 const Stmt *InstS, 1527 const NoInlineAttr *A); 1528 const AlwaysInlineAttr * 1529 TransformStmtAlwaysInlineAttr(const Stmt *OrigS, const Stmt *InstS, 1530 const AlwaysInlineAttr *A); 1531 const CodeAlignAttr *TransformCodeAlignAttr(const CodeAlignAttr *CA); 1532 ExprResult TransformPredefinedExpr(PredefinedExpr *E); 1533 ExprResult TransformDeclRefExpr(DeclRefExpr *E); 1534 ExprResult TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E); 1535 1536 ExprResult TransformTemplateParmRefExpr(DeclRefExpr *E, 1537 NonTypeTemplateParmDecl *D); 1538 ExprResult TransformSubstNonTypeTemplateParmPackExpr( 1539 SubstNonTypeTemplateParmPackExpr *E); 1540 ExprResult TransformSubstNonTypeTemplateParmExpr( 1541 SubstNonTypeTemplateParmExpr *E); 1542 1543 /// Rebuild a DeclRefExpr for a VarDecl reference. 1544 ExprResult RebuildVarDeclRefExpr(VarDecl *PD, SourceLocation Loc); 1545 1546 /// Transform a reference to a function or init-capture parameter pack. 1547 ExprResult TransformFunctionParmPackRefExpr(DeclRefExpr *E, VarDecl *PD); 1548 1549 /// Transform a FunctionParmPackExpr which was built when we couldn't 1550 /// expand a function parameter pack reference which refers to an expanded 1551 /// pack. 1552 ExprResult TransformFunctionParmPackExpr(FunctionParmPackExpr *E); 1553 1554 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 1555 FunctionProtoTypeLoc TL) { 1556 // Call the base version; it will forward to our overridden version below. 1557 return inherited::TransformFunctionProtoType(TLB, TL); 1558 } 1559 1560 QualType TransformInjectedClassNameType(TypeLocBuilder &TLB, 1561 InjectedClassNameTypeLoc TL) { 1562 auto Type = inherited::TransformInjectedClassNameType(TLB, TL); 1563 // Special case for transforming a deduction guide, we return a 1564 // transformed TemplateSpecializationType. 1565 if (Type.isNull() && 1566 SemaRef.CodeSynthesisContexts.back().Kind == 1567 Sema::CodeSynthesisContext::BuildingDeductionGuides) { 1568 // Return a TemplateSpecializationType for transforming a deduction 1569 // guide. 1570 if (auto *ICT = TL.getType()->getAs<InjectedClassNameType>()) { 1571 auto Type = 1572 inherited::TransformType(ICT->getInjectedSpecializationType()); 1573 TLB.pushTrivial(SemaRef.Context, Type, TL.getNameLoc()); 1574 return Type; 1575 } 1576 } 1577 return Type; 1578 } 1579 // Override the default version to handle a rewrite-template-arg-pack case 1580 // for building a deduction guide. 1581 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 1582 TemplateArgumentLoc &Output, 1583 bool Uneval = false) { 1584 const TemplateArgument &Arg = Input.getArgument(); 1585 std::vector<TemplateArgument> TArgs; 1586 switch (Arg.getKind()) { 1587 case TemplateArgument::Pack: 1588 // Literally rewrite the template argument pack, instead of unpacking 1589 // it. 1590 for (auto &pack : Arg.getPackAsArray()) { 1591 TemplateArgumentLoc Input = SemaRef.getTrivialTemplateArgumentLoc( 1592 pack, QualType(), SourceLocation{}); 1593 TemplateArgumentLoc Output; 1594 if (SemaRef.SubstTemplateArgument(Input, TemplateArgs, Output)) 1595 return true; // fails 1596 TArgs.push_back(Output.getArgument()); 1597 } 1598 Output = SemaRef.getTrivialTemplateArgumentLoc( 1599 TemplateArgument(llvm::ArrayRef(TArgs).copy(SemaRef.Context)), 1600 QualType(), SourceLocation{}); 1601 return false; 1602 default: 1603 break; 1604 } 1605 return inherited::TransformTemplateArgument(Input, Output, Uneval); 1606 } 1607 1608 template<typename Fn> 1609 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 1610 FunctionProtoTypeLoc TL, 1611 CXXRecordDecl *ThisContext, 1612 Qualifiers ThisTypeQuals, 1613 Fn TransformExceptionSpec); 1614 1615 ParmVarDecl * 1616 TransformFunctionTypeParam(ParmVarDecl *OldParm, int indexAdjustment, 1617 std::optional<unsigned> NumExpansions, 1618 bool ExpectParameterPack); 1619 1620 using inherited::TransformTemplateTypeParmType; 1621 /// Transforms a template type parameter type by performing 1622 /// substitution of the corresponding template type argument. 1623 QualType TransformTemplateTypeParmType(TypeLocBuilder &TLB, 1624 TemplateTypeParmTypeLoc TL, 1625 bool SuppressObjCLifetime); 1626 1627 QualType BuildSubstTemplateTypeParmType( 1628 TypeLocBuilder &TLB, bool SuppressObjCLifetime, bool Final, 1629 Decl *AssociatedDecl, unsigned Index, std::optional<unsigned> PackIndex, 1630 TemplateArgument Arg, SourceLocation NameLoc); 1631 1632 /// Transforms an already-substituted template type parameter pack 1633 /// into either itself (if we aren't substituting into its pack expansion) 1634 /// or the appropriate substituted argument. 1635 using inherited::TransformSubstTemplateTypeParmPackType; 1636 QualType 1637 TransformSubstTemplateTypeParmPackType(TypeLocBuilder &TLB, 1638 SubstTemplateTypeParmPackTypeLoc TL, 1639 bool SuppressObjCLifetime); 1640 1641 CXXRecordDecl::LambdaDependencyKind 1642 ComputeLambdaDependency(LambdaScopeInfo *LSI) { 1643 if (auto TypeAlias = 1644 TemplateInstArgsHelpers::getEnclosingTypeAliasTemplateDecl( 1645 getSema()); 1646 TypeAlias && TemplateInstArgsHelpers::isLambdaEnclosedByTypeAliasDecl( 1647 LSI->CallOperator, TypeAlias.PrimaryTypeAliasDecl)) { 1648 unsigned TypeAliasDeclDepth = TypeAlias.Template->getTemplateDepth(); 1649 if (TypeAliasDeclDepth >= TemplateArgs.getNumSubstitutedLevels()) 1650 return CXXRecordDecl::LambdaDependencyKind::LDK_AlwaysDependent; 1651 for (const TemplateArgument &TA : TypeAlias.AssociatedTemplateArguments) 1652 if (TA.isDependent()) 1653 return CXXRecordDecl::LambdaDependencyKind::LDK_AlwaysDependent; 1654 } 1655 return inherited::ComputeLambdaDependency(LSI); 1656 } 1657 1658 ExprResult TransformLambdaExpr(LambdaExpr *E) { 1659 LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true); 1660 Sema::ConstraintEvalRAII<TemplateInstantiator> RAII(*this); 1661 1662 ExprResult Result = inherited::TransformLambdaExpr(E); 1663 if (Result.isInvalid()) 1664 return Result; 1665 1666 CXXMethodDecl *MD = Result.getAs<LambdaExpr>()->getCallOperator(); 1667 for (ParmVarDecl *PVD : MD->parameters()) { 1668 assert(PVD && "null in a parameter list"); 1669 if (!PVD->hasDefaultArg()) 1670 continue; 1671 Expr *UninstExpr = PVD->getUninstantiatedDefaultArg(); 1672 // FIXME: Obtain the source location for the '=' token. 1673 SourceLocation EqualLoc = UninstExpr->getBeginLoc(); 1674 if (SemaRef.SubstDefaultArgument(EqualLoc, PVD, TemplateArgs)) { 1675 // If substitution fails, the default argument is set to a 1676 // RecoveryExpr that wraps the uninstantiated default argument so 1677 // that downstream diagnostics are omitted. 1678 ExprResult ErrorResult = SemaRef.CreateRecoveryExpr( 1679 UninstExpr->getBeginLoc(), UninstExpr->getEndLoc(), 1680 { UninstExpr }, UninstExpr->getType()); 1681 if (ErrorResult.isUsable()) 1682 PVD->setDefaultArg(ErrorResult.get()); 1683 } 1684 } 1685 1686 return Result; 1687 } 1688 1689 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body) { 1690 // Currently, we instantiate the body when instantiating the lambda 1691 // expression. However, `EvaluateConstraints` is disabled during the 1692 // instantiation of the lambda expression, causing the instantiation 1693 // failure of the return type requirement in the body. If p0588r1 is fully 1694 // implemented, the body will be lazily instantiated, and this problem 1695 // will not occur. Here, `EvaluateConstraints` is temporarily set to 1696 // `true` to temporarily fix this issue. 1697 // FIXME: This temporary fix can be removed after fully implementing 1698 // p0588r1. 1699 bool Prev = EvaluateConstraints; 1700 EvaluateConstraints = true; 1701 StmtResult Stmt = inherited::TransformLambdaBody(E, Body); 1702 EvaluateConstraints = Prev; 1703 return Stmt; 1704 } 1705 1706 ExprResult TransformRequiresExpr(RequiresExpr *E) { 1707 LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true); 1708 ExprResult TransReq = inherited::TransformRequiresExpr(E); 1709 if (TransReq.isInvalid()) 1710 return TransReq; 1711 assert(TransReq.get() != E && 1712 "Do not change value of isSatisfied for the existing expression. " 1713 "Create a new expression instead."); 1714 if (E->getBody()->isDependentContext()) { 1715 Sema::SFINAETrap Trap(SemaRef); 1716 // We recreate the RequiresExpr body, but not by instantiating it. 1717 // Produce pending diagnostics for dependent access check. 1718 SemaRef.PerformDependentDiagnostics(E->getBody(), TemplateArgs); 1719 // FIXME: Store SFINAE diagnostics in RequiresExpr for diagnosis. 1720 if (Trap.hasErrorOccurred()) 1721 TransReq.getAs<RequiresExpr>()->setSatisfied(false); 1722 } 1723 return TransReq; 1724 } 1725 1726 bool TransformRequiresExprRequirements( 1727 ArrayRef<concepts::Requirement *> Reqs, 1728 SmallVectorImpl<concepts::Requirement *> &Transformed) { 1729 bool SatisfactionDetermined = false; 1730 for (concepts::Requirement *Req : Reqs) { 1731 concepts::Requirement *TransReq = nullptr; 1732 if (!SatisfactionDetermined) { 1733 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 1734 TransReq = TransformTypeRequirement(TypeReq); 1735 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 1736 TransReq = TransformExprRequirement(ExprReq); 1737 else 1738 TransReq = TransformNestedRequirement( 1739 cast<concepts::NestedRequirement>(Req)); 1740 if (!TransReq) 1741 return true; 1742 if (!TransReq->isDependent() && !TransReq->isSatisfied()) 1743 // [expr.prim.req]p6 1744 // [...] The substitution and semantic constraint checking 1745 // proceeds in lexical order and stops when a condition that 1746 // determines the result of the requires-expression is 1747 // encountered. [..] 1748 SatisfactionDetermined = true; 1749 } else 1750 TransReq = Req; 1751 Transformed.push_back(TransReq); 1752 } 1753 return false; 1754 } 1755 1756 TemplateParameterList *TransformTemplateParameterList( 1757 TemplateParameterList *OrigTPL) { 1758 if (!OrigTPL || !OrigTPL->size()) return OrigTPL; 1759 1760 DeclContext *Owner = OrigTPL->getParam(0)->getDeclContext(); 1761 TemplateDeclInstantiator DeclInstantiator(getSema(), 1762 /* DeclContext *Owner */ Owner, TemplateArgs); 1763 DeclInstantiator.setEvaluateConstraints(EvaluateConstraints); 1764 return DeclInstantiator.SubstTemplateParams(OrigTPL); 1765 } 1766 1767 concepts::TypeRequirement * 1768 TransformTypeRequirement(concepts::TypeRequirement *Req); 1769 concepts::ExprRequirement * 1770 TransformExprRequirement(concepts::ExprRequirement *Req); 1771 concepts::NestedRequirement * 1772 TransformNestedRequirement(concepts::NestedRequirement *Req); 1773 ExprResult TransformRequiresTypeParams( 1774 SourceLocation KWLoc, SourceLocation RBraceLoc, const RequiresExpr *RE, 1775 RequiresExprBodyDecl *Body, ArrayRef<ParmVarDecl *> Params, 1776 SmallVectorImpl<QualType> &PTypes, 1777 SmallVectorImpl<ParmVarDecl *> &TransParams, 1778 Sema::ExtParameterInfoBuilder &PInfos); 1779 1780 private: 1781 ExprResult 1782 transformNonTypeTemplateParmRef(Decl *AssociatedDecl, 1783 const NonTypeTemplateParmDecl *parm, 1784 SourceLocation loc, TemplateArgument arg, 1785 std::optional<unsigned> PackIndex); 1786 }; 1787 } 1788 1789 bool TemplateInstantiator::AlreadyTransformed(QualType T) { 1790 if (T.isNull()) 1791 return true; 1792 1793 if (T->isInstantiationDependentType() || T->isVariablyModifiedType()) 1794 return false; 1795 1796 getSema().MarkDeclarationsReferencedInType(Loc, T); 1797 return true; 1798 } 1799 1800 static TemplateArgument 1801 getPackSubstitutedTemplateArgument(Sema &S, TemplateArgument Arg) { 1802 assert(S.ArgumentPackSubstitutionIndex >= 0); 1803 assert(S.ArgumentPackSubstitutionIndex < (int)Arg.pack_size()); 1804 Arg = Arg.pack_begin()[S.ArgumentPackSubstitutionIndex]; 1805 if (Arg.isPackExpansion()) 1806 Arg = Arg.getPackExpansionPattern(); 1807 return Arg; 1808 } 1809 1810 Decl *TemplateInstantiator::TransformDecl(SourceLocation Loc, Decl *D) { 1811 if (!D) 1812 return nullptr; 1813 1814 if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(D)) { 1815 if (TTP->getDepth() < TemplateArgs.getNumLevels()) { 1816 // If the corresponding template argument is NULL or non-existent, it's 1817 // because we are performing instantiation from explicitly-specified 1818 // template arguments in a function template, but there were some 1819 // arguments left unspecified. 1820 if (!TemplateArgs.hasTemplateArgument(TTP->getDepth(), 1821 TTP->getPosition())) 1822 return D; 1823 1824 TemplateArgument Arg = TemplateArgs(TTP->getDepth(), TTP->getPosition()); 1825 1826 if (TTP->isParameterPack()) { 1827 assert(Arg.getKind() == TemplateArgument::Pack && 1828 "Missing argument pack"); 1829 Arg = getPackSubstitutedTemplateArgument(getSema(), Arg); 1830 } 1831 1832 TemplateName Template = Arg.getAsTemplate(); 1833 assert(!Template.isNull() && Template.getAsTemplateDecl() && 1834 "Wrong kind of template template argument"); 1835 return Template.getAsTemplateDecl(); 1836 } 1837 1838 // Fall through to find the instantiated declaration for this template 1839 // template parameter. 1840 } 1841 1842 return SemaRef.FindInstantiatedDecl(Loc, cast<NamedDecl>(D), TemplateArgs); 1843 } 1844 1845 Decl *TemplateInstantiator::TransformDefinition(SourceLocation Loc, Decl *D) { 1846 Decl *Inst = getSema().SubstDecl(D, getSema().CurContext, TemplateArgs); 1847 if (!Inst) 1848 return nullptr; 1849 1850 getSema().CurrentInstantiationScope->InstantiatedLocal(D, Inst); 1851 return Inst; 1852 } 1853 1854 bool TemplateInstantiator::TransformExceptionSpec( 1855 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 1856 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 1857 if (ESI.Type == EST_Uninstantiated) { 1858 ESI.instantiate(); 1859 Changed = true; 1860 } 1861 return inherited::TransformExceptionSpec(Loc, ESI, Exceptions, Changed); 1862 } 1863 1864 NamedDecl * 1865 TemplateInstantiator::TransformFirstQualifierInScope(NamedDecl *D, 1866 SourceLocation Loc) { 1867 // If the first part of the nested-name-specifier was a template type 1868 // parameter, instantiate that type parameter down to a tag type. 1869 if (TemplateTypeParmDecl *TTPD = dyn_cast_or_null<TemplateTypeParmDecl>(D)) { 1870 const TemplateTypeParmType *TTP 1871 = cast<TemplateTypeParmType>(getSema().Context.getTypeDeclType(TTPD)); 1872 1873 if (TTP->getDepth() < TemplateArgs.getNumLevels()) { 1874 // FIXME: This needs testing w/ member access expressions. 1875 TemplateArgument Arg = TemplateArgs(TTP->getDepth(), TTP->getIndex()); 1876 1877 if (TTP->isParameterPack()) { 1878 assert(Arg.getKind() == TemplateArgument::Pack && 1879 "Missing argument pack"); 1880 1881 if (getSema().ArgumentPackSubstitutionIndex == -1) 1882 return nullptr; 1883 1884 Arg = getPackSubstitutedTemplateArgument(getSema(), Arg); 1885 } 1886 1887 QualType T = Arg.getAsType(); 1888 if (T.isNull()) 1889 return cast_or_null<NamedDecl>(TransformDecl(Loc, D)); 1890 1891 if (const TagType *Tag = T->getAs<TagType>()) 1892 return Tag->getDecl(); 1893 1894 // The resulting type is not a tag; complain. 1895 getSema().Diag(Loc, diag::err_nested_name_spec_non_tag) << T; 1896 return nullptr; 1897 } 1898 } 1899 1900 return cast_or_null<NamedDecl>(TransformDecl(Loc, D)); 1901 } 1902 1903 VarDecl * 1904 TemplateInstantiator::RebuildExceptionDecl(VarDecl *ExceptionDecl, 1905 TypeSourceInfo *Declarator, 1906 SourceLocation StartLoc, 1907 SourceLocation NameLoc, 1908 IdentifierInfo *Name) { 1909 VarDecl *Var = inherited::RebuildExceptionDecl(ExceptionDecl, Declarator, 1910 StartLoc, NameLoc, Name); 1911 if (Var) 1912 getSema().CurrentInstantiationScope->InstantiatedLocal(ExceptionDecl, Var); 1913 return Var; 1914 } 1915 1916 VarDecl *TemplateInstantiator::RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1917 TypeSourceInfo *TSInfo, 1918 QualType T) { 1919 VarDecl *Var = inherited::RebuildObjCExceptionDecl(ExceptionDecl, TSInfo, T); 1920 if (Var) 1921 getSema().CurrentInstantiationScope->InstantiatedLocal(ExceptionDecl, Var); 1922 return Var; 1923 } 1924 1925 QualType 1926 TemplateInstantiator::RebuildElaboratedType(SourceLocation KeywordLoc, 1927 ElaboratedTypeKeyword Keyword, 1928 NestedNameSpecifierLoc QualifierLoc, 1929 QualType T) { 1930 if (const TagType *TT = T->getAs<TagType>()) { 1931 TagDecl* TD = TT->getDecl(); 1932 1933 SourceLocation TagLocation = KeywordLoc; 1934 1935 IdentifierInfo *Id = TD->getIdentifier(); 1936 1937 // TODO: should we even warn on struct/class mismatches for this? Seems 1938 // like it's likely to produce a lot of spurious errors. 1939 if (Id && Keyword != ElaboratedTypeKeyword::None && 1940 Keyword != ElaboratedTypeKeyword::Typename) { 1941 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1942 if (!SemaRef.isAcceptableTagRedeclaration(TD, Kind, /*isDefinition*/false, 1943 TagLocation, Id)) { 1944 SemaRef.Diag(TagLocation, diag::err_use_with_wrong_tag) 1945 << Id 1946 << FixItHint::CreateReplacement(SourceRange(TagLocation), 1947 TD->getKindName()); 1948 SemaRef.Diag(TD->getLocation(), diag::note_previous_use); 1949 } 1950 } 1951 } 1952 1953 return inherited::RebuildElaboratedType(KeywordLoc, Keyword, QualifierLoc, T); 1954 } 1955 1956 TemplateName TemplateInstantiator::TransformTemplateName( 1957 CXXScopeSpec &SS, TemplateName Name, SourceLocation NameLoc, 1958 QualType ObjectType, NamedDecl *FirstQualifierInScope, 1959 bool AllowInjectedClassName) { 1960 if (TemplateTemplateParmDecl *TTP 1961 = dyn_cast_or_null<TemplateTemplateParmDecl>(Name.getAsTemplateDecl())) { 1962 if (TTP->getDepth() < TemplateArgs.getNumLevels()) { 1963 // If the corresponding template argument is NULL or non-existent, it's 1964 // because we are performing instantiation from explicitly-specified 1965 // template arguments in a function template, but there were some 1966 // arguments left unspecified. 1967 if (!TemplateArgs.hasTemplateArgument(TTP->getDepth(), 1968 TTP->getPosition())) 1969 return Name; 1970 1971 TemplateArgument Arg = TemplateArgs(TTP->getDepth(), TTP->getPosition()); 1972 1973 if (TemplateArgs.isRewrite()) { 1974 // We're rewriting the template parameter as a reference to another 1975 // template parameter. 1976 if (Arg.getKind() == TemplateArgument::Pack) { 1977 assert(Arg.pack_size() == 1 && Arg.pack_begin()->isPackExpansion() && 1978 "unexpected pack arguments in template rewrite"); 1979 Arg = Arg.pack_begin()->getPackExpansionPattern(); 1980 } 1981 assert(Arg.getKind() == TemplateArgument::Template && 1982 "unexpected nontype template argument kind in template rewrite"); 1983 return Arg.getAsTemplate(); 1984 } 1985 1986 auto [AssociatedDecl, Final] = 1987 TemplateArgs.getAssociatedDecl(TTP->getDepth()); 1988 std::optional<unsigned> PackIndex; 1989 if (TTP->isParameterPack()) { 1990 assert(Arg.getKind() == TemplateArgument::Pack && 1991 "Missing argument pack"); 1992 1993 if (getSema().ArgumentPackSubstitutionIndex == -1) { 1994 // We have the template argument pack to substitute, but we're not 1995 // actually expanding the enclosing pack expansion yet. So, just 1996 // keep the entire argument pack. 1997 return getSema().Context.getSubstTemplateTemplateParmPack( 1998 Arg, AssociatedDecl, TTP->getIndex(), Final); 1999 } 2000 2001 PackIndex = getPackIndex(Arg); 2002 Arg = getPackSubstitutedTemplateArgument(getSema(), Arg); 2003 } 2004 2005 TemplateName Template = Arg.getAsTemplate(); 2006 assert(!Template.isNull() && "Null template template argument"); 2007 2008 if (Final) 2009 return Template; 2010 return getSema().Context.getSubstTemplateTemplateParm( 2011 Template, AssociatedDecl, TTP->getIndex(), PackIndex); 2012 } 2013 } 2014 2015 if (SubstTemplateTemplateParmPackStorage *SubstPack 2016 = Name.getAsSubstTemplateTemplateParmPack()) { 2017 if (getSema().ArgumentPackSubstitutionIndex == -1) 2018 return Name; 2019 2020 TemplateArgument Pack = SubstPack->getArgumentPack(); 2021 TemplateName Template = 2022 getPackSubstitutedTemplateArgument(getSema(), Pack).getAsTemplate(); 2023 if (SubstPack->getFinal()) 2024 return Template; 2025 return getSema().Context.getSubstTemplateTemplateParm( 2026 Template, SubstPack->getAssociatedDecl(), SubstPack->getIndex(), 2027 getPackIndex(Pack)); 2028 } 2029 2030 return inherited::TransformTemplateName(SS, Name, NameLoc, ObjectType, 2031 FirstQualifierInScope, 2032 AllowInjectedClassName); 2033 } 2034 2035 ExprResult 2036 TemplateInstantiator::TransformPredefinedExpr(PredefinedExpr *E) { 2037 if (!E->isTypeDependent()) 2038 return E; 2039 2040 return getSema().BuildPredefinedExpr(E->getLocation(), E->getIdentKind()); 2041 } 2042 2043 ExprResult 2044 TemplateInstantiator::TransformTemplateParmRefExpr(DeclRefExpr *E, 2045 NonTypeTemplateParmDecl *NTTP) { 2046 // If the corresponding template argument is NULL or non-existent, it's 2047 // because we are performing instantiation from explicitly-specified 2048 // template arguments in a function template, but there were some 2049 // arguments left unspecified. 2050 if (!TemplateArgs.hasTemplateArgument(NTTP->getDepth(), 2051 NTTP->getPosition())) 2052 return E; 2053 2054 TemplateArgument Arg = TemplateArgs(NTTP->getDepth(), NTTP->getPosition()); 2055 2056 if (TemplateArgs.isRewrite()) { 2057 // We're rewriting the template parameter as a reference to another 2058 // template parameter. 2059 if (Arg.getKind() == TemplateArgument::Pack) { 2060 assert(Arg.pack_size() == 1 && Arg.pack_begin()->isPackExpansion() && 2061 "unexpected pack arguments in template rewrite"); 2062 Arg = Arg.pack_begin()->getPackExpansionPattern(); 2063 } 2064 assert(Arg.getKind() == TemplateArgument::Expression && 2065 "unexpected nontype template argument kind in template rewrite"); 2066 // FIXME: This can lead to the same subexpression appearing multiple times 2067 // in a complete expression. 2068 return Arg.getAsExpr(); 2069 } 2070 2071 auto [AssociatedDecl, _] = TemplateArgs.getAssociatedDecl(NTTP->getDepth()); 2072 std::optional<unsigned> PackIndex; 2073 if (NTTP->isParameterPack()) { 2074 assert(Arg.getKind() == TemplateArgument::Pack && 2075 "Missing argument pack"); 2076 2077 if (getSema().ArgumentPackSubstitutionIndex == -1) { 2078 // We have an argument pack, but we can't select a particular argument 2079 // out of it yet. Therefore, we'll build an expression to hold on to that 2080 // argument pack. 2081 QualType TargetType = SemaRef.SubstType(NTTP->getType(), TemplateArgs, 2082 E->getLocation(), 2083 NTTP->getDeclName()); 2084 if (TargetType.isNull()) 2085 return ExprError(); 2086 2087 QualType ExprType = TargetType.getNonLValueExprType(SemaRef.Context); 2088 if (TargetType->isRecordType()) 2089 ExprType.addConst(); 2090 // FIXME: Pass in Final. 2091 return new (SemaRef.Context) SubstNonTypeTemplateParmPackExpr( 2092 ExprType, TargetType->isReferenceType() ? VK_LValue : VK_PRValue, 2093 E->getLocation(), Arg, AssociatedDecl, NTTP->getPosition()); 2094 } 2095 PackIndex = getPackIndex(Arg); 2096 Arg = getPackSubstitutedTemplateArgument(getSema(), Arg); 2097 } 2098 // FIXME: Don't put subst node on Final replacement. 2099 return transformNonTypeTemplateParmRef(AssociatedDecl, NTTP, E->getLocation(), 2100 Arg, PackIndex); 2101 } 2102 2103 const CXXAssumeAttr * 2104 TemplateInstantiator::TransformCXXAssumeAttr(const CXXAssumeAttr *AA) { 2105 ExprResult Res = getDerived().TransformExpr(AA->getAssumption()); 2106 if (!Res.isUsable()) 2107 return AA; 2108 2109 Res = getSema().BuildCXXAssumeExpr(Res.get(), AA->getAttrName(), 2110 AA->getRange()); 2111 if (!Res.isUsable()) 2112 return AA; 2113 2114 return CXXAssumeAttr::CreateImplicit(getSema().Context, Res.get(), 2115 AA->getRange()); 2116 } 2117 2118 const LoopHintAttr * 2119 TemplateInstantiator::TransformLoopHintAttr(const LoopHintAttr *LH) { 2120 Expr *TransformedExpr = getDerived().TransformExpr(LH->getValue()).get(); 2121 2122 if (TransformedExpr == LH->getValue()) 2123 return LH; 2124 2125 // Generate error if there is a problem with the value. 2126 if (getSema().CheckLoopHintExpr(TransformedExpr, LH->getLocation(), 2127 LH->getSemanticSpelling() == 2128 LoopHintAttr::Pragma_unroll)) 2129 return LH; 2130 2131 LoopHintAttr::OptionType Option = LH->getOption(); 2132 LoopHintAttr::LoopHintState State = LH->getState(); 2133 2134 llvm::APSInt ValueAPS = 2135 TransformedExpr->EvaluateKnownConstInt(getSema().getASTContext()); 2136 // The values of 0 and 1 block any unrolling of the loop. 2137 if (ValueAPS.isZero() || ValueAPS.isOne()) { 2138 Option = LoopHintAttr::Unroll; 2139 State = LoopHintAttr::Disable; 2140 } 2141 2142 // Create new LoopHintValueAttr with integral expression in place of the 2143 // non-type template parameter. 2144 return LoopHintAttr::CreateImplicit(getSema().Context, Option, State, 2145 TransformedExpr, *LH); 2146 } 2147 const NoInlineAttr *TemplateInstantiator::TransformStmtNoInlineAttr( 2148 const Stmt *OrigS, const Stmt *InstS, const NoInlineAttr *A) { 2149 if (!A || getSema().CheckNoInlineAttr(OrigS, InstS, *A)) 2150 return nullptr; 2151 2152 return A; 2153 } 2154 const AlwaysInlineAttr *TemplateInstantiator::TransformStmtAlwaysInlineAttr( 2155 const Stmt *OrigS, const Stmt *InstS, const AlwaysInlineAttr *A) { 2156 if (!A || getSema().CheckAlwaysInlineAttr(OrigS, InstS, *A)) 2157 return nullptr; 2158 2159 return A; 2160 } 2161 2162 const CodeAlignAttr * 2163 TemplateInstantiator::TransformCodeAlignAttr(const CodeAlignAttr *CA) { 2164 Expr *TransformedExpr = getDerived().TransformExpr(CA->getAlignment()).get(); 2165 return getSema().BuildCodeAlignAttr(*CA, TransformedExpr); 2166 } 2167 2168 ExprResult TemplateInstantiator::transformNonTypeTemplateParmRef( 2169 Decl *AssociatedDecl, const NonTypeTemplateParmDecl *parm, 2170 SourceLocation loc, TemplateArgument arg, 2171 std::optional<unsigned> PackIndex) { 2172 ExprResult result; 2173 2174 // Determine the substituted parameter type. We can usually infer this from 2175 // the template argument, but not always. 2176 auto SubstParamType = [&] { 2177 QualType T; 2178 if (parm->isExpandedParameterPack()) 2179 T = parm->getExpansionType(SemaRef.ArgumentPackSubstitutionIndex); 2180 else 2181 T = parm->getType(); 2182 if (parm->isParameterPack() && isa<PackExpansionType>(T)) 2183 T = cast<PackExpansionType>(T)->getPattern(); 2184 return SemaRef.SubstType(T, TemplateArgs, loc, parm->getDeclName()); 2185 }; 2186 2187 bool refParam = false; 2188 2189 // The template argument itself might be an expression, in which case we just 2190 // return that expression. This happens when substituting into an alias 2191 // template. 2192 if (arg.getKind() == TemplateArgument::Expression) { 2193 Expr *argExpr = arg.getAsExpr(); 2194 result = argExpr; 2195 if (argExpr->isLValue()) { 2196 if (argExpr->getType()->isRecordType()) { 2197 // Check whether the parameter was actually a reference. 2198 QualType paramType = SubstParamType(); 2199 if (paramType.isNull()) 2200 return ExprError(); 2201 refParam = paramType->isReferenceType(); 2202 } else { 2203 refParam = true; 2204 } 2205 } 2206 } else if (arg.getKind() == TemplateArgument::Declaration || 2207 arg.getKind() == TemplateArgument::NullPtr) { 2208 if (arg.getKind() == TemplateArgument::Declaration) { 2209 ValueDecl *VD = arg.getAsDecl(); 2210 2211 // Find the instantiation of the template argument. This is 2212 // required for nested templates. 2213 VD = cast_or_null<ValueDecl>( 2214 getSema().FindInstantiatedDecl(loc, VD, TemplateArgs)); 2215 if (!VD) 2216 return ExprError(); 2217 } 2218 2219 QualType paramType = arg.getNonTypeTemplateArgumentType(); 2220 assert(!paramType.isNull() && "type substitution failed for param type"); 2221 assert(!paramType->isDependentType() && "param type still dependent"); 2222 result = SemaRef.BuildExpressionFromDeclTemplateArgument(arg, paramType, loc); 2223 refParam = paramType->isReferenceType(); 2224 } else { 2225 QualType paramType = arg.getNonTypeTemplateArgumentType(); 2226 result = SemaRef.BuildExpressionFromNonTypeTemplateArgument(arg, loc); 2227 refParam = paramType->isReferenceType(); 2228 assert(result.isInvalid() || 2229 SemaRef.Context.hasSameType(result.get()->getType(), 2230 paramType.getNonReferenceType())); 2231 } 2232 2233 if (result.isInvalid()) 2234 return ExprError(); 2235 2236 Expr *resultExpr = result.get(); 2237 // FIXME: Don't put subst node on final replacement. 2238 return new (SemaRef.Context) SubstNonTypeTemplateParmExpr( 2239 resultExpr->getType(), resultExpr->getValueKind(), loc, resultExpr, 2240 AssociatedDecl, parm->getIndex(), PackIndex, refParam); 2241 } 2242 2243 ExprResult 2244 TemplateInstantiator::TransformSubstNonTypeTemplateParmPackExpr( 2245 SubstNonTypeTemplateParmPackExpr *E) { 2246 if (getSema().ArgumentPackSubstitutionIndex == -1) { 2247 // We aren't expanding the parameter pack, so just return ourselves. 2248 return E; 2249 } 2250 2251 TemplateArgument Pack = E->getArgumentPack(); 2252 TemplateArgument Arg = getPackSubstitutedTemplateArgument(getSema(), Pack); 2253 // FIXME: Don't put subst node on final replacement. 2254 return transformNonTypeTemplateParmRef( 2255 E->getAssociatedDecl(), E->getParameterPack(), 2256 E->getParameterPackLocation(), Arg, getPackIndex(Pack)); 2257 } 2258 2259 ExprResult 2260 TemplateInstantiator::TransformSubstNonTypeTemplateParmExpr( 2261 SubstNonTypeTemplateParmExpr *E) { 2262 ExprResult SubstReplacement = E->getReplacement(); 2263 if (!isa<ConstantExpr>(SubstReplacement.get())) 2264 SubstReplacement = TransformExpr(E->getReplacement()); 2265 if (SubstReplacement.isInvalid()) 2266 return true; 2267 QualType SubstType = TransformType(E->getParameterType(getSema().Context)); 2268 if (SubstType.isNull()) 2269 return true; 2270 // The type may have been previously dependent and not now, which means we 2271 // might have to implicit cast the argument to the new type, for example: 2272 // template<auto T, decltype(T) U> 2273 // concept C = sizeof(U) == 4; 2274 // void foo() requires C<2, 'a'> { } 2275 // When normalizing foo(), we first form the normalized constraints of C: 2276 // AtomicExpr(sizeof(U) == 4, 2277 // U=SubstNonTypeTemplateParmExpr(Param=U, 2278 // Expr=DeclRef(U), 2279 // Type=decltype(T))) 2280 // Then we substitute T = 2, U = 'a' into the parameter mapping, and need to 2281 // produce: 2282 // AtomicExpr(sizeof(U) == 4, 2283 // U=SubstNonTypeTemplateParmExpr(Param=U, 2284 // Expr=ImpCast( 2285 // decltype(2), 2286 // SubstNTTPE(Param=U, Expr='a', 2287 // Type=char)), 2288 // Type=decltype(2))) 2289 // The call to CheckTemplateArgument here produces the ImpCast. 2290 TemplateArgument SugaredConverted, CanonicalConverted; 2291 if (SemaRef 2292 .CheckTemplateArgument(E->getParameter(), SubstType, 2293 SubstReplacement.get(), SugaredConverted, 2294 CanonicalConverted, Sema::CTAK_Specified) 2295 .isInvalid()) 2296 return true; 2297 return transformNonTypeTemplateParmRef(E->getAssociatedDecl(), 2298 E->getParameter(), E->getExprLoc(), 2299 SugaredConverted, E->getPackIndex()); 2300 } 2301 2302 ExprResult TemplateInstantiator::RebuildVarDeclRefExpr(VarDecl *PD, 2303 SourceLocation Loc) { 2304 DeclarationNameInfo NameInfo(PD->getDeclName(), Loc); 2305 return getSema().BuildDeclarationNameExpr(CXXScopeSpec(), NameInfo, PD); 2306 } 2307 2308 ExprResult 2309 TemplateInstantiator::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 2310 if (getSema().ArgumentPackSubstitutionIndex != -1) { 2311 // We can expand this parameter pack now. 2312 VarDecl *D = E->getExpansion(getSema().ArgumentPackSubstitutionIndex); 2313 VarDecl *VD = cast_or_null<VarDecl>(TransformDecl(E->getExprLoc(), D)); 2314 if (!VD) 2315 return ExprError(); 2316 return RebuildVarDeclRefExpr(VD, E->getExprLoc()); 2317 } 2318 2319 QualType T = TransformType(E->getType()); 2320 if (T.isNull()) 2321 return ExprError(); 2322 2323 // Transform each of the parameter expansions into the corresponding 2324 // parameters in the instantiation of the function decl. 2325 SmallVector<VarDecl *, 8> Vars; 2326 Vars.reserve(E->getNumExpansions()); 2327 for (FunctionParmPackExpr::iterator I = E->begin(), End = E->end(); 2328 I != End; ++I) { 2329 VarDecl *D = cast_or_null<VarDecl>(TransformDecl(E->getExprLoc(), *I)); 2330 if (!D) 2331 return ExprError(); 2332 Vars.push_back(D); 2333 } 2334 2335 auto *PackExpr = 2336 FunctionParmPackExpr::Create(getSema().Context, T, E->getParameterPack(), 2337 E->getParameterPackLocation(), Vars); 2338 getSema().MarkFunctionParmPackReferenced(PackExpr); 2339 return PackExpr; 2340 } 2341 2342 ExprResult 2343 TemplateInstantiator::TransformFunctionParmPackRefExpr(DeclRefExpr *E, 2344 VarDecl *PD) { 2345 typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack; 2346 llvm::PointerUnion<Decl *, DeclArgumentPack *> *Found 2347 = getSema().CurrentInstantiationScope->findInstantiationOf(PD); 2348 assert(Found && "no instantiation for parameter pack"); 2349 2350 Decl *TransformedDecl; 2351 if (DeclArgumentPack *Pack = Found->dyn_cast<DeclArgumentPack *>()) { 2352 // If this is a reference to a function parameter pack which we can 2353 // substitute but can't yet expand, build a FunctionParmPackExpr for it. 2354 if (getSema().ArgumentPackSubstitutionIndex == -1) { 2355 QualType T = TransformType(E->getType()); 2356 if (T.isNull()) 2357 return ExprError(); 2358 auto *PackExpr = FunctionParmPackExpr::Create(getSema().Context, T, PD, 2359 E->getExprLoc(), *Pack); 2360 getSema().MarkFunctionParmPackReferenced(PackExpr); 2361 return PackExpr; 2362 } 2363 2364 TransformedDecl = (*Pack)[getSema().ArgumentPackSubstitutionIndex]; 2365 } else { 2366 TransformedDecl = Found->get<Decl*>(); 2367 } 2368 2369 // We have either an unexpanded pack or a specific expansion. 2370 return RebuildVarDeclRefExpr(cast<VarDecl>(TransformedDecl), E->getExprLoc()); 2371 } 2372 2373 ExprResult 2374 TemplateInstantiator::TransformDeclRefExpr(DeclRefExpr *E) { 2375 NamedDecl *D = E->getDecl(); 2376 2377 // Handle references to non-type template parameters and non-type template 2378 // parameter packs. 2379 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) { 2380 if (NTTP->getDepth() < TemplateArgs.getNumLevels()) 2381 return TransformTemplateParmRefExpr(E, NTTP); 2382 2383 // We have a non-type template parameter that isn't fully substituted; 2384 // FindInstantiatedDecl will find it in the local instantiation scope. 2385 } 2386 2387 // Handle references to function parameter packs. 2388 if (VarDecl *PD = dyn_cast<VarDecl>(D)) 2389 if (PD->isParameterPack()) 2390 return TransformFunctionParmPackRefExpr(E, PD); 2391 2392 return inherited::TransformDeclRefExpr(E); 2393 } 2394 2395 ExprResult TemplateInstantiator::TransformCXXDefaultArgExpr( 2396 CXXDefaultArgExpr *E) { 2397 assert(!cast<FunctionDecl>(E->getParam()->getDeclContext())-> 2398 getDescribedFunctionTemplate() && 2399 "Default arg expressions are never formed in dependent cases."); 2400 return SemaRef.BuildCXXDefaultArgExpr( 2401 E->getUsedLocation(), cast<FunctionDecl>(E->getParam()->getDeclContext()), 2402 E->getParam()); 2403 } 2404 2405 template<typename Fn> 2406 QualType TemplateInstantiator::TransformFunctionProtoType(TypeLocBuilder &TLB, 2407 FunctionProtoTypeLoc TL, 2408 CXXRecordDecl *ThisContext, 2409 Qualifiers ThisTypeQuals, 2410 Fn TransformExceptionSpec) { 2411 // We need a local instantiation scope for this function prototype. 2412 LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true); 2413 return inherited::TransformFunctionProtoType( 2414 TLB, TL, ThisContext, ThisTypeQuals, TransformExceptionSpec); 2415 } 2416 2417 ParmVarDecl *TemplateInstantiator::TransformFunctionTypeParam( 2418 ParmVarDecl *OldParm, int indexAdjustment, 2419 std::optional<unsigned> NumExpansions, bool ExpectParameterPack) { 2420 auto NewParm = SemaRef.SubstParmVarDecl( 2421 OldParm, TemplateArgs, indexAdjustment, NumExpansions, 2422 ExpectParameterPack, EvaluateConstraints); 2423 if (NewParm && SemaRef.getLangOpts().OpenCL) 2424 SemaRef.deduceOpenCLAddressSpace(NewParm); 2425 return NewParm; 2426 } 2427 2428 QualType TemplateInstantiator::BuildSubstTemplateTypeParmType( 2429 TypeLocBuilder &TLB, bool SuppressObjCLifetime, bool Final, 2430 Decl *AssociatedDecl, unsigned Index, std::optional<unsigned> PackIndex, 2431 TemplateArgument Arg, SourceLocation NameLoc) { 2432 QualType Replacement = Arg.getAsType(); 2433 2434 // If the template parameter had ObjC lifetime qualifiers, 2435 // then any such qualifiers on the replacement type are ignored. 2436 if (SuppressObjCLifetime) { 2437 Qualifiers RQs; 2438 RQs = Replacement.getQualifiers(); 2439 RQs.removeObjCLifetime(); 2440 Replacement = 2441 SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(), RQs); 2442 } 2443 2444 if (Final) { 2445 TLB.pushTrivial(SemaRef.Context, Replacement, NameLoc); 2446 return Replacement; 2447 } 2448 // TODO: only do this uniquing once, at the start of instantiation. 2449 QualType Result = getSema().Context.getSubstTemplateTypeParmType( 2450 Replacement, AssociatedDecl, Index, PackIndex); 2451 SubstTemplateTypeParmTypeLoc NewTL = 2452 TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 2453 NewTL.setNameLoc(NameLoc); 2454 return Result; 2455 } 2456 2457 QualType 2458 TemplateInstantiator::TransformTemplateTypeParmType(TypeLocBuilder &TLB, 2459 TemplateTypeParmTypeLoc TL, 2460 bool SuppressObjCLifetime) { 2461 const TemplateTypeParmType *T = TL.getTypePtr(); 2462 if (T->getDepth() < TemplateArgs.getNumLevels()) { 2463 // Replace the template type parameter with its corresponding 2464 // template argument. 2465 2466 // If the corresponding template argument is NULL or doesn't exist, it's 2467 // because we are performing instantiation from explicitly-specified 2468 // template arguments in a function template class, but there were some 2469 // arguments left unspecified. 2470 if (!TemplateArgs.hasTemplateArgument(T->getDepth(), T->getIndex())) { 2471 TemplateTypeParmTypeLoc NewTL 2472 = TLB.push<TemplateTypeParmTypeLoc>(TL.getType()); 2473 NewTL.setNameLoc(TL.getNameLoc()); 2474 return TL.getType(); 2475 } 2476 2477 TemplateArgument Arg = TemplateArgs(T->getDepth(), T->getIndex()); 2478 2479 if (TemplateArgs.isRewrite()) { 2480 // We're rewriting the template parameter as a reference to another 2481 // template parameter. 2482 if (Arg.getKind() == TemplateArgument::Pack) { 2483 assert(Arg.pack_size() == 1 && Arg.pack_begin()->isPackExpansion() && 2484 "unexpected pack arguments in template rewrite"); 2485 Arg = Arg.pack_begin()->getPackExpansionPattern(); 2486 } 2487 assert(Arg.getKind() == TemplateArgument::Type && 2488 "unexpected nontype template argument kind in template rewrite"); 2489 QualType NewT = Arg.getAsType(); 2490 TLB.pushTrivial(SemaRef.Context, NewT, TL.getNameLoc()); 2491 return NewT; 2492 } 2493 2494 auto [AssociatedDecl, Final] = 2495 TemplateArgs.getAssociatedDecl(T->getDepth()); 2496 std::optional<unsigned> PackIndex; 2497 if (T->isParameterPack()) { 2498 assert(Arg.getKind() == TemplateArgument::Pack && 2499 "Missing argument pack"); 2500 2501 if (getSema().ArgumentPackSubstitutionIndex == -1) { 2502 // We have the template argument pack, but we're not expanding the 2503 // enclosing pack expansion yet. Just save the template argument 2504 // pack for later substitution. 2505 QualType Result = getSema().Context.getSubstTemplateTypeParmPackType( 2506 AssociatedDecl, T->getIndex(), Final, Arg); 2507 SubstTemplateTypeParmPackTypeLoc NewTL 2508 = TLB.push<SubstTemplateTypeParmPackTypeLoc>(Result); 2509 NewTL.setNameLoc(TL.getNameLoc()); 2510 return Result; 2511 } 2512 2513 // PackIndex starts from last element. 2514 PackIndex = getPackIndex(Arg); 2515 Arg = getPackSubstitutedTemplateArgument(getSema(), Arg); 2516 } 2517 2518 assert(Arg.getKind() == TemplateArgument::Type && 2519 "Template argument kind mismatch"); 2520 2521 return BuildSubstTemplateTypeParmType(TLB, SuppressObjCLifetime, Final, 2522 AssociatedDecl, T->getIndex(), 2523 PackIndex, Arg, TL.getNameLoc()); 2524 } 2525 2526 // The template type parameter comes from an inner template (e.g., 2527 // the template parameter list of a member template inside the 2528 // template we are instantiating). Create a new template type 2529 // parameter with the template "level" reduced by one. 2530 TemplateTypeParmDecl *NewTTPDecl = nullptr; 2531 if (TemplateTypeParmDecl *OldTTPDecl = T->getDecl()) 2532 NewTTPDecl = cast_or_null<TemplateTypeParmDecl>( 2533 TransformDecl(TL.getNameLoc(), OldTTPDecl)); 2534 QualType Result = getSema().Context.getTemplateTypeParmType( 2535 T->getDepth() - TemplateArgs.getNumSubstitutedLevels(), T->getIndex(), 2536 T->isParameterPack(), NewTTPDecl); 2537 TemplateTypeParmTypeLoc NewTL = TLB.push<TemplateTypeParmTypeLoc>(Result); 2538 NewTL.setNameLoc(TL.getNameLoc()); 2539 return Result; 2540 } 2541 2542 QualType TemplateInstantiator::TransformSubstTemplateTypeParmPackType( 2543 TypeLocBuilder &TLB, SubstTemplateTypeParmPackTypeLoc TL, 2544 bool SuppressObjCLifetime) { 2545 const SubstTemplateTypeParmPackType *T = TL.getTypePtr(); 2546 2547 Decl *NewReplaced = TransformDecl(TL.getNameLoc(), T->getAssociatedDecl()); 2548 2549 if (getSema().ArgumentPackSubstitutionIndex == -1) { 2550 // We aren't expanding the parameter pack, so just return ourselves. 2551 QualType Result = TL.getType(); 2552 if (NewReplaced != T->getAssociatedDecl()) 2553 Result = getSema().Context.getSubstTemplateTypeParmPackType( 2554 NewReplaced, T->getIndex(), T->getFinal(), T->getArgumentPack()); 2555 SubstTemplateTypeParmPackTypeLoc NewTL = 2556 TLB.push<SubstTemplateTypeParmPackTypeLoc>(Result); 2557 NewTL.setNameLoc(TL.getNameLoc()); 2558 return Result; 2559 } 2560 2561 TemplateArgument Pack = T->getArgumentPack(); 2562 TemplateArgument Arg = getPackSubstitutedTemplateArgument(getSema(), Pack); 2563 return BuildSubstTemplateTypeParmType( 2564 TLB, SuppressObjCLifetime, T->getFinal(), NewReplaced, T->getIndex(), 2565 getPackIndex(Pack), Arg, TL.getNameLoc()); 2566 } 2567 2568 static concepts::Requirement::SubstitutionDiagnostic * 2569 createSubstDiag(Sema &S, TemplateDeductionInfo &Info, 2570 concepts::EntityPrinter Printer) { 2571 SmallString<128> Message; 2572 SourceLocation ErrorLoc; 2573 if (Info.hasSFINAEDiagnostic()) { 2574 PartialDiagnosticAt PDA(SourceLocation(), 2575 PartialDiagnostic::NullDiagnostic{}); 2576 Info.takeSFINAEDiagnostic(PDA); 2577 PDA.second.EmitToString(S.getDiagnostics(), Message); 2578 ErrorLoc = PDA.first; 2579 } else { 2580 ErrorLoc = Info.getLocation(); 2581 } 2582 SmallString<128> Entity; 2583 llvm::raw_svector_ostream OS(Entity); 2584 Printer(OS); 2585 const ASTContext &C = S.Context; 2586 return new (C) concepts::Requirement::SubstitutionDiagnostic{ 2587 C.backupStr(Entity), ErrorLoc, C.backupStr(Message)}; 2588 } 2589 2590 concepts::Requirement::SubstitutionDiagnostic * 2591 concepts::createSubstDiagAt(Sema &S, SourceLocation Location, 2592 EntityPrinter Printer) { 2593 SmallString<128> Entity; 2594 llvm::raw_svector_ostream OS(Entity); 2595 Printer(OS); 2596 const ASTContext &C = S.Context; 2597 return new (C) concepts::Requirement::SubstitutionDiagnostic{ 2598 /*SubstitutedEntity=*/C.backupStr(Entity), 2599 /*DiagLoc=*/Location, /*DiagMessage=*/StringRef()}; 2600 } 2601 2602 ExprResult TemplateInstantiator::TransformRequiresTypeParams( 2603 SourceLocation KWLoc, SourceLocation RBraceLoc, const RequiresExpr *RE, 2604 RequiresExprBodyDecl *Body, ArrayRef<ParmVarDecl *> Params, 2605 SmallVectorImpl<QualType> &PTypes, 2606 SmallVectorImpl<ParmVarDecl *> &TransParams, 2607 Sema::ExtParameterInfoBuilder &PInfos) { 2608 2609 TemplateDeductionInfo Info(KWLoc); 2610 Sema::InstantiatingTemplate TypeInst(SemaRef, KWLoc, 2611 RE, Info, 2612 SourceRange{KWLoc, RBraceLoc}); 2613 Sema::SFINAETrap Trap(SemaRef); 2614 2615 unsigned ErrorIdx; 2616 if (getDerived().TransformFunctionTypeParams( 2617 KWLoc, Params, /*ParamTypes=*/nullptr, /*ParamInfos=*/nullptr, PTypes, 2618 &TransParams, PInfos, &ErrorIdx) || 2619 Trap.hasErrorOccurred()) { 2620 SmallVector<concepts::Requirement *, 4> TransReqs; 2621 ParmVarDecl *FailedDecl = Params[ErrorIdx]; 2622 // Add a 'failed' Requirement to contain the error that caused the failure 2623 // here. 2624 TransReqs.push_back(RebuildTypeRequirement(createSubstDiag( 2625 SemaRef, Info, [&](llvm::raw_ostream &OS) { OS << *FailedDecl; }))); 2626 return getDerived().RebuildRequiresExpr(KWLoc, Body, RE->getLParenLoc(), 2627 TransParams, RE->getRParenLoc(), 2628 TransReqs, RBraceLoc); 2629 } 2630 2631 return ExprResult{}; 2632 } 2633 2634 concepts::TypeRequirement * 2635 TemplateInstantiator::TransformTypeRequirement(concepts::TypeRequirement *Req) { 2636 if (!Req->isDependent() && !AlwaysRebuild()) 2637 return Req; 2638 if (Req->isSubstitutionFailure()) { 2639 if (AlwaysRebuild()) 2640 return RebuildTypeRequirement( 2641 Req->getSubstitutionDiagnostic()); 2642 return Req; 2643 } 2644 2645 Sema::SFINAETrap Trap(SemaRef); 2646 TemplateDeductionInfo Info(Req->getType()->getTypeLoc().getBeginLoc()); 2647 Sema::InstantiatingTemplate TypeInst(SemaRef, 2648 Req->getType()->getTypeLoc().getBeginLoc(), Req, Info, 2649 Req->getType()->getTypeLoc().getSourceRange()); 2650 if (TypeInst.isInvalid()) 2651 return nullptr; 2652 TypeSourceInfo *TransType = TransformType(Req->getType()); 2653 if (!TransType || Trap.hasErrorOccurred()) 2654 return RebuildTypeRequirement(createSubstDiag(SemaRef, Info, 2655 [&] (llvm::raw_ostream& OS) { 2656 Req->getType()->getType().print(OS, SemaRef.getPrintingPolicy()); 2657 })); 2658 return RebuildTypeRequirement(TransType); 2659 } 2660 2661 concepts::ExprRequirement * 2662 TemplateInstantiator::TransformExprRequirement(concepts::ExprRequirement *Req) { 2663 if (!Req->isDependent() && !AlwaysRebuild()) 2664 return Req; 2665 2666 Sema::SFINAETrap Trap(SemaRef); 2667 2668 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> 2669 TransExpr; 2670 if (Req->isExprSubstitutionFailure()) 2671 TransExpr = Req->getExprSubstitutionDiagnostic(); 2672 else { 2673 Expr *E = Req->getExpr(); 2674 TemplateDeductionInfo Info(E->getBeginLoc()); 2675 Sema::InstantiatingTemplate ExprInst(SemaRef, E->getBeginLoc(), Req, Info, 2676 E->getSourceRange()); 2677 if (ExprInst.isInvalid()) 2678 return nullptr; 2679 ExprResult TransExprRes = TransformExpr(E); 2680 if (!TransExprRes.isInvalid() && !Trap.hasErrorOccurred() && 2681 TransExprRes.get()->hasPlaceholderType()) 2682 TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get()); 2683 if (TransExprRes.isInvalid() || Trap.hasErrorOccurred()) 2684 TransExpr = createSubstDiag(SemaRef, Info, [&](llvm::raw_ostream &OS) { 2685 E->printPretty(OS, nullptr, SemaRef.getPrintingPolicy()); 2686 }); 2687 else 2688 TransExpr = TransExprRes.get(); 2689 } 2690 2691 std::optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 2692 const auto &RetReq = Req->getReturnTypeRequirement(); 2693 if (RetReq.isEmpty()) 2694 TransRetReq.emplace(); 2695 else if (RetReq.isSubstitutionFailure()) 2696 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 2697 else if (RetReq.isTypeConstraint()) { 2698 TemplateParameterList *OrigTPL = 2699 RetReq.getTypeConstraintTemplateParameterList(); 2700 TemplateDeductionInfo Info(OrigTPL->getTemplateLoc()); 2701 Sema::InstantiatingTemplate TPLInst(SemaRef, OrigTPL->getTemplateLoc(), 2702 Req, Info, OrigTPL->getSourceRange()); 2703 if (TPLInst.isInvalid()) 2704 return nullptr; 2705 TemplateParameterList *TPL = TransformTemplateParameterList(OrigTPL); 2706 if (!TPL || Trap.hasErrorOccurred()) 2707 TransRetReq.emplace(createSubstDiag(SemaRef, Info, 2708 [&] (llvm::raw_ostream& OS) { 2709 RetReq.getTypeConstraint()->getImmediatelyDeclaredConstraint() 2710 ->printPretty(OS, nullptr, SemaRef.getPrintingPolicy()); 2711 })); 2712 else { 2713 TPLInst.Clear(); 2714 TransRetReq.emplace(TPL); 2715 } 2716 } 2717 assert(TransRetReq && "All code paths leading here must set TransRetReq"); 2718 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 2719 return RebuildExprRequirement(E, Req->isSimple(), Req->getNoexceptLoc(), 2720 std::move(*TransRetReq)); 2721 return RebuildExprRequirement( 2722 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 2723 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 2724 } 2725 2726 concepts::NestedRequirement * 2727 TemplateInstantiator::TransformNestedRequirement( 2728 concepts::NestedRequirement *Req) { 2729 if (!Req->isDependent() && !AlwaysRebuild()) 2730 return Req; 2731 if (Req->hasInvalidConstraint()) { 2732 if (AlwaysRebuild()) 2733 return RebuildNestedRequirement(Req->getInvalidConstraintEntity(), 2734 Req->getConstraintSatisfaction()); 2735 return Req; 2736 } 2737 Sema::InstantiatingTemplate ReqInst(SemaRef, 2738 Req->getConstraintExpr()->getBeginLoc(), Req, 2739 Sema::InstantiatingTemplate::ConstraintsCheck{}, 2740 Req->getConstraintExpr()->getSourceRange()); 2741 if (!getEvaluateConstraints()) { 2742 ExprResult TransConstraint = TransformExpr(Req->getConstraintExpr()); 2743 if (TransConstraint.isInvalid() || !TransConstraint.get()) 2744 return nullptr; 2745 if (TransConstraint.get()->isInstantiationDependent()) 2746 return new (SemaRef.Context) 2747 concepts::NestedRequirement(TransConstraint.get()); 2748 ConstraintSatisfaction Satisfaction; 2749 return new (SemaRef.Context) concepts::NestedRequirement( 2750 SemaRef.Context, TransConstraint.get(), Satisfaction); 2751 } 2752 2753 ExprResult TransConstraint; 2754 ConstraintSatisfaction Satisfaction; 2755 TemplateDeductionInfo Info(Req->getConstraintExpr()->getBeginLoc()); 2756 { 2757 EnterExpressionEvaluationContext ContextRAII( 2758 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 2759 Sema::SFINAETrap Trap(SemaRef); 2760 Sema::InstantiatingTemplate ConstrInst(SemaRef, 2761 Req->getConstraintExpr()->getBeginLoc(), Req, Info, 2762 Req->getConstraintExpr()->getSourceRange()); 2763 if (ConstrInst.isInvalid()) 2764 return nullptr; 2765 llvm::SmallVector<Expr *> Result; 2766 if (!SemaRef.CheckConstraintSatisfaction( 2767 nullptr, {Req->getConstraintExpr()}, Result, TemplateArgs, 2768 Req->getConstraintExpr()->getSourceRange(), Satisfaction) && 2769 !Result.empty()) 2770 TransConstraint = Result[0]; 2771 assert(!Trap.hasErrorOccurred() && "Substitution failures must be handled " 2772 "by CheckConstraintSatisfaction."); 2773 } 2774 ASTContext &C = SemaRef.Context; 2775 if (TransConstraint.isUsable() && 2776 TransConstraint.get()->isInstantiationDependent()) 2777 return new (C) concepts::NestedRequirement(TransConstraint.get()); 2778 if (TransConstraint.isInvalid() || !TransConstraint.get() || 2779 Satisfaction.HasSubstitutionFailure()) { 2780 SmallString<128> Entity; 2781 llvm::raw_svector_ostream OS(Entity); 2782 Req->getConstraintExpr()->printPretty(OS, nullptr, 2783 SemaRef.getPrintingPolicy()); 2784 return new (C) concepts::NestedRequirement( 2785 SemaRef.Context, C.backupStr(Entity), Satisfaction); 2786 } 2787 return new (C) 2788 concepts::NestedRequirement(C, TransConstraint.get(), Satisfaction); 2789 } 2790 2791 TypeSourceInfo *Sema::SubstType(TypeSourceInfo *T, 2792 const MultiLevelTemplateArgumentList &Args, 2793 SourceLocation Loc, 2794 DeclarationName Entity, 2795 bool AllowDeducedTST) { 2796 assert(!CodeSynthesisContexts.empty() && 2797 "Cannot perform an instantiation without some context on the " 2798 "instantiation stack"); 2799 2800 if (!T->getType()->isInstantiationDependentType() && 2801 !T->getType()->isVariablyModifiedType()) 2802 return T; 2803 2804 TemplateInstantiator Instantiator(*this, Args, Loc, Entity); 2805 return AllowDeducedTST ? Instantiator.TransformTypeWithDeducedTST(T) 2806 : Instantiator.TransformType(T); 2807 } 2808 2809 TypeSourceInfo *Sema::SubstType(TypeLoc TL, 2810 const MultiLevelTemplateArgumentList &Args, 2811 SourceLocation Loc, 2812 DeclarationName Entity) { 2813 assert(!CodeSynthesisContexts.empty() && 2814 "Cannot perform an instantiation without some context on the " 2815 "instantiation stack"); 2816 2817 if (TL.getType().isNull()) 2818 return nullptr; 2819 2820 if (!TL.getType()->isInstantiationDependentType() && 2821 !TL.getType()->isVariablyModifiedType()) { 2822 // FIXME: Make a copy of the TypeLoc data here, so that we can 2823 // return a new TypeSourceInfo. Inefficient! 2824 TypeLocBuilder TLB; 2825 TLB.pushFullCopy(TL); 2826 return TLB.getTypeSourceInfo(Context, TL.getType()); 2827 } 2828 2829 TemplateInstantiator Instantiator(*this, Args, Loc, Entity); 2830 TypeLocBuilder TLB; 2831 TLB.reserve(TL.getFullDataSize()); 2832 QualType Result = Instantiator.TransformType(TLB, TL); 2833 if (Result.isNull()) 2834 return nullptr; 2835 2836 return TLB.getTypeSourceInfo(Context, Result); 2837 } 2838 2839 /// Deprecated form of the above. 2840 QualType Sema::SubstType(QualType T, 2841 const MultiLevelTemplateArgumentList &TemplateArgs, 2842 SourceLocation Loc, DeclarationName Entity) { 2843 assert(!CodeSynthesisContexts.empty() && 2844 "Cannot perform an instantiation without some context on the " 2845 "instantiation stack"); 2846 2847 // If T is not a dependent type or a variably-modified type, there 2848 // is nothing to do. 2849 if (!T->isInstantiationDependentType() && !T->isVariablyModifiedType()) 2850 return T; 2851 2852 TemplateInstantiator Instantiator(*this, TemplateArgs, Loc, Entity); 2853 return Instantiator.TransformType(T); 2854 } 2855 2856 static bool NeedsInstantiationAsFunctionType(TypeSourceInfo *T) { 2857 if (T->getType()->isInstantiationDependentType() || 2858 T->getType()->isVariablyModifiedType()) 2859 return true; 2860 2861 TypeLoc TL = T->getTypeLoc().IgnoreParens(); 2862 if (!TL.getAs<FunctionProtoTypeLoc>()) 2863 return false; 2864 2865 FunctionProtoTypeLoc FP = TL.castAs<FunctionProtoTypeLoc>(); 2866 for (ParmVarDecl *P : FP.getParams()) { 2867 // This must be synthesized from a typedef. 2868 if (!P) continue; 2869 2870 // If there are any parameters, a new TypeSourceInfo that refers to the 2871 // instantiated parameters must be built. 2872 return true; 2873 } 2874 2875 return false; 2876 } 2877 2878 TypeSourceInfo *Sema::SubstFunctionDeclType(TypeSourceInfo *T, 2879 const MultiLevelTemplateArgumentList &Args, 2880 SourceLocation Loc, 2881 DeclarationName Entity, 2882 CXXRecordDecl *ThisContext, 2883 Qualifiers ThisTypeQuals, 2884 bool EvaluateConstraints) { 2885 assert(!CodeSynthesisContexts.empty() && 2886 "Cannot perform an instantiation without some context on the " 2887 "instantiation stack"); 2888 2889 if (!NeedsInstantiationAsFunctionType(T)) 2890 return T; 2891 2892 TemplateInstantiator Instantiator(*this, Args, Loc, Entity); 2893 Instantiator.setEvaluateConstraints(EvaluateConstraints); 2894 2895 TypeLocBuilder TLB; 2896 2897 TypeLoc TL = T->getTypeLoc(); 2898 TLB.reserve(TL.getFullDataSize()); 2899 2900 QualType Result; 2901 2902 if (FunctionProtoTypeLoc Proto = 2903 TL.IgnoreParens().getAs<FunctionProtoTypeLoc>()) { 2904 // Instantiate the type, other than its exception specification. The 2905 // exception specification is instantiated in InitFunctionInstantiation 2906 // once we've built the FunctionDecl. 2907 // FIXME: Set the exception specification to EST_Uninstantiated here, 2908 // instead of rebuilding the function type again later. 2909 Result = Instantiator.TransformFunctionProtoType( 2910 TLB, Proto, ThisContext, ThisTypeQuals, 2911 [](FunctionProtoType::ExceptionSpecInfo &ESI, 2912 bool &Changed) { return false; }); 2913 } else { 2914 Result = Instantiator.TransformType(TLB, TL); 2915 } 2916 // When there are errors resolving types, clang may use IntTy as a fallback, 2917 // breaking our assumption that function declarations have function types. 2918 if (Result.isNull() || !Result->isFunctionType()) 2919 return nullptr; 2920 2921 return TLB.getTypeSourceInfo(Context, Result); 2922 } 2923 2924 bool Sema::SubstExceptionSpec(SourceLocation Loc, 2925 FunctionProtoType::ExceptionSpecInfo &ESI, 2926 SmallVectorImpl<QualType> &ExceptionStorage, 2927 const MultiLevelTemplateArgumentList &Args) { 2928 bool Changed = false; 2929 TemplateInstantiator Instantiator(*this, Args, Loc, DeclarationName()); 2930 return Instantiator.TransformExceptionSpec(Loc, ESI, ExceptionStorage, 2931 Changed); 2932 } 2933 2934 void Sema::SubstExceptionSpec(FunctionDecl *New, const FunctionProtoType *Proto, 2935 const MultiLevelTemplateArgumentList &Args) { 2936 FunctionProtoType::ExceptionSpecInfo ESI = 2937 Proto->getExtProtoInfo().ExceptionSpec; 2938 2939 SmallVector<QualType, 4> ExceptionStorage; 2940 if (SubstExceptionSpec(New->getTypeSourceInfo()->getTypeLoc().getEndLoc(), 2941 ESI, ExceptionStorage, Args)) 2942 // On error, recover by dropping the exception specification. 2943 ESI.Type = EST_None; 2944 2945 UpdateExceptionSpec(New, ESI); 2946 } 2947 2948 namespace { 2949 2950 struct GetContainedInventedTypeParmVisitor : 2951 public TypeVisitor<GetContainedInventedTypeParmVisitor, 2952 TemplateTypeParmDecl *> { 2953 using TypeVisitor<GetContainedInventedTypeParmVisitor, 2954 TemplateTypeParmDecl *>::Visit; 2955 2956 TemplateTypeParmDecl *Visit(QualType T) { 2957 if (T.isNull()) 2958 return nullptr; 2959 return Visit(T.getTypePtr()); 2960 } 2961 // The deduced type itself. 2962 TemplateTypeParmDecl *VisitTemplateTypeParmType( 2963 const TemplateTypeParmType *T) { 2964 if (!T->getDecl() || !T->getDecl()->isImplicit()) 2965 return nullptr; 2966 return T->getDecl(); 2967 } 2968 2969 // Only these types can contain 'auto' types, and subsequently be replaced 2970 // by references to invented parameters. 2971 2972 TemplateTypeParmDecl *VisitElaboratedType(const ElaboratedType *T) { 2973 return Visit(T->getNamedType()); 2974 } 2975 2976 TemplateTypeParmDecl *VisitPointerType(const PointerType *T) { 2977 return Visit(T->getPointeeType()); 2978 } 2979 2980 TemplateTypeParmDecl *VisitBlockPointerType(const BlockPointerType *T) { 2981 return Visit(T->getPointeeType()); 2982 } 2983 2984 TemplateTypeParmDecl *VisitReferenceType(const ReferenceType *T) { 2985 return Visit(T->getPointeeTypeAsWritten()); 2986 } 2987 2988 TemplateTypeParmDecl *VisitMemberPointerType(const MemberPointerType *T) { 2989 return Visit(T->getPointeeType()); 2990 } 2991 2992 TemplateTypeParmDecl *VisitArrayType(const ArrayType *T) { 2993 return Visit(T->getElementType()); 2994 } 2995 2996 TemplateTypeParmDecl *VisitDependentSizedExtVectorType( 2997 const DependentSizedExtVectorType *T) { 2998 return Visit(T->getElementType()); 2999 } 3000 3001 TemplateTypeParmDecl *VisitVectorType(const VectorType *T) { 3002 return Visit(T->getElementType()); 3003 } 3004 3005 TemplateTypeParmDecl *VisitFunctionProtoType(const FunctionProtoType *T) { 3006 return VisitFunctionType(T); 3007 } 3008 3009 TemplateTypeParmDecl *VisitFunctionType(const FunctionType *T) { 3010 return Visit(T->getReturnType()); 3011 } 3012 3013 TemplateTypeParmDecl *VisitParenType(const ParenType *T) { 3014 return Visit(T->getInnerType()); 3015 } 3016 3017 TemplateTypeParmDecl *VisitAttributedType(const AttributedType *T) { 3018 return Visit(T->getModifiedType()); 3019 } 3020 3021 TemplateTypeParmDecl *VisitMacroQualifiedType(const MacroQualifiedType *T) { 3022 return Visit(T->getUnderlyingType()); 3023 } 3024 3025 TemplateTypeParmDecl *VisitAdjustedType(const AdjustedType *T) { 3026 return Visit(T->getOriginalType()); 3027 } 3028 3029 TemplateTypeParmDecl *VisitPackExpansionType(const PackExpansionType *T) { 3030 return Visit(T->getPattern()); 3031 } 3032 }; 3033 3034 } // namespace 3035 3036 bool Sema::SubstTypeConstraint( 3037 TemplateTypeParmDecl *Inst, const TypeConstraint *TC, 3038 const MultiLevelTemplateArgumentList &TemplateArgs, 3039 bool EvaluateConstraints) { 3040 const ASTTemplateArgumentListInfo *TemplArgInfo = 3041 TC->getTemplateArgsAsWritten(); 3042 3043 if (!EvaluateConstraints) { 3044 Inst->setTypeConstraint(TC->getConceptReference(), 3045 TC->getImmediatelyDeclaredConstraint()); 3046 return false; 3047 } 3048 3049 TemplateArgumentListInfo InstArgs; 3050 3051 if (TemplArgInfo) { 3052 InstArgs.setLAngleLoc(TemplArgInfo->LAngleLoc); 3053 InstArgs.setRAngleLoc(TemplArgInfo->RAngleLoc); 3054 if (SubstTemplateArguments(TemplArgInfo->arguments(), TemplateArgs, 3055 InstArgs)) 3056 return true; 3057 } 3058 return AttachTypeConstraint( 3059 TC->getNestedNameSpecifierLoc(), TC->getConceptNameInfo(), 3060 TC->getNamedConcept(), 3061 /*FoundDecl=*/TC->getConceptReference()->getFoundDecl(), &InstArgs, Inst, 3062 Inst->isParameterPack() 3063 ? cast<CXXFoldExpr>(TC->getImmediatelyDeclaredConstraint()) 3064 ->getEllipsisLoc() 3065 : SourceLocation()); 3066 } 3067 3068 ParmVarDecl *Sema::SubstParmVarDecl( 3069 ParmVarDecl *OldParm, const MultiLevelTemplateArgumentList &TemplateArgs, 3070 int indexAdjustment, std::optional<unsigned> NumExpansions, 3071 bool ExpectParameterPack, bool EvaluateConstraint) { 3072 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 3073 TypeSourceInfo *NewDI = nullptr; 3074 3075 TypeLoc OldTL = OldDI->getTypeLoc(); 3076 if (PackExpansionTypeLoc ExpansionTL = OldTL.getAs<PackExpansionTypeLoc>()) { 3077 3078 // We have a function parameter pack. Substitute into the pattern of the 3079 // expansion. 3080 NewDI = SubstType(ExpansionTL.getPatternLoc(), TemplateArgs, 3081 OldParm->getLocation(), OldParm->getDeclName()); 3082 if (!NewDI) 3083 return nullptr; 3084 3085 if (NewDI->getType()->containsUnexpandedParameterPack()) { 3086 // We still have unexpanded parameter packs, which means that 3087 // our function parameter is still a function parameter pack. 3088 // Therefore, make its type a pack expansion type. 3089 NewDI = CheckPackExpansion(NewDI, ExpansionTL.getEllipsisLoc(), 3090 NumExpansions); 3091 } else if (ExpectParameterPack) { 3092 // We expected to get a parameter pack but didn't (because the type 3093 // itself is not a pack expansion type), so complain. This can occur when 3094 // the substitution goes through an alias template that "loses" the 3095 // pack expansion. 3096 Diag(OldParm->getLocation(), 3097 diag::err_function_parameter_pack_without_parameter_packs) 3098 << NewDI->getType(); 3099 return nullptr; 3100 } 3101 } else { 3102 NewDI = SubstType(OldDI, TemplateArgs, OldParm->getLocation(), 3103 OldParm->getDeclName()); 3104 } 3105 3106 if (!NewDI) 3107 return nullptr; 3108 3109 if (NewDI->getType()->isVoidType()) { 3110 Diag(OldParm->getLocation(), diag::err_param_with_void_type); 3111 return nullptr; 3112 } 3113 3114 // In abbreviated templates, TemplateTypeParmDecls with possible 3115 // TypeConstraints are created when the parameter list is originally parsed. 3116 // The TypeConstraints can therefore reference other functions parameters in 3117 // the abbreviated function template, which is why we must instantiate them 3118 // here, when the instantiated versions of those referenced parameters are in 3119 // scope. 3120 if (TemplateTypeParmDecl *TTP = 3121 GetContainedInventedTypeParmVisitor().Visit(OldDI->getType())) { 3122 if (const TypeConstraint *TC = TTP->getTypeConstraint()) { 3123 auto *Inst = cast_or_null<TemplateTypeParmDecl>( 3124 FindInstantiatedDecl(TTP->getLocation(), TTP, TemplateArgs)); 3125 // We will first get here when instantiating the abbreviated function 3126 // template's described function, but we might also get here later. 3127 // Make sure we do not instantiate the TypeConstraint more than once. 3128 if (Inst && !Inst->getTypeConstraint()) { 3129 if (SubstTypeConstraint(Inst, TC, TemplateArgs, EvaluateConstraint)) 3130 return nullptr; 3131 } 3132 } 3133 } 3134 3135 ParmVarDecl *NewParm = CheckParameter(Context.getTranslationUnitDecl(), 3136 OldParm->getInnerLocStart(), 3137 OldParm->getLocation(), 3138 OldParm->getIdentifier(), 3139 NewDI->getType(), NewDI, 3140 OldParm->getStorageClass()); 3141 if (!NewParm) 3142 return nullptr; 3143 3144 // Mark the (new) default argument as uninstantiated (if any). 3145 if (OldParm->hasUninstantiatedDefaultArg()) { 3146 Expr *Arg = OldParm->getUninstantiatedDefaultArg(); 3147 NewParm->setUninstantiatedDefaultArg(Arg); 3148 } else if (OldParm->hasUnparsedDefaultArg()) { 3149 NewParm->setUnparsedDefaultArg(); 3150 UnparsedDefaultArgInstantiations[OldParm].push_back(NewParm); 3151 } else if (Expr *Arg = OldParm->getDefaultArg()) { 3152 // Default arguments cannot be substituted until the declaration context 3153 // for the associated function or lambda capture class is available. 3154 // This is necessary for cases like the following where construction of 3155 // the lambda capture class for the outer lambda is dependent on the 3156 // parameter types but where the default argument is dependent on the 3157 // outer lambda's declaration context. 3158 // template <typename T> 3159 // auto f() { 3160 // return [](T = []{ return T{}; }()) { return 0; }; 3161 // } 3162 NewParm->setUninstantiatedDefaultArg(Arg); 3163 } 3164 3165 NewParm->setExplicitObjectParameterLoc( 3166 OldParm->getExplicitObjectParamThisLoc()); 3167 NewParm->setHasInheritedDefaultArg(OldParm->hasInheritedDefaultArg()); 3168 3169 if (OldParm->isParameterPack() && !NewParm->isParameterPack()) { 3170 // Add the new parameter to the instantiated parameter pack. 3171 CurrentInstantiationScope->InstantiatedLocalPackArg(OldParm, NewParm); 3172 } else { 3173 // Introduce an Old -> New mapping 3174 CurrentInstantiationScope->InstantiatedLocal(OldParm, NewParm); 3175 } 3176 3177 // FIXME: OldParm may come from a FunctionProtoType, in which case CurContext 3178 // can be anything, is this right ? 3179 NewParm->setDeclContext(CurContext); 3180 3181 NewParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 3182 OldParm->getFunctionScopeIndex() + indexAdjustment); 3183 3184 InstantiateAttrs(TemplateArgs, OldParm, NewParm); 3185 3186 return NewParm; 3187 } 3188 3189 bool Sema::SubstParmTypes( 3190 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 3191 const FunctionProtoType::ExtParameterInfo *ExtParamInfos, 3192 const MultiLevelTemplateArgumentList &TemplateArgs, 3193 SmallVectorImpl<QualType> &ParamTypes, 3194 SmallVectorImpl<ParmVarDecl *> *OutParams, 3195 ExtParameterInfoBuilder &ParamInfos) { 3196 assert(!CodeSynthesisContexts.empty() && 3197 "Cannot perform an instantiation without some context on the " 3198 "instantiation stack"); 3199 3200 TemplateInstantiator Instantiator(*this, TemplateArgs, Loc, 3201 DeclarationName()); 3202 return Instantiator.TransformFunctionTypeParams( 3203 Loc, Params, nullptr, ExtParamInfos, ParamTypes, OutParams, ParamInfos); 3204 } 3205 3206 bool Sema::SubstDefaultArgument( 3207 SourceLocation Loc, 3208 ParmVarDecl *Param, 3209 const MultiLevelTemplateArgumentList &TemplateArgs, 3210 bool ForCallExpr) { 3211 FunctionDecl *FD = cast<FunctionDecl>(Param->getDeclContext()); 3212 Expr *PatternExpr = Param->getUninstantiatedDefaultArg(); 3213 3214 EnterExpressionEvaluationContext EvalContext( 3215 *this, ExpressionEvaluationContext::PotentiallyEvaluated, Param); 3216 3217 InstantiatingTemplate Inst(*this, Loc, Param, TemplateArgs.getInnermost()); 3218 if (Inst.isInvalid()) 3219 return true; 3220 if (Inst.isAlreadyInstantiating()) { 3221 Diag(Param->getBeginLoc(), diag::err_recursive_default_argument) << FD; 3222 Param->setInvalidDecl(); 3223 return true; 3224 } 3225 3226 ExprResult Result; 3227 { 3228 // C++ [dcl.fct.default]p5: 3229 // The names in the [default argument] expression are bound, and 3230 // the semantic constraints are checked, at the point where the 3231 // default argument expression appears. 3232 ContextRAII SavedContext(*this, FD); 3233 std::unique_ptr<LocalInstantiationScope> LIS; 3234 MultiLevelTemplateArgumentList NewTemplateArgs = TemplateArgs; 3235 3236 if (ForCallExpr) { 3237 // When instantiating a default argument due to use in a call expression, 3238 // an instantiation scope that includes the parameters of the callee is 3239 // required to satisfy references from the default argument. For example: 3240 // template<typename T> void f(T a, int = decltype(a)()); 3241 // void g() { f(0); } 3242 LIS = std::make_unique<LocalInstantiationScope>(*this); 3243 FunctionDecl *PatternFD = FD->getTemplateInstantiationPattern( 3244 /*ForDefinition*/ false); 3245 if (addInstantiatedParametersToScope(FD, PatternFD, *LIS, TemplateArgs)) 3246 return true; 3247 const FunctionTemplateDecl *PrimaryTemplate = FD->getPrimaryTemplate(); 3248 if (PrimaryTemplate && PrimaryTemplate->isOutOfLine()) { 3249 TemplateArgumentList *CurrentTemplateArgumentList = 3250 TemplateArgumentList::CreateCopy(getASTContext(), 3251 TemplateArgs.getInnermost()); 3252 NewTemplateArgs = getTemplateInstantiationArgs( 3253 FD, FD->getDeclContext(), /*Final=*/false, 3254 CurrentTemplateArgumentList->asArray(), /*RelativeToPrimary=*/true); 3255 } 3256 } 3257 3258 runWithSufficientStackSpace(Loc, [&] { 3259 Result = SubstInitializer(PatternExpr, NewTemplateArgs, 3260 /*DirectInit*/ false); 3261 }); 3262 } 3263 if (Result.isInvalid()) 3264 return true; 3265 3266 if (ForCallExpr) { 3267 // Check the expression as an initializer for the parameter. 3268 InitializedEntity Entity 3269 = InitializedEntity::InitializeParameter(Context, Param); 3270 InitializationKind Kind = InitializationKind::CreateCopy( 3271 Param->getLocation(), 3272 /*FIXME:EqualLoc*/ PatternExpr->getBeginLoc()); 3273 Expr *ResultE = Result.getAs<Expr>(); 3274 3275 InitializationSequence InitSeq(*this, Entity, Kind, ResultE); 3276 Result = InitSeq.Perform(*this, Entity, Kind, ResultE); 3277 if (Result.isInvalid()) 3278 return true; 3279 3280 Result = 3281 ActOnFinishFullExpr(Result.getAs<Expr>(), Param->getOuterLocStart(), 3282 /*DiscardedValue*/ false); 3283 } else { 3284 // FIXME: Obtain the source location for the '=' token. 3285 SourceLocation EqualLoc = PatternExpr->getBeginLoc(); 3286 Result = ConvertParamDefaultArgument(Param, Result.getAs<Expr>(), EqualLoc); 3287 } 3288 if (Result.isInvalid()) 3289 return true; 3290 3291 // Remember the instantiated default argument. 3292 Param->setDefaultArg(Result.getAs<Expr>()); 3293 3294 return false; 3295 } 3296 3297 bool 3298 Sema::SubstBaseSpecifiers(CXXRecordDecl *Instantiation, 3299 CXXRecordDecl *Pattern, 3300 const MultiLevelTemplateArgumentList &TemplateArgs) { 3301 bool Invalid = false; 3302 SmallVector<CXXBaseSpecifier*, 4> InstantiatedBases; 3303 for (const auto &Base : Pattern->bases()) { 3304 if (!Base.getType()->isDependentType()) { 3305 if (const CXXRecordDecl *RD = Base.getType()->getAsCXXRecordDecl()) { 3306 if (RD->isInvalidDecl()) 3307 Instantiation->setInvalidDecl(); 3308 } 3309 InstantiatedBases.push_back(new (Context) CXXBaseSpecifier(Base)); 3310 continue; 3311 } 3312 3313 SourceLocation EllipsisLoc; 3314 TypeSourceInfo *BaseTypeLoc; 3315 if (Base.isPackExpansion()) { 3316 // This is a pack expansion. See whether we should expand it now, or 3317 // wait until later. 3318 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3319 collectUnexpandedParameterPacks(Base.getTypeSourceInfo()->getTypeLoc(), 3320 Unexpanded); 3321 bool ShouldExpand = false; 3322 bool RetainExpansion = false; 3323 std::optional<unsigned> NumExpansions; 3324 if (CheckParameterPacksForExpansion(Base.getEllipsisLoc(), 3325 Base.getSourceRange(), 3326 Unexpanded, 3327 TemplateArgs, ShouldExpand, 3328 RetainExpansion, 3329 NumExpansions)) { 3330 Invalid = true; 3331 continue; 3332 } 3333 3334 // If we should expand this pack expansion now, do so. 3335 if (ShouldExpand) { 3336 for (unsigned I = 0; I != *NumExpansions; ++I) { 3337 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(*this, I); 3338 3339 TypeSourceInfo *BaseTypeLoc = SubstType(Base.getTypeSourceInfo(), 3340 TemplateArgs, 3341 Base.getSourceRange().getBegin(), 3342 DeclarationName()); 3343 if (!BaseTypeLoc) { 3344 Invalid = true; 3345 continue; 3346 } 3347 3348 if (CXXBaseSpecifier *InstantiatedBase 3349 = CheckBaseSpecifier(Instantiation, 3350 Base.getSourceRange(), 3351 Base.isVirtual(), 3352 Base.getAccessSpecifierAsWritten(), 3353 BaseTypeLoc, 3354 SourceLocation())) 3355 InstantiatedBases.push_back(InstantiatedBase); 3356 else 3357 Invalid = true; 3358 } 3359 3360 continue; 3361 } 3362 3363 // The resulting base specifier will (still) be a pack expansion. 3364 EllipsisLoc = Base.getEllipsisLoc(); 3365 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(*this, -1); 3366 BaseTypeLoc = SubstType(Base.getTypeSourceInfo(), 3367 TemplateArgs, 3368 Base.getSourceRange().getBegin(), 3369 DeclarationName()); 3370 } else { 3371 BaseTypeLoc = SubstType(Base.getTypeSourceInfo(), 3372 TemplateArgs, 3373 Base.getSourceRange().getBegin(), 3374 DeclarationName()); 3375 } 3376 3377 if (!BaseTypeLoc) { 3378 Invalid = true; 3379 continue; 3380 } 3381 3382 if (CXXBaseSpecifier *InstantiatedBase 3383 = CheckBaseSpecifier(Instantiation, 3384 Base.getSourceRange(), 3385 Base.isVirtual(), 3386 Base.getAccessSpecifierAsWritten(), 3387 BaseTypeLoc, 3388 EllipsisLoc)) 3389 InstantiatedBases.push_back(InstantiatedBase); 3390 else 3391 Invalid = true; 3392 } 3393 3394 if (!Invalid && AttachBaseSpecifiers(Instantiation, InstantiatedBases)) 3395 Invalid = true; 3396 3397 return Invalid; 3398 } 3399 3400 // Defined via #include from SemaTemplateInstantiateDecl.cpp 3401 namespace clang { 3402 namespace sema { 3403 Attr *instantiateTemplateAttribute(const Attr *At, ASTContext &C, Sema &S, 3404 const MultiLevelTemplateArgumentList &TemplateArgs); 3405 Attr *instantiateTemplateAttributeForDecl( 3406 const Attr *At, ASTContext &C, Sema &S, 3407 const MultiLevelTemplateArgumentList &TemplateArgs); 3408 } 3409 } 3410 3411 bool 3412 Sema::InstantiateClass(SourceLocation PointOfInstantiation, 3413 CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, 3414 const MultiLevelTemplateArgumentList &TemplateArgs, 3415 TemplateSpecializationKind TSK, 3416 bool Complain) { 3417 CXXRecordDecl *PatternDef 3418 = cast_or_null<CXXRecordDecl>(Pattern->getDefinition()); 3419 if (DiagnoseUninstantiableTemplate(PointOfInstantiation, Instantiation, 3420 Instantiation->getInstantiatedFromMemberClass(), 3421 Pattern, PatternDef, TSK, Complain)) 3422 return true; 3423 3424 llvm::TimeTraceScope TimeScope("InstantiateClass", [&]() { 3425 llvm::TimeTraceMetadata M; 3426 llvm::raw_string_ostream OS(M.Detail); 3427 Instantiation->getNameForDiagnostic(OS, getPrintingPolicy(), 3428 /*Qualified=*/true); 3429 if (llvm::isTimeTraceVerbose()) { 3430 auto Loc = SourceMgr.getExpansionLoc(Instantiation->getLocation()); 3431 M.File = SourceMgr.getFilename(Loc); 3432 M.Line = SourceMgr.getExpansionLineNumber(Loc); 3433 } 3434 return M; 3435 }); 3436 3437 Pattern = PatternDef; 3438 3439 // Record the point of instantiation. 3440 if (MemberSpecializationInfo *MSInfo 3441 = Instantiation->getMemberSpecializationInfo()) { 3442 MSInfo->setTemplateSpecializationKind(TSK); 3443 MSInfo->setPointOfInstantiation(PointOfInstantiation); 3444 } else if (ClassTemplateSpecializationDecl *Spec 3445 = dyn_cast<ClassTemplateSpecializationDecl>(Instantiation)) { 3446 Spec->setTemplateSpecializationKind(TSK); 3447 Spec->setPointOfInstantiation(PointOfInstantiation); 3448 } 3449 3450 InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation); 3451 if (Inst.isInvalid()) 3452 return true; 3453 assert(!Inst.isAlreadyInstantiating() && "should have been caught by caller"); 3454 PrettyDeclStackTraceEntry CrashInfo(Context, Instantiation, SourceLocation(), 3455 "instantiating class definition"); 3456 3457 // Enter the scope of this instantiation. We don't use 3458 // PushDeclContext because we don't have a scope. 3459 ContextRAII SavedContext(*this, Instantiation); 3460 EnterExpressionEvaluationContext EvalContext( 3461 *this, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 3462 3463 // If this is an instantiation of a local class, merge this local 3464 // instantiation scope with the enclosing scope. Otherwise, every 3465 // instantiation of a class has its own local instantiation scope. 3466 bool MergeWithParentScope = !Instantiation->isDefinedOutsideFunctionOrMethod(); 3467 LocalInstantiationScope Scope(*this, MergeWithParentScope); 3468 3469 // Some class state isn't processed immediately but delayed till class 3470 // instantiation completes. We may not be ready to handle any delayed state 3471 // already on the stack as it might correspond to a different class, so save 3472 // it now and put it back later. 3473 SavePendingParsedClassStateRAII SavedPendingParsedClassState(*this); 3474 3475 // Pull attributes from the pattern onto the instantiation. 3476 InstantiateAttrs(TemplateArgs, Pattern, Instantiation); 3477 3478 // Start the definition of this instantiation. 3479 Instantiation->startDefinition(); 3480 3481 // The instantiation is visible here, even if it was first declared in an 3482 // unimported module. 3483 Instantiation->setVisibleDespiteOwningModule(); 3484 3485 // FIXME: This loses the as-written tag kind for an explicit instantiation. 3486 Instantiation->setTagKind(Pattern->getTagKind()); 3487 3488 // Do substitution on the base class specifiers. 3489 if (SubstBaseSpecifiers(Instantiation, Pattern, TemplateArgs)) 3490 Instantiation->setInvalidDecl(); 3491 3492 TemplateDeclInstantiator Instantiator(*this, Instantiation, TemplateArgs); 3493 Instantiator.setEvaluateConstraints(false); 3494 SmallVector<Decl*, 4> Fields; 3495 // Delay instantiation of late parsed attributes. 3496 LateInstantiatedAttrVec LateAttrs; 3497 Instantiator.enableLateAttributeInstantiation(&LateAttrs); 3498 3499 bool MightHaveConstexprVirtualFunctions = false; 3500 for (auto *Member : Pattern->decls()) { 3501 // Don't instantiate members not belonging in this semantic context. 3502 // e.g. for: 3503 // @code 3504 // template <int i> class A { 3505 // class B *g; 3506 // }; 3507 // @endcode 3508 // 'class B' has the template as lexical context but semantically it is 3509 // introduced in namespace scope. 3510 if (Member->getDeclContext() != Pattern) 3511 continue; 3512 3513 // BlockDecls can appear in a default-member-initializer. They must be the 3514 // child of a BlockExpr, so we only know how to instantiate them from there. 3515 // Similarly, lambda closure types are recreated when instantiating the 3516 // corresponding LambdaExpr. 3517 if (isa<BlockDecl>(Member) || 3518 (isa<CXXRecordDecl>(Member) && cast<CXXRecordDecl>(Member)->isLambda())) 3519 continue; 3520 3521 if (Member->isInvalidDecl()) { 3522 Instantiation->setInvalidDecl(); 3523 continue; 3524 } 3525 3526 Decl *NewMember = Instantiator.Visit(Member); 3527 if (NewMember) { 3528 if (FieldDecl *Field = dyn_cast<FieldDecl>(NewMember)) { 3529 Fields.push_back(Field); 3530 } else if (EnumDecl *Enum = dyn_cast<EnumDecl>(NewMember)) { 3531 // C++11 [temp.inst]p1: The implicit instantiation of a class template 3532 // specialization causes the implicit instantiation of the definitions 3533 // of unscoped member enumerations. 3534 // Record a point of instantiation for this implicit instantiation. 3535 if (TSK == TSK_ImplicitInstantiation && !Enum->isScoped() && 3536 Enum->isCompleteDefinition()) { 3537 MemberSpecializationInfo *MSInfo =Enum->getMemberSpecializationInfo(); 3538 assert(MSInfo && "no spec info for member enum specialization"); 3539 MSInfo->setTemplateSpecializationKind(TSK_ImplicitInstantiation); 3540 MSInfo->setPointOfInstantiation(PointOfInstantiation); 3541 } 3542 } else if (StaticAssertDecl *SA = dyn_cast<StaticAssertDecl>(NewMember)) { 3543 if (SA->isFailed()) { 3544 // A static_assert failed. Bail out; instantiating this 3545 // class is probably not meaningful. 3546 Instantiation->setInvalidDecl(); 3547 break; 3548 } 3549 } else if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewMember)) { 3550 if (MD->isConstexpr() && !MD->getFriendObjectKind() && 3551 (MD->isVirtualAsWritten() || Instantiation->getNumBases())) 3552 MightHaveConstexprVirtualFunctions = true; 3553 } 3554 3555 if (NewMember->isInvalidDecl()) 3556 Instantiation->setInvalidDecl(); 3557 } else { 3558 // FIXME: Eventually, a NULL return will mean that one of the 3559 // instantiations was a semantic disaster, and we'll want to mark the 3560 // declaration invalid. 3561 // For now, we expect to skip some members that we can't yet handle. 3562 } 3563 } 3564 3565 // Finish checking fields. 3566 ActOnFields(nullptr, Instantiation->getLocation(), Instantiation, Fields, 3567 SourceLocation(), SourceLocation(), ParsedAttributesView()); 3568 CheckCompletedCXXClass(nullptr, Instantiation); 3569 3570 // Default arguments are parsed, if not instantiated. We can go instantiate 3571 // default arg exprs for default constructors if necessary now. Unless we're 3572 // parsing a class, in which case wait until that's finished. 3573 if (ParsingClassDepth == 0) 3574 ActOnFinishCXXNonNestedClass(); 3575 3576 // Instantiate late parsed attributes, and attach them to their decls. 3577 // See Sema::InstantiateAttrs 3578 for (LateInstantiatedAttrVec::iterator I = LateAttrs.begin(), 3579 E = LateAttrs.end(); I != E; ++I) { 3580 assert(CurrentInstantiationScope == Instantiator.getStartingScope()); 3581 CurrentInstantiationScope = I->Scope; 3582 3583 // Allow 'this' within late-parsed attributes. 3584 auto *ND = cast<NamedDecl>(I->NewDecl); 3585 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext()); 3586 CXXThisScopeRAII ThisScope(*this, ThisContext, Qualifiers(), 3587 ND->isCXXInstanceMember()); 3588 3589 Attr *NewAttr = 3590 instantiateTemplateAttribute(I->TmplAttr, Context, *this, TemplateArgs); 3591 if (NewAttr) 3592 I->NewDecl->addAttr(NewAttr); 3593 LocalInstantiationScope::deleteScopes(I->Scope, 3594 Instantiator.getStartingScope()); 3595 } 3596 Instantiator.disableLateAttributeInstantiation(); 3597 LateAttrs.clear(); 3598 3599 ActOnFinishDelayedMemberInitializers(Instantiation); 3600 3601 // FIXME: We should do something similar for explicit instantiations so they 3602 // end up in the right module. 3603 if (TSK == TSK_ImplicitInstantiation) { 3604 Instantiation->setLocation(Pattern->getLocation()); 3605 Instantiation->setLocStart(Pattern->getInnerLocStart()); 3606 Instantiation->setBraceRange(Pattern->getBraceRange()); 3607 } 3608 3609 if (!Instantiation->isInvalidDecl()) { 3610 // Perform any dependent diagnostics from the pattern. 3611 if (Pattern->isDependentContext()) 3612 PerformDependentDiagnostics(Pattern, TemplateArgs); 3613 3614 // Instantiate any out-of-line class template partial 3615 // specializations now. 3616 for (TemplateDeclInstantiator::delayed_partial_spec_iterator 3617 P = Instantiator.delayed_partial_spec_begin(), 3618 PEnd = Instantiator.delayed_partial_spec_end(); 3619 P != PEnd; ++P) { 3620 if (!Instantiator.InstantiateClassTemplatePartialSpecialization( 3621 P->first, P->second)) { 3622 Instantiation->setInvalidDecl(); 3623 break; 3624 } 3625 } 3626 3627 // Instantiate any out-of-line variable template partial 3628 // specializations now. 3629 for (TemplateDeclInstantiator::delayed_var_partial_spec_iterator 3630 P = Instantiator.delayed_var_partial_spec_begin(), 3631 PEnd = Instantiator.delayed_var_partial_spec_end(); 3632 P != PEnd; ++P) { 3633 if (!Instantiator.InstantiateVarTemplatePartialSpecialization( 3634 P->first, P->second)) { 3635 Instantiation->setInvalidDecl(); 3636 break; 3637 } 3638 } 3639 } 3640 3641 // Exit the scope of this instantiation. 3642 SavedContext.pop(); 3643 3644 if (!Instantiation->isInvalidDecl()) { 3645 // Always emit the vtable for an explicit instantiation definition 3646 // of a polymorphic class template specialization. Otherwise, eagerly 3647 // instantiate only constexpr virtual functions in preparation for their use 3648 // in constant evaluation. 3649 if (TSK == TSK_ExplicitInstantiationDefinition) 3650 MarkVTableUsed(PointOfInstantiation, Instantiation, true); 3651 else if (MightHaveConstexprVirtualFunctions) 3652 MarkVirtualMembersReferenced(PointOfInstantiation, Instantiation, 3653 /*ConstexprOnly*/ true); 3654 } 3655 3656 Consumer.HandleTagDeclDefinition(Instantiation); 3657 3658 return Instantiation->isInvalidDecl(); 3659 } 3660 3661 bool Sema::InstantiateEnum(SourceLocation PointOfInstantiation, 3662 EnumDecl *Instantiation, EnumDecl *Pattern, 3663 const MultiLevelTemplateArgumentList &TemplateArgs, 3664 TemplateSpecializationKind TSK) { 3665 EnumDecl *PatternDef = Pattern->getDefinition(); 3666 if (DiagnoseUninstantiableTemplate(PointOfInstantiation, Instantiation, 3667 Instantiation->getInstantiatedFromMemberEnum(), 3668 Pattern, PatternDef, TSK,/*Complain*/true)) 3669 return true; 3670 Pattern = PatternDef; 3671 3672 // Record the point of instantiation. 3673 if (MemberSpecializationInfo *MSInfo 3674 = Instantiation->getMemberSpecializationInfo()) { 3675 MSInfo->setTemplateSpecializationKind(TSK); 3676 MSInfo->setPointOfInstantiation(PointOfInstantiation); 3677 } 3678 3679 InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation); 3680 if (Inst.isInvalid()) 3681 return true; 3682 if (Inst.isAlreadyInstantiating()) 3683 return false; 3684 PrettyDeclStackTraceEntry CrashInfo(Context, Instantiation, SourceLocation(), 3685 "instantiating enum definition"); 3686 3687 // The instantiation is visible here, even if it was first declared in an 3688 // unimported module. 3689 Instantiation->setVisibleDespiteOwningModule(); 3690 3691 // Enter the scope of this instantiation. We don't use 3692 // PushDeclContext because we don't have a scope. 3693 ContextRAII SavedContext(*this, Instantiation); 3694 EnterExpressionEvaluationContext EvalContext( 3695 *this, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 3696 3697 LocalInstantiationScope Scope(*this, /*MergeWithParentScope*/true); 3698 3699 // Pull attributes from the pattern onto the instantiation. 3700 InstantiateAttrs(TemplateArgs, Pattern, Instantiation); 3701 3702 TemplateDeclInstantiator Instantiator(*this, Instantiation, TemplateArgs); 3703 Instantiator.InstantiateEnumDefinition(Instantiation, Pattern); 3704 3705 // Exit the scope of this instantiation. 3706 SavedContext.pop(); 3707 3708 return Instantiation->isInvalidDecl(); 3709 } 3710 3711 bool Sema::InstantiateInClassInitializer( 3712 SourceLocation PointOfInstantiation, FieldDecl *Instantiation, 3713 FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs) { 3714 // If there is no initializer, we don't need to do anything. 3715 if (!Pattern->hasInClassInitializer()) 3716 return false; 3717 3718 assert(Instantiation->getInClassInitStyle() == 3719 Pattern->getInClassInitStyle() && 3720 "pattern and instantiation disagree about init style"); 3721 3722 // Error out if we haven't parsed the initializer of the pattern yet because 3723 // we are waiting for the closing brace of the outer class. 3724 Expr *OldInit = Pattern->getInClassInitializer(); 3725 if (!OldInit) { 3726 RecordDecl *PatternRD = Pattern->getParent(); 3727 RecordDecl *OutermostClass = PatternRD->getOuterLexicalRecordContext(); 3728 Diag(PointOfInstantiation, 3729 diag::err_default_member_initializer_not_yet_parsed) 3730 << OutermostClass << Pattern; 3731 Diag(Pattern->getEndLoc(), 3732 diag::note_default_member_initializer_not_yet_parsed); 3733 Instantiation->setInvalidDecl(); 3734 return true; 3735 } 3736 3737 InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation); 3738 if (Inst.isInvalid()) 3739 return true; 3740 if (Inst.isAlreadyInstantiating()) { 3741 // Error out if we hit an instantiation cycle for this initializer. 3742 Diag(PointOfInstantiation, diag::err_default_member_initializer_cycle) 3743 << Instantiation; 3744 return true; 3745 } 3746 PrettyDeclStackTraceEntry CrashInfo(Context, Instantiation, SourceLocation(), 3747 "instantiating default member init"); 3748 3749 // Enter the scope of this instantiation. We don't use PushDeclContext because 3750 // we don't have a scope. 3751 ContextRAII SavedContext(*this, Instantiation->getParent()); 3752 EnterExpressionEvaluationContext EvalContext( 3753 *this, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 3754 ExprEvalContexts.back().DelayedDefaultInitializationContext = { 3755 PointOfInstantiation, Instantiation, CurContext}; 3756 3757 LocalInstantiationScope Scope(*this, true); 3758 3759 // Instantiate the initializer. 3760 ActOnStartCXXInClassMemberInitializer(); 3761 CXXThisScopeRAII ThisScope(*this, Instantiation->getParent(), Qualifiers()); 3762 3763 ExprResult NewInit = SubstInitializer(OldInit, TemplateArgs, 3764 /*CXXDirectInit=*/false); 3765 Expr *Init = NewInit.get(); 3766 assert((!Init || !isa<ParenListExpr>(Init)) && "call-style init in class"); 3767 ActOnFinishCXXInClassMemberInitializer( 3768 Instantiation, Init ? Init->getBeginLoc() : SourceLocation(), Init); 3769 3770 if (auto *L = getASTMutationListener()) 3771 L->DefaultMemberInitializerInstantiated(Instantiation); 3772 3773 // Return true if the in-class initializer is still missing. 3774 return !Instantiation->getInClassInitializer(); 3775 } 3776 3777 namespace { 3778 /// A partial specialization whose template arguments have matched 3779 /// a given template-id. 3780 struct PartialSpecMatchResult { 3781 ClassTemplatePartialSpecializationDecl *Partial; 3782 TemplateArgumentList *Args; 3783 }; 3784 } 3785 3786 bool Sema::usesPartialOrExplicitSpecialization( 3787 SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec) { 3788 if (ClassTemplateSpec->getTemplateSpecializationKind() == 3789 TSK_ExplicitSpecialization) 3790 return true; 3791 3792 SmallVector<ClassTemplatePartialSpecializationDecl *, 4> PartialSpecs; 3793 ClassTemplateSpec->getSpecializedTemplate() 3794 ->getPartialSpecializations(PartialSpecs); 3795 for (unsigned I = 0, N = PartialSpecs.size(); I != N; ++I) { 3796 TemplateDeductionInfo Info(Loc); 3797 if (DeduceTemplateArguments(PartialSpecs[I], 3798 ClassTemplateSpec->getTemplateArgs().asArray(), 3799 Info) == TemplateDeductionResult::Success) 3800 return true; 3801 } 3802 3803 return false; 3804 } 3805 3806 /// Get the instantiation pattern to use to instantiate the definition of a 3807 /// given ClassTemplateSpecializationDecl (either the pattern of the primary 3808 /// template or of a partial specialization). 3809 static ActionResult<CXXRecordDecl *> 3810 getPatternForClassTemplateSpecialization( 3811 Sema &S, SourceLocation PointOfInstantiation, 3812 ClassTemplateSpecializationDecl *ClassTemplateSpec, 3813 TemplateSpecializationKind TSK) { 3814 Sema::InstantiatingTemplate Inst(S, PointOfInstantiation, ClassTemplateSpec); 3815 if (Inst.isInvalid()) 3816 return {/*Invalid=*/true}; 3817 if (Inst.isAlreadyInstantiating()) 3818 return {/*Invalid=*/false}; 3819 3820 llvm::PointerUnion<ClassTemplateDecl *, 3821 ClassTemplatePartialSpecializationDecl *> 3822 Specialized = ClassTemplateSpec->getSpecializedTemplateOrPartial(); 3823 if (!Specialized.is<ClassTemplatePartialSpecializationDecl *>()) { 3824 // Find best matching specialization. 3825 ClassTemplateDecl *Template = ClassTemplateSpec->getSpecializedTemplate(); 3826 3827 // C++ [temp.class.spec.match]p1: 3828 // When a class template is used in a context that requires an 3829 // instantiation of the class, it is necessary to determine 3830 // whether the instantiation is to be generated using the primary 3831 // template or one of the partial specializations. This is done by 3832 // matching the template arguments of the class template 3833 // specialization with the template argument lists of the partial 3834 // specializations. 3835 typedef PartialSpecMatchResult MatchResult; 3836 SmallVector<MatchResult, 4> Matched; 3837 SmallVector<ClassTemplatePartialSpecializationDecl *, 4> PartialSpecs; 3838 Template->getPartialSpecializations(PartialSpecs); 3839 TemplateSpecCandidateSet FailedCandidates(PointOfInstantiation); 3840 for (unsigned I = 0, N = PartialSpecs.size(); I != N; ++I) { 3841 ClassTemplatePartialSpecializationDecl *Partial = PartialSpecs[I]; 3842 TemplateDeductionInfo Info(FailedCandidates.getLocation()); 3843 if (TemplateDeductionResult Result = S.DeduceTemplateArguments( 3844 Partial, ClassTemplateSpec->getTemplateArgs().asArray(), Info); 3845 Result != TemplateDeductionResult::Success) { 3846 // Store the failed-deduction information for use in diagnostics, later. 3847 // TODO: Actually use the failed-deduction info? 3848 FailedCandidates.addCandidate().set( 3849 DeclAccessPair::make(Template, AS_public), Partial, 3850 MakeDeductionFailureInfo(S.Context, Result, Info)); 3851 (void)Result; 3852 } else { 3853 Matched.push_back(PartialSpecMatchResult()); 3854 Matched.back().Partial = Partial; 3855 Matched.back().Args = Info.takeCanonical(); 3856 } 3857 } 3858 3859 // If we're dealing with a member template where the template parameters 3860 // have been instantiated, this provides the original template parameters 3861 // from which the member template's parameters were instantiated. 3862 3863 if (Matched.size() >= 1) { 3864 SmallVectorImpl<MatchResult>::iterator Best = Matched.begin(); 3865 if (Matched.size() == 1) { 3866 // -- If exactly one matching specialization is found, the 3867 // instantiation is generated from that specialization. 3868 // We don't need to do anything for this. 3869 } else { 3870 // -- If more than one matching specialization is found, the 3871 // partial order rules (14.5.4.2) are used to determine 3872 // whether one of the specializations is more specialized 3873 // than the others. If none of the specializations is more 3874 // specialized than all of the other matching 3875 // specializations, then the use of the class template is 3876 // ambiguous and the program is ill-formed. 3877 for (SmallVectorImpl<MatchResult>::iterator P = Best + 1, 3878 PEnd = Matched.end(); 3879 P != PEnd; ++P) { 3880 if (S.getMoreSpecializedPartialSpecialization( 3881 P->Partial, Best->Partial, PointOfInstantiation) == 3882 P->Partial) 3883 Best = P; 3884 } 3885 3886 // Determine if the best partial specialization is more specialized than 3887 // the others. 3888 bool Ambiguous = false; 3889 for (SmallVectorImpl<MatchResult>::iterator P = Matched.begin(), 3890 PEnd = Matched.end(); 3891 P != PEnd; ++P) { 3892 if (P != Best && S.getMoreSpecializedPartialSpecialization( 3893 P->Partial, Best->Partial, 3894 PointOfInstantiation) != Best->Partial) { 3895 Ambiguous = true; 3896 break; 3897 } 3898 } 3899 3900 if (Ambiguous) { 3901 // Partial ordering did not produce a clear winner. Complain. 3902 Inst.Clear(); 3903 ClassTemplateSpec->setInvalidDecl(); 3904 S.Diag(PointOfInstantiation, 3905 diag::err_partial_spec_ordering_ambiguous) 3906 << ClassTemplateSpec; 3907 3908 // Print the matching partial specializations. 3909 for (SmallVectorImpl<MatchResult>::iterator P = Matched.begin(), 3910 PEnd = Matched.end(); 3911 P != PEnd; ++P) 3912 S.Diag(P->Partial->getLocation(), diag::note_partial_spec_match) 3913 << S.getTemplateArgumentBindingsText( 3914 P->Partial->getTemplateParameters(), *P->Args); 3915 3916 return {/*Invalid=*/true}; 3917 } 3918 } 3919 3920 ClassTemplateSpec->setInstantiationOf(Best->Partial, Best->Args); 3921 } else { 3922 // -- If no matches are found, the instantiation is generated 3923 // from the primary template. 3924 } 3925 } 3926 3927 CXXRecordDecl *Pattern = nullptr; 3928 Specialized = ClassTemplateSpec->getSpecializedTemplateOrPartial(); 3929 if (auto *PartialSpec = 3930 Specialized.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) { 3931 // Instantiate using the best class template partial specialization. 3932 while (PartialSpec->getInstantiatedFromMember()) { 3933 // If we've found an explicit specialization of this class template, 3934 // stop here and use that as the pattern. 3935 if (PartialSpec->isMemberSpecialization()) 3936 break; 3937 3938 PartialSpec = PartialSpec->getInstantiatedFromMember(); 3939 } 3940 Pattern = PartialSpec; 3941 } else { 3942 ClassTemplateDecl *Template = ClassTemplateSpec->getSpecializedTemplate(); 3943 while (Template->getInstantiatedFromMemberTemplate()) { 3944 // If we've found an explicit specialization of this class template, 3945 // stop here and use that as the pattern. 3946 if (Template->isMemberSpecialization()) 3947 break; 3948 3949 Template = Template->getInstantiatedFromMemberTemplate(); 3950 } 3951 Pattern = Template->getTemplatedDecl(); 3952 } 3953 3954 return Pattern; 3955 } 3956 3957 bool Sema::InstantiateClassTemplateSpecialization( 3958 SourceLocation PointOfInstantiation, 3959 ClassTemplateSpecializationDecl *ClassTemplateSpec, 3960 TemplateSpecializationKind TSK, bool Complain) { 3961 // Perform the actual instantiation on the canonical declaration. 3962 ClassTemplateSpec = cast<ClassTemplateSpecializationDecl>( 3963 ClassTemplateSpec->getCanonicalDecl()); 3964 if (ClassTemplateSpec->isInvalidDecl()) 3965 return true; 3966 3967 ActionResult<CXXRecordDecl *> Pattern = 3968 getPatternForClassTemplateSpecialization(*this, PointOfInstantiation, 3969 ClassTemplateSpec, TSK); 3970 if (!Pattern.isUsable()) 3971 return Pattern.isInvalid(); 3972 3973 return InstantiateClass( 3974 PointOfInstantiation, ClassTemplateSpec, Pattern.get(), 3975 getTemplateInstantiationArgs(ClassTemplateSpec), TSK, Complain); 3976 } 3977 3978 void 3979 Sema::InstantiateClassMembers(SourceLocation PointOfInstantiation, 3980 CXXRecordDecl *Instantiation, 3981 const MultiLevelTemplateArgumentList &TemplateArgs, 3982 TemplateSpecializationKind TSK) { 3983 // FIXME: We need to notify the ASTMutationListener that we did all of these 3984 // things, in case we have an explicit instantiation definition in a PCM, a 3985 // module, or preamble, and the declaration is in an imported AST. 3986 assert( 3987 (TSK == TSK_ExplicitInstantiationDefinition || 3988 TSK == TSK_ExplicitInstantiationDeclaration || 3989 (TSK == TSK_ImplicitInstantiation && Instantiation->isLocalClass())) && 3990 "Unexpected template specialization kind!"); 3991 for (auto *D : Instantiation->decls()) { 3992 bool SuppressNew = false; 3993 if (auto *Function = dyn_cast<FunctionDecl>(D)) { 3994 if (FunctionDecl *Pattern = 3995 Function->getInstantiatedFromMemberFunction()) { 3996 3997 if (Function->isIneligibleOrNotSelected()) 3998 continue; 3999 4000 if (Function->getTrailingRequiresClause()) { 4001 ConstraintSatisfaction Satisfaction; 4002 if (CheckFunctionConstraints(Function, Satisfaction) || 4003 !Satisfaction.IsSatisfied) { 4004 continue; 4005 } 4006 } 4007 4008 if (Function->hasAttr<ExcludeFromExplicitInstantiationAttr>()) 4009 continue; 4010 4011 MemberSpecializationInfo *MSInfo = 4012 Function->getMemberSpecializationInfo(); 4013 assert(MSInfo && "No member specialization information?"); 4014 if (MSInfo->getTemplateSpecializationKind() 4015 == TSK_ExplicitSpecialization) 4016 continue; 4017 4018 if (CheckSpecializationInstantiationRedecl(PointOfInstantiation, TSK, 4019 Function, 4020 MSInfo->getTemplateSpecializationKind(), 4021 MSInfo->getPointOfInstantiation(), 4022 SuppressNew) || 4023 SuppressNew) 4024 continue; 4025 4026 // C++11 [temp.explicit]p8: 4027 // An explicit instantiation definition that names a class template 4028 // specialization explicitly instantiates the class template 4029 // specialization and is only an explicit instantiation definition 4030 // of members whose definition is visible at the point of 4031 // instantiation. 4032 if (TSK == TSK_ExplicitInstantiationDefinition && !Pattern->isDefined()) 4033 continue; 4034 4035 Function->setTemplateSpecializationKind(TSK, PointOfInstantiation); 4036 4037 if (Function->isDefined()) { 4038 // Let the ASTConsumer know that this function has been explicitly 4039 // instantiated now, and its linkage might have changed. 4040 Consumer.HandleTopLevelDecl(DeclGroupRef(Function)); 4041 } else if (TSK == TSK_ExplicitInstantiationDefinition) { 4042 InstantiateFunctionDefinition(PointOfInstantiation, Function); 4043 } else if (TSK == TSK_ImplicitInstantiation) { 4044 PendingLocalImplicitInstantiations.push_back( 4045 std::make_pair(Function, PointOfInstantiation)); 4046 } 4047 } 4048 } else if (auto *Var = dyn_cast<VarDecl>(D)) { 4049 if (isa<VarTemplateSpecializationDecl>(Var)) 4050 continue; 4051 4052 if (Var->isStaticDataMember()) { 4053 if (Var->hasAttr<ExcludeFromExplicitInstantiationAttr>()) 4054 continue; 4055 4056 MemberSpecializationInfo *MSInfo = Var->getMemberSpecializationInfo(); 4057 assert(MSInfo && "No member specialization information?"); 4058 if (MSInfo->getTemplateSpecializationKind() 4059 == TSK_ExplicitSpecialization) 4060 continue; 4061 4062 if (CheckSpecializationInstantiationRedecl(PointOfInstantiation, TSK, 4063 Var, 4064 MSInfo->getTemplateSpecializationKind(), 4065 MSInfo->getPointOfInstantiation(), 4066 SuppressNew) || 4067 SuppressNew) 4068 continue; 4069 4070 if (TSK == TSK_ExplicitInstantiationDefinition) { 4071 // C++0x [temp.explicit]p8: 4072 // An explicit instantiation definition that names a class template 4073 // specialization explicitly instantiates the class template 4074 // specialization and is only an explicit instantiation definition 4075 // of members whose definition is visible at the point of 4076 // instantiation. 4077 if (!Var->getInstantiatedFromStaticDataMember()->getDefinition()) 4078 continue; 4079 4080 Var->setTemplateSpecializationKind(TSK, PointOfInstantiation); 4081 InstantiateVariableDefinition(PointOfInstantiation, Var); 4082 } else { 4083 Var->setTemplateSpecializationKind(TSK, PointOfInstantiation); 4084 } 4085 } 4086 } else if (auto *Record = dyn_cast<CXXRecordDecl>(D)) { 4087 if (Record->hasAttr<ExcludeFromExplicitInstantiationAttr>()) 4088 continue; 4089 4090 // Always skip the injected-class-name, along with any 4091 // redeclarations of nested classes, since both would cause us 4092 // to try to instantiate the members of a class twice. 4093 // Skip closure types; they'll get instantiated when we instantiate 4094 // the corresponding lambda-expression. 4095 if (Record->isInjectedClassName() || Record->getPreviousDecl() || 4096 Record->isLambda()) 4097 continue; 4098 4099 MemberSpecializationInfo *MSInfo = Record->getMemberSpecializationInfo(); 4100 assert(MSInfo && "No member specialization information?"); 4101 4102 if (MSInfo->getTemplateSpecializationKind() 4103 == TSK_ExplicitSpecialization) 4104 continue; 4105 4106 if (Context.getTargetInfo().getTriple().isOSWindows() && 4107 TSK == TSK_ExplicitInstantiationDeclaration) { 4108 // On Windows, explicit instantiation decl of the outer class doesn't 4109 // affect the inner class. Typically extern template declarations are 4110 // used in combination with dll import/export annotations, but those 4111 // are not propagated from the outer class templates to inner classes. 4112 // Therefore, do not instantiate inner classes on this platform, so 4113 // that users don't end up with undefined symbols during linking. 4114 continue; 4115 } 4116 4117 if (CheckSpecializationInstantiationRedecl(PointOfInstantiation, TSK, 4118 Record, 4119 MSInfo->getTemplateSpecializationKind(), 4120 MSInfo->getPointOfInstantiation(), 4121 SuppressNew) || 4122 SuppressNew) 4123 continue; 4124 4125 CXXRecordDecl *Pattern = Record->getInstantiatedFromMemberClass(); 4126 assert(Pattern && "Missing instantiated-from-template information"); 4127 4128 if (!Record->getDefinition()) { 4129 if (!Pattern->getDefinition()) { 4130 // C++0x [temp.explicit]p8: 4131 // An explicit instantiation definition that names a class template 4132 // specialization explicitly instantiates the class template 4133 // specialization and is only an explicit instantiation definition 4134 // of members whose definition is visible at the point of 4135 // instantiation. 4136 if (TSK == TSK_ExplicitInstantiationDeclaration) { 4137 MSInfo->setTemplateSpecializationKind(TSK); 4138 MSInfo->setPointOfInstantiation(PointOfInstantiation); 4139 } 4140 4141 continue; 4142 } 4143 4144 InstantiateClass(PointOfInstantiation, Record, Pattern, 4145 TemplateArgs, 4146 TSK); 4147 } else { 4148 if (TSK == TSK_ExplicitInstantiationDefinition && 4149 Record->getTemplateSpecializationKind() == 4150 TSK_ExplicitInstantiationDeclaration) { 4151 Record->setTemplateSpecializationKind(TSK); 4152 MarkVTableUsed(PointOfInstantiation, Record, true); 4153 } 4154 } 4155 4156 Pattern = cast_or_null<CXXRecordDecl>(Record->getDefinition()); 4157 if (Pattern) 4158 InstantiateClassMembers(PointOfInstantiation, Pattern, TemplateArgs, 4159 TSK); 4160 } else if (auto *Enum = dyn_cast<EnumDecl>(D)) { 4161 MemberSpecializationInfo *MSInfo = Enum->getMemberSpecializationInfo(); 4162 assert(MSInfo && "No member specialization information?"); 4163 4164 if (MSInfo->getTemplateSpecializationKind() 4165 == TSK_ExplicitSpecialization) 4166 continue; 4167 4168 if (CheckSpecializationInstantiationRedecl( 4169 PointOfInstantiation, TSK, Enum, 4170 MSInfo->getTemplateSpecializationKind(), 4171 MSInfo->getPointOfInstantiation(), SuppressNew) || 4172 SuppressNew) 4173 continue; 4174 4175 if (Enum->getDefinition()) 4176 continue; 4177 4178 EnumDecl *Pattern = Enum->getTemplateInstantiationPattern(); 4179 assert(Pattern && "Missing instantiated-from-template information"); 4180 4181 if (TSK == TSK_ExplicitInstantiationDefinition) { 4182 if (!Pattern->getDefinition()) 4183 continue; 4184 4185 InstantiateEnum(PointOfInstantiation, Enum, Pattern, TemplateArgs, TSK); 4186 } else { 4187 MSInfo->setTemplateSpecializationKind(TSK); 4188 MSInfo->setPointOfInstantiation(PointOfInstantiation); 4189 } 4190 } else if (auto *Field = dyn_cast<FieldDecl>(D)) { 4191 // No need to instantiate in-class initializers during explicit 4192 // instantiation. 4193 if (Field->hasInClassInitializer() && TSK == TSK_ImplicitInstantiation) { 4194 CXXRecordDecl *ClassPattern = 4195 Instantiation->getTemplateInstantiationPattern(); 4196 DeclContext::lookup_result Lookup = 4197 ClassPattern->lookup(Field->getDeclName()); 4198 FieldDecl *Pattern = Lookup.find_first<FieldDecl>(); 4199 assert(Pattern); 4200 InstantiateInClassInitializer(PointOfInstantiation, Field, Pattern, 4201 TemplateArgs); 4202 } 4203 } 4204 } 4205 } 4206 4207 void 4208 Sema::InstantiateClassTemplateSpecializationMembers( 4209 SourceLocation PointOfInstantiation, 4210 ClassTemplateSpecializationDecl *ClassTemplateSpec, 4211 TemplateSpecializationKind TSK) { 4212 // C++0x [temp.explicit]p7: 4213 // An explicit instantiation that names a class template 4214 // specialization is an explicit instantion of the same kind 4215 // (declaration or definition) of each of its members (not 4216 // including members inherited from base classes) that has not 4217 // been previously explicitly specialized in the translation unit 4218 // containing the explicit instantiation, except as described 4219 // below. 4220 InstantiateClassMembers(PointOfInstantiation, ClassTemplateSpec, 4221 getTemplateInstantiationArgs(ClassTemplateSpec), 4222 TSK); 4223 } 4224 4225 StmtResult 4226 Sema::SubstStmt(Stmt *S, const MultiLevelTemplateArgumentList &TemplateArgs) { 4227 if (!S) 4228 return S; 4229 4230 TemplateInstantiator Instantiator(*this, TemplateArgs, 4231 SourceLocation(), 4232 DeclarationName()); 4233 return Instantiator.TransformStmt(S); 4234 } 4235 4236 bool Sema::SubstTemplateArgument( 4237 const TemplateArgumentLoc &Input, 4238 const MultiLevelTemplateArgumentList &TemplateArgs, 4239 TemplateArgumentLoc &Output, SourceLocation Loc, 4240 const DeclarationName &Entity) { 4241 TemplateInstantiator Instantiator(*this, TemplateArgs, Loc, Entity); 4242 return Instantiator.TransformTemplateArgument(Input, Output); 4243 } 4244 4245 bool Sema::SubstTemplateArguments( 4246 ArrayRef<TemplateArgumentLoc> Args, 4247 const MultiLevelTemplateArgumentList &TemplateArgs, 4248 TemplateArgumentListInfo &Out) { 4249 TemplateInstantiator Instantiator(*this, TemplateArgs, SourceLocation(), 4250 DeclarationName()); 4251 return Instantiator.TransformTemplateArguments(Args.begin(), Args.end(), Out); 4252 } 4253 4254 ExprResult 4255 Sema::SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs) { 4256 if (!E) 4257 return E; 4258 4259 TemplateInstantiator Instantiator(*this, TemplateArgs, 4260 SourceLocation(), 4261 DeclarationName()); 4262 return Instantiator.TransformExpr(E); 4263 } 4264 4265 ExprResult 4266 Sema::SubstConstraintExpr(Expr *E, 4267 const MultiLevelTemplateArgumentList &TemplateArgs) { 4268 // FIXME: should call SubstExpr directly if this function is equivalent or 4269 // should it be different? 4270 return SubstExpr(E, TemplateArgs); 4271 } 4272 4273 ExprResult Sema::SubstConstraintExprWithoutSatisfaction( 4274 Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs) { 4275 if (!E) 4276 return E; 4277 4278 TemplateInstantiator Instantiator(*this, TemplateArgs, SourceLocation(), 4279 DeclarationName()); 4280 Instantiator.setEvaluateConstraints(false); 4281 return Instantiator.TransformExpr(E); 4282 } 4283 4284 ExprResult Sema::SubstInitializer(Expr *Init, 4285 const MultiLevelTemplateArgumentList &TemplateArgs, 4286 bool CXXDirectInit) { 4287 TemplateInstantiator Instantiator(*this, TemplateArgs, SourceLocation(), 4288 DeclarationName()); 4289 return Instantiator.TransformInitializer(Init, CXXDirectInit); 4290 } 4291 4292 bool Sema::SubstExprs(ArrayRef<Expr *> Exprs, bool IsCall, 4293 const MultiLevelTemplateArgumentList &TemplateArgs, 4294 SmallVectorImpl<Expr *> &Outputs) { 4295 if (Exprs.empty()) 4296 return false; 4297 4298 TemplateInstantiator Instantiator(*this, TemplateArgs, 4299 SourceLocation(), 4300 DeclarationName()); 4301 return Instantiator.TransformExprs(Exprs.data(), Exprs.size(), 4302 IsCall, Outputs); 4303 } 4304 4305 NestedNameSpecifierLoc 4306 Sema::SubstNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 4307 const MultiLevelTemplateArgumentList &TemplateArgs) { 4308 if (!NNS) 4309 return NestedNameSpecifierLoc(); 4310 4311 TemplateInstantiator Instantiator(*this, TemplateArgs, NNS.getBeginLoc(), 4312 DeclarationName()); 4313 return Instantiator.TransformNestedNameSpecifierLoc(NNS); 4314 } 4315 4316 DeclarationNameInfo 4317 Sema::SubstDeclarationNameInfo(const DeclarationNameInfo &NameInfo, 4318 const MultiLevelTemplateArgumentList &TemplateArgs) { 4319 TemplateInstantiator Instantiator(*this, TemplateArgs, NameInfo.getLoc(), 4320 NameInfo.getName()); 4321 return Instantiator.TransformDeclarationNameInfo(NameInfo); 4322 } 4323 4324 TemplateName 4325 Sema::SubstTemplateName(NestedNameSpecifierLoc QualifierLoc, 4326 TemplateName Name, SourceLocation Loc, 4327 const MultiLevelTemplateArgumentList &TemplateArgs) { 4328 TemplateInstantiator Instantiator(*this, TemplateArgs, Loc, 4329 DeclarationName()); 4330 CXXScopeSpec SS; 4331 SS.Adopt(QualifierLoc); 4332 return Instantiator.TransformTemplateName(SS, Name, Loc); 4333 } 4334 4335 static const Decl *getCanonicalParmVarDecl(const Decl *D) { 4336 // When storing ParmVarDecls in the local instantiation scope, we always 4337 // want to use the ParmVarDecl from the canonical function declaration, 4338 // since the map is then valid for any redeclaration or definition of that 4339 // function. 4340 if (const ParmVarDecl *PV = dyn_cast<ParmVarDecl>(D)) { 4341 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(PV->getDeclContext())) { 4342 unsigned i = PV->getFunctionScopeIndex(); 4343 // This parameter might be from a freestanding function type within the 4344 // function and isn't necessarily referring to one of FD's parameters. 4345 if (i < FD->getNumParams() && FD->getParamDecl(i) == PV) 4346 return FD->getCanonicalDecl()->getParamDecl(i); 4347 } 4348 } 4349 return D; 4350 } 4351 4352 4353 llvm::PointerUnion<Decl *, LocalInstantiationScope::DeclArgumentPack *> * 4354 LocalInstantiationScope::findInstantiationOf(const Decl *D) { 4355 D = getCanonicalParmVarDecl(D); 4356 for (LocalInstantiationScope *Current = this; Current; 4357 Current = Current->Outer) { 4358 4359 // Check if we found something within this scope. 4360 const Decl *CheckD = D; 4361 do { 4362 LocalDeclsMap::iterator Found = Current->LocalDecls.find(CheckD); 4363 if (Found != Current->LocalDecls.end()) 4364 return &Found->second; 4365 4366 // If this is a tag declaration, it's possible that we need to look for 4367 // a previous declaration. 4368 if (const TagDecl *Tag = dyn_cast<TagDecl>(CheckD)) 4369 CheckD = Tag->getPreviousDecl(); 4370 else 4371 CheckD = nullptr; 4372 } while (CheckD); 4373 4374 // If we aren't combined with our outer scope, we're done. 4375 if (!Current->CombineWithOuterScope) 4376 break; 4377 } 4378 4379 // If we're performing a partial substitution during template argument 4380 // deduction, we may not have values for template parameters yet. 4381 if (isa<NonTypeTemplateParmDecl>(D) || isa<TemplateTypeParmDecl>(D) || 4382 isa<TemplateTemplateParmDecl>(D)) 4383 return nullptr; 4384 4385 // Local types referenced prior to definition may require instantiation. 4386 if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) 4387 if (RD->isLocalClass()) 4388 return nullptr; 4389 4390 // Enumeration types referenced prior to definition may appear as a result of 4391 // error recovery. 4392 if (isa<EnumDecl>(D)) 4393 return nullptr; 4394 4395 // Materialized typedefs/type alias for implicit deduction guides may require 4396 // instantiation. 4397 if (isa<TypedefNameDecl>(D) && 4398 isa<CXXDeductionGuideDecl>(D->getDeclContext())) 4399 return nullptr; 4400 4401 // If we didn't find the decl, then we either have a sema bug, or we have a 4402 // forward reference to a label declaration. Return null to indicate that 4403 // we have an uninstantiated label. 4404 assert(isa<LabelDecl>(D) && "declaration not instantiated in this scope"); 4405 return nullptr; 4406 } 4407 4408 void LocalInstantiationScope::InstantiatedLocal(const Decl *D, Decl *Inst) { 4409 D = getCanonicalParmVarDecl(D); 4410 llvm::PointerUnion<Decl *, DeclArgumentPack *> &Stored = LocalDecls[D]; 4411 if (Stored.isNull()) { 4412 #ifndef NDEBUG 4413 // It should not be present in any surrounding scope either. 4414 LocalInstantiationScope *Current = this; 4415 while (Current->CombineWithOuterScope && Current->Outer) { 4416 Current = Current->Outer; 4417 assert(!Current->LocalDecls.contains(D) && 4418 "Instantiated local in inner and outer scopes"); 4419 } 4420 #endif 4421 Stored = Inst; 4422 } else if (DeclArgumentPack *Pack = Stored.dyn_cast<DeclArgumentPack *>()) { 4423 Pack->push_back(cast<VarDecl>(Inst)); 4424 } else { 4425 assert(Stored.get<Decl *>() == Inst && "Already instantiated this local"); 4426 } 4427 } 4428 4429 void LocalInstantiationScope::InstantiatedLocalPackArg(const Decl *D, 4430 VarDecl *Inst) { 4431 D = getCanonicalParmVarDecl(D); 4432 DeclArgumentPack *Pack = LocalDecls[D].get<DeclArgumentPack *>(); 4433 Pack->push_back(Inst); 4434 } 4435 4436 void LocalInstantiationScope::MakeInstantiatedLocalArgPack(const Decl *D) { 4437 #ifndef NDEBUG 4438 // This should be the first time we've been told about this decl. 4439 for (LocalInstantiationScope *Current = this; 4440 Current && Current->CombineWithOuterScope; Current = Current->Outer) 4441 assert(!Current->LocalDecls.contains(D) && 4442 "Creating local pack after instantiation of local"); 4443 #endif 4444 4445 D = getCanonicalParmVarDecl(D); 4446 llvm::PointerUnion<Decl *, DeclArgumentPack *> &Stored = LocalDecls[D]; 4447 DeclArgumentPack *Pack = new DeclArgumentPack; 4448 Stored = Pack; 4449 ArgumentPacks.push_back(Pack); 4450 } 4451 4452 bool LocalInstantiationScope::isLocalPackExpansion(const Decl *D) { 4453 for (DeclArgumentPack *Pack : ArgumentPacks) 4454 if (llvm::is_contained(*Pack, D)) 4455 return true; 4456 return false; 4457 } 4458 4459 void LocalInstantiationScope::SetPartiallySubstitutedPack(NamedDecl *Pack, 4460 const TemplateArgument *ExplicitArgs, 4461 unsigned NumExplicitArgs) { 4462 assert((!PartiallySubstitutedPack || PartiallySubstitutedPack == Pack) && 4463 "Already have a partially-substituted pack"); 4464 assert((!PartiallySubstitutedPack 4465 || NumArgsInPartiallySubstitutedPack == NumExplicitArgs) && 4466 "Wrong number of arguments in partially-substituted pack"); 4467 PartiallySubstitutedPack = Pack; 4468 ArgsInPartiallySubstitutedPack = ExplicitArgs; 4469 NumArgsInPartiallySubstitutedPack = NumExplicitArgs; 4470 } 4471 4472 NamedDecl *LocalInstantiationScope::getPartiallySubstitutedPack( 4473 const TemplateArgument **ExplicitArgs, 4474 unsigned *NumExplicitArgs) const { 4475 if (ExplicitArgs) 4476 *ExplicitArgs = nullptr; 4477 if (NumExplicitArgs) 4478 *NumExplicitArgs = 0; 4479 4480 for (const LocalInstantiationScope *Current = this; Current; 4481 Current = Current->Outer) { 4482 if (Current->PartiallySubstitutedPack) { 4483 if (ExplicitArgs) 4484 *ExplicitArgs = Current->ArgsInPartiallySubstitutedPack; 4485 if (NumExplicitArgs) 4486 *NumExplicitArgs = Current->NumArgsInPartiallySubstitutedPack; 4487 4488 return Current->PartiallySubstitutedPack; 4489 } 4490 4491 if (!Current->CombineWithOuterScope) 4492 break; 4493 } 4494 4495 return nullptr; 4496 } 4497