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