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