SemaTemplateInstantiateDecl.cpp revision 4e4d08403ca5cfd4d558fa2936215d3a4e5a528d
18dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor//===--- SemaTemplateInstantiateDecl.cpp - C++ Template Decl Instantiation ===/ 28dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor// 38dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor// The LLVM Compiler Infrastructure 48dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor// 58dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor// This file is distributed under the University of Illinois Open Source 68dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor// License. See LICENSE.TXT for details. 78dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor//===----------------------------------------------------------------------===/ 88dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor// 98dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor// This file implements C++ template instantiation for declarations. 108dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor// 118dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor//===----------------------------------------------------------------------===/ 122d88708cbe4e4ec5e04e4acb6bd7f5be68557379John McCall#include "clang/Sema/SemaInternal.h" 13e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/Lookup.h" 14f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall#include "clang/Sema/PrettyDeclStackTrace.h" 157cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/Sema/Template.h" 16aba43bb13b3aa3e81990989375fba3a902bfe1c2Douglas Gregor#include "clang/AST/ASTConsumer.h" 178dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#include "clang/AST/ASTContext.h" 188dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#include "clang/AST/DeclTemplate.h" 198dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#include "clang/AST/DeclVisitor.h" 200c01d18094100db92d38daa923c95661512db203John McCall#include "clang/AST/DependentDiagnostic.h" 218dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#include "clang/AST/Expr.h" 22a88cfbfac9bbcbb9858f048d6d73a48711d8e93dDouglas Gregor#include "clang/AST/ExprCXX.h" 2321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall#include "clang/AST/TypeLoc.h" 2483ddad3ab513f5d73698cf9fbeb4ed3f011bc3b9Douglas Gregor#include "clang/Lex/Preprocessor.h" 258dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 268dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregorusing namespace clang; 278dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 28b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCallbool TemplateDeclInstantiator::SubstQualifier(const DeclaratorDecl *OldDecl, 29b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall DeclaratorDecl *NewDecl) { 30c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (!OldDecl->getQualifierLoc()) 31c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return false; 32a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 33c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc NewQualifierLoc 34a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi = SemaRef.SubstNestedNameSpecifierLoc(OldDecl->getQualifierLoc(), 35c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TemplateArgs); 36a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 37c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (!NewQualifierLoc) 38b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall return true; 39a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 40c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NewDecl->setQualifierInfo(NewQualifierLoc); 41b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall return false; 42b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall} 43b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 44b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCallbool TemplateDeclInstantiator::SubstQualifier(const TagDecl *OldDecl, 45b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall TagDecl *NewDecl) { 46c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (!OldDecl->getQualifierLoc()) 47c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return false; 48a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 49c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc NewQualifierLoc 50a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi = SemaRef.SubstNestedNameSpecifierLoc(OldDecl->getQualifierLoc(), 51c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TemplateArgs); 52a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 53c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (!NewQualifierLoc) 54b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall return true; 55a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 56c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NewDecl->setQualifierInfo(NewQualifierLoc); 57b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall return false; 58b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall} 59b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 607b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins// Include attribute instantiation code. 617b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins#include "clang/Sema/AttrTemplateInstantiate.inc" 627b9ff0c09025dcbe48ec7db71330e2066d1e1863DeLesley Hutchins 631d8d1ccd36888f1120b3a1df9e76f35dc2edb81dJohn McCallvoid Sema::InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs, 6423323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins const Decl *Tmpl, Decl *New, 6523323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins LateInstantiatedAttrVec *LateAttrs, 6623323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins LocalInstantiationScope *OuterMostScope) { 67cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt for (AttrVec::const_iterator i = Tmpl->attr_begin(), e = Tmpl->attr_end(); 68cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt i != e; ++i) { 69cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt const Attr *TmplAttr = *i; 7023323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins 714ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth // FIXME: This should be generalized to more than just the AlignedAttr. 724ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth if (const AlignedAttr *Aligned = dyn_cast<AlignedAttr>(TmplAttr)) { 73cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt if (Aligned->isAlignmentDependent()) { 74cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt if (Aligned->isAlignmentExpr()) { 75f6702a3927147655206ae729a84339c4fda4c651Richard Smith // The alignment expression is a constant expression. 76f6702a3927147655206ae729a84339c4fda4c651Richard Smith EnterExpressionEvaluationContext Unevaluated(*this, 77f6702a3927147655206ae729a84339c4fda4c651Richard Smith Sema::ConstantEvaluated); 78f6702a3927147655206ae729a84339c4fda4c651Richard Smith 7960d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = SubstExpr(Aligned->getAlignmentExpr(), 807663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky TemplateArgs); 81cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt if (!Result.isInvalid()) 82cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt AddAlignedAttr(Aligned->getLocation(), New, Result.takeAs<Expr>()); 83f6702a3927147655206ae729a84339c4fda4c651Richard Smith } else { 84cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt TypeSourceInfo *Result = SubstType(Aligned->getAlignmentType(), 857663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky TemplateArgs, 86a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Aligned->getLocation(), 877663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky DeclarationName()); 88cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt if (Result) 89cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt AddAlignedAttr(Aligned->getLocation(), New, Result); 90cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt } 914ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth continue; 924ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth } 934ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth } 944ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth 9523323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins if (TmplAttr->isLateParsed() && LateAttrs) { 9623323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins // Late parsed attributes must be instantiated and attached after the 9723323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins // enclosing class has been instantiated. See Sema::InstantiateClass. 9823323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins LocalInstantiationScope *Saved = 0; 9923323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins if (CurrentInstantiationScope) 10023323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins Saved = CurrentInstantiationScope->cloneScopes(OuterMostScope); 10123323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins LateAttrs->push_back(LateInstantiatedAttribute(TmplAttr, Saved, New)); 10223323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins } else { 1035bbc385ad2d8e487edfbc2756eaf4fb0b920cfe4Benjamin Kramer Attr *NewAttr = sema::instantiateTemplateAttribute(TmplAttr, Context, 1045bbc385ad2d8e487edfbc2756eaf4fb0b920cfe4Benjamin Kramer *this, TemplateArgs); 10523323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins New->addAttr(NewAttr); 10623323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins } 107d8fe2d56fb5463c9d109e8c6dab2e98b06bee186Anders Carlsson } 108d8fe2d56fb5463c9d109e8c6dab2e98b06bee186Anders Carlsson} 109d8fe2d56fb5463c9d109e8c6dab2e98b06bee186Anders Carlsson 1104f722be4587a7a0dece399fb5405dda158971ae1Douglas GregorDecl * 1114f722be4587a7a0dece399fb5405dda158971ae1Douglas GregorTemplateDeclInstantiator::VisitTranslationUnitDecl(TranslationUnitDecl *D) { 112b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Translation units cannot be instantiated"); 1134f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor} 1144f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor 1154f722be4587a7a0dece399fb5405dda158971ae1Douglas GregorDecl * 11657ad37823e198f977cac605dbfbaefb4daf325e9Chris LattnerTemplateDeclInstantiator::VisitLabelDecl(LabelDecl *D) { 11757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner LabelDecl *Inst = LabelDecl::Create(SemaRef.Context, Owner, D->getLocation(), 11857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner D->getIdentifier()); 11957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Owner->addDecl(Inst); 12057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return Inst; 12157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner} 12257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 12357ad37823e198f977cac605dbfbaefb4daf325e9Chris LattnerDecl * 1244f722be4587a7a0dece399fb5405dda158971ae1Douglas GregorTemplateDeclInstantiator::VisitNamespaceDecl(NamespaceDecl *D) { 125b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Namespaces cannot be instantiated"); 1264f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor} 1274f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor 1283dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCallDecl * 1293dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCallTemplateDeclInstantiator::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { 1303dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall NamespaceAliasDecl *Inst 1313dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall = NamespaceAliasDecl::Create(SemaRef.Context, Owner, 1323dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall D->getNamespaceLoc(), 1333dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall D->getAliasLoc(), 1340cfaf6a270ecd0f5c7e541a8047c87948317548bDouglas Gregor D->getIdentifier(), 1350cfaf6a270ecd0f5c7e541a8047c87948317548bDouglas Gregor D->getQualifierLoc(), 1363dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall D->getTargetNameLoc(), 1373dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall D->getNamespace()); 1383dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall Owner->addDecl(Inst); 1393dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall return Inst; 1403dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall} 1413dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall 1423e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithDecl *TemplateDeclInstantiator::InstantiateTypedefNameDecl(TypedefNameDecl *D, 1433e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith bool IsTypeAlias) { 1448dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor bool Invalid = false; 145a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = D->getTypeSourceInfo(); 146561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor if (DI->getType()->isInstantiationDependentType() || 147836adf6771d5170d936599dfcce21687e37e9bbfDouglas Gregor DI->getType()->isVariablyModifiedType()) { 148ba6a9bd384df475780be636ca45bcef5c5bbd19fJohn McCall DI = SemaRef.SubstType(DI, TemplateArgs, 149ba6a9bd384df475780be636ca45bcef5c5bbd19fJohn McCall D->getLocation(), D->getDeclName()); 150ba6a9bd384df475780be636ca45bcef5c5bbd19fJohn McCall if (!DI) { 1518dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Invalid = true; 152a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall DI = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.Context.IntTy); 1538dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 154b4eeaff1595b7d0a8fbc2b3c8bec7dc63f48b7fdDouglas Gregor } else { 155b4eeaff1595b7d0a8fbc2b3c8bec7dc63f48b7fdDouglas Gregor SemaRef.MarkDeclarationsReferencedInType(D->getLocation(), DI->getType()); 1568dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 1571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1588dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // Create the new typedef 159162e1c1b487352434552147967c3dd296ebee2f7Richard Smith TypedefNameDecl *Typedef; 160162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (IsTypeAlias) 161162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Typedef = TypeAliasDecl::Create(SemaRef.Context, Owner, D->getLocStart(), 162162e1c1b487352434552147967c3dd296ebee2f7Richard Smith D->getLocation(), D->getIdentifier(), DI); 163162e1c1b487352434552147967c3dd296ebee2f7Richard Smith else 164162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Typedef = TypedefDecl::Create(SemaRef.Context, Owner, D->getLocStart(), 165162e1c1b487352434552147967c3dd296ebee2f7Richard Smith D->getLocation(), D->getIdentifier(), DI); 1668dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Invalid) 1678dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Typedef->setInvalidDecl(); 1688dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 169cde5a400dbc9655eddf0f383585d3cf67c11c539John McCall // If the old typedef was the name for linkage purposes of an anonymous 170cde5a400dbc9655eddf0f383585d3cf67c11c539John McCall // tag decl, re-establish that relationship for the new typedef. 171cde5a400dbc9655eddf0f383585d3cf67c11c539John McCall if (const TagType *oldTagType = D->getUnderlyingType()->getAs<TagType>()) { 172cde5a400dbc9655eddf0f383585d3cf67c11c539John McCall TagDecl *oldTag = oldTagType->getDecl(); 173162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (oldTag->getTypedefNameForAnonDecl() == D) { 174cde5a400dbc9655eddf0f383585d3cf67c11c539John McCall TagDecl *newTag = DI->getType()->castAs<TagType>()->getDecl(); 175162e1c1b487352434552147967c3dd296ebee2f7Richard Smith assert(!newTag->getIdentifier() && !newTag->getTypedefNameForAnonDecl()); 176162e1c1b487352434552147967c3dd296ebee2f7Richard Smith newTag->setTypedefNameForAnonDecl(Typedef); 177cde5a400dbc9655eddf0f383585d3cf67c11c539John McCall } 178d57a38ee02c285d69d05fed6df0d7406b2517888Douglas Gregor } 179a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 180ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor if (TypedefNameDecl *Prev = D->getPreviousDecl()) { 1817c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NamedDecl *InstPrev = SemaRef.FindInstantiatedDecl(D->getLocation(), Prev, 1827c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor TemplateArgs); 183b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor if (!InstPrev) 184b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor return 0; 185a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 1865df37bd0242e838e465f0bd51a70af424d152053Rafael Espindola TypedefNameDecl *InstPrevTypedef = cast<TypedefNameDecl>(InstPrev); 1875df37bd0242e838e465f0bd51a70af424d152053Rafael Espindola 1885df37bd0242e838e465f0bd51a70af424d152053Rafael Espindola // If the typedef types are not identical, reject them. 1895df37bd0242e838e465f0bd51a70af424d152053Rafael Espindola SemaRef.isIncompatibleTypedef(InstPrevTypedef, Typedef); 1905df37bd0242e838e465f0bd51a70af424d152053Rafael Espindola 1915df37bd0242e838e465f0bd51a70af424d152053Rafael Espindola Typedef->setPreviousDeclaration(InstPrevTypedef); 1925126fd0dd92c4ec211c837ee78d5ce59c68dcbd5John McCall } 1935126fd0dd92c4ec211c837ee78d5ce59c68dcbd5John McCall 1941d8d1ccd36888f1120b3a1df9e76f35dc2edb81dJohn McCall SemaRef.InstantiateAttrs(TemplateArgs, D, Typedef); 195d57a38ee02c285d69d05fed6df0d7406b2517888Douglas Gregor 19646460a68f6508775e98c19b4bb8454bb471aac24John McCall Typedef->setAccess(D->getAccess()); 1971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1988dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Typedef; 1998dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 2008dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 201162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *TemplateDeclInstantiator::VisitTypedefDecl(TypedefDecl *D) { 2023e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Decl *Typedef = InstantiateTypedefNameDecl(D, /*IsTypeAlias=*/false); 2033e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Owner->addDecl(Typedef); 2043e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return Typedef; 205162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 206162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 207162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *TemplateDeclInstantiator::VisitTypeAliasDecl(TypeAliasDecl *D) { 2083e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Decl *Typedef = InstantiateTypedefNameDecl(D, /*IsTypeAlias=*/true); 2093e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Owner->addDecl(Typedef); 2103e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return Typedef; 2113e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 2123e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2133e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithDecl * 2143e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTemplateDeclInstantiator::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { 2153e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith // Create a local instantiation scope for this type alias template, which 2163e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith // will contain the instantiations of the template parameters. 2173e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith LocalInstantiationScope Scope(SemaRef); 2183e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2193e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TemplateParameterList *TempParams = D->getTemplateParameters(); 2203e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TemplateParameterList *InstParams = SubstTemplateParams(TempParams); 2213e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (!InstParams) 2223e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return 0; 2233e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2243e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TypeAliasDecl *Pattern = D->getTemplatedDecl(); 2253e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2263e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TypeAliasTemplateDecl *PrevAliasTemplate = 0; 227ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor if (Pattern->getPreviousDecl()) { 2283e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith DeclContext::lookup_result Found = Owner->lookup(Pattern->getDeclName()); 2293e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (Found.first != Found.second) { 2303e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith PrevAliasTemplate = dyn_cast<TypeAliasTemplateDecl>(*Found.first); 2313e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith } 2323e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith } 2333e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2343e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TypeAliasDecl *AliasInst = cast_or_null<TypeAliasDecl>( 2353e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith InstantiateTypedefNameDecl(Pattern, /*IsTypeAlias=*/true)); 2363e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (!AliasInst) 2373e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return 0; 2383e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2393e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TypeAliasTemplateDecl *Inst 2403e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith = TypeAliasTemplateDecl::Create(SemaRef.Context, Owner, D->getLocation(), 2413e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith D->getDeclName(), InstParams, AliasInst); 2423e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (PrevAliasTemplate) 2433e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Inst->setPreviousDeclaration(PrevAliasTemplate); 2443e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2453e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Inst->setAccess(D->getAccess()); 2463e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2473e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (!PrevAliasTemplate) 2483e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Inst->setInstantiatedFromMemberTemplate(D); 249a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2503e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Owner->addDecl(Inst); 2513e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2523e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return Inst; 253162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 254162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 2553d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas GregorDecl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D) { 2569901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor // If this is the variable for an anonymous struct or union, 2579901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor // instantiate the anonymous struct/union type first. 2589901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor if (const RecordType *RecordTy = D->getType()->getAs<RecordType>()) 2599901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor if (RecordTy->getDecl()->isAnonymousStructOrUnion()) 2609901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor if (!VisitCXXRecordDecl(cast<CXXRecordDecl>(RecordTy->getDecl()))) 2619901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor return 0; 2629901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor 263ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCall // Do substitution on the type of the declaration 264a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = SemaRef.SubstType(D->getTypeSourceInfo(), 2650a5fa06a688e1086ea553a24b42b9915996ed1f7John McCall TemplateArgs, 2660a5fa06a688e1086ea553a24b42b9915996ed1f7John McCall D->getTypeSpecStartLoc(), 2670a5fa06a688e1086ea553a24b42b9915996ed1f7John McCall D->getDeclName()); 2680a5fa06a688e1086ea553a24b42b9915996ed1f7John McCall if (!DI) 2693d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor return 0; 2703d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 271c6dbc3fa467e2355b678a6b717534928048efcb2Douglas Gregor if (DI->getType()->isFunctionType()) { 272c6dbc3fa467e2355b678a6b717534928048efcb2Douglas Gregor SemaRef.Diag(D->getLocation(), diag::err_variable_instantiates_to_function) 273c6dbc3fa467e2355b678a6b717534928048efcb2Douglas Gregor << D->isStaticDataMember() << DI->getType(); 274c6dbc3fa467e2355b678a6b717534928048efcb2Douglas Gregor return 0; 275c6dbc3fa467e2355b678a6b717534928048efcb2Douglas Gregor } 276a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 277b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor // Build the instantiated declaration 2783d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor VarDecl *Var = VarDecl::Create(SemaRef.Context, Owner, 279ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 2803d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor D->getLocation(), D->getIdentifier(), 2810a5fa06a688e1086ea553a24b42b9915996ed1f7John McCall DI->getType(), DI, 28216573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor D->getStorageClass(), 28316573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor D->getStorageClassAsWritten()); 2843d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor Var->setThreadSpecified(D->isThreadSpecified()); 2855b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl Var->setInitStyle(D->getInitStyle()); 286ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith Var->setCXXForRangeDecl(D->isCXXForRangeDecl()); 287796c1a1e3e63e459e371383ac878aa5f40b02a8cRichard Smith Var->setConstexpr(D->isConstexpr()); 2881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 289b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall // Substitute the nested name specifier, if any. 290b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall if (SubstQualifier(D, Var)) 291b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall return 0; 292b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 2931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If we are instantiating a static data member defined 2947caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // out-of-line, the instantiation will have the same lexical 2957caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // context (which will be a namespace scope) as the template. 2967caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (D->isOutOfLine()) 2977caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor Var->setLexicalDeclContext(D->getLexicalDeclContext()); 2981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29946460a68f6508775e98c19b4bb8454bb471aac24John McCall Var->setAccess(D->getAccess()); 300a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 3016b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis if (!D->isStaticDataMember()) { 302c070cc602d6eefea881f71a60de09e05b54c3fddDouglas Gregor Var->setUsed(D->isUsed(false)); 3036b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis Var->setReferenced(D->isReferenced()); 3046b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis } 305a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 306390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // FIXME: In theory, we could have a previous declaration for variables that 307390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // are not static data members. 3086826314938f8510cd1a6b03b5d032592456ae27bJohn McCall // FIXME: having to fake up a LookupResult is dumb. 3096826314938f8510cd1a6b03b5d032592456ae27bJohn McCall LookupResult Previous(SemaRef, Var->getDeclName(), Var->getLocation(), 310449d0a829007ea654912098e6a73134a2c529d61Douglas Gregor Sema::LookupOrdinaryName, Sema::ForRedeclaration); 31160c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor if (D->isStaticDataMember()) 31260c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor SemaRef.LookupQualifiedName(Previous, Owner, false); 3139aab9c4116bb3ea876d92d4af10bff7f4c451f24Douglas Gregor 3149aab9c4116bb3ea876d92d4af10bff7f4c451f24Douglas Gregor // In ARC, infer 'retaining' for variables of retainable type. 3154e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (SemaRef.getLangOpts().ObjCAutoRefCount && 3169aab9c4116bb3ea876d92d4af10bff7f4c451f24Douglas Gregor SemaRef.inferObjCARCLifetime(Var)) 3179aab9c4116bb3ea876d92d4af10bff7f4c451f24Douglas Gregor Var->setInvalidDecl(); 3189aab9c4116bb3ea876d92d4af10bff7f4c451f24Douglas Gregor 3192c712f50cd56eaf3662989b556e9c6b1e8fcd11aKaelyn Uhrain SemaRef.CheckVariableDeclaration(Var, Previous); 3201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3217caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (D->isOutOfLine()) { 3223e9ea0b8cd7c4691d62e385245556be5fded58a7Richard Smith D->getLexicalDeclContext()->addDecl(Var); 3237caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor Owner->makeDeclVisibleInContext(Var); 3247caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor } else { 3257caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor Owner->addDecl(Var); 326f7d72f5a4a3f0e610d77c6779ca3c21920a14bc7Douglas Gregor if (Owner->isFunctionOrMethod()) 327f7d72f5a4a3f0e610d77c6779ca3c21920a14bc7Douglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Var); 3287caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor } 329dd5756c04c98e354b85c4f7eb660ae60c6d341ecDeLesley Hutchins SemaRef.InstantiateAttrs(TemplateArgs, D, Var, LateAttrs, StartingScope); 330a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 331251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor // Link instantiations of static data members back to the template from 332251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor // which they were instantiated. 333251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor if (Var->isStaticDataMember()) 334a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi SemaRef.Context.setInstantiatedFromStaticDataMember(Var, D, 335cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor TSK_ImplicitInstantiation); 336a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 33760c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor if (Var->getAnyInitializer()) { 33860c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor // We already have an initializer in the class. 33960c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor } else if (D->getInit()) { 3401f5f3a4d58a1c7c50c331b33329fc14563533c04Douglas Gregor if (Var->isStaticDataMember() && !D->isOutOfLine()) 341f6702a3927147655206ae729a84339c4fda4c651Richard Smith SemaRef.PushExpressionEvaluationContext(Sema::ConstantEvaluated); 3421f5f3a4d58a1c7c50c331b33329fc14563533c04Douglas Gregor else 3431f5f3a4d58a1c7c50c331b33329fc14563533c04Douglas Gregor SemaRef.PushExpressionEvaluationContext(Sema::PotentiallyEvaluated); 3441f5f3a4d58a1c7c50c331b33329fc14563533c04Douglas Gregor 3456b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor // Instantiate the initializer. 3465b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl ExprResult Init = SemaRef.SubstInitializer(D->getInit(), TemplateArgs, 3475b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl D->getInitStyle() == VarDecl::CallInit); 3485b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl if (!Init.isInvalid()) { 34934b41d939a1328f484511c6002ba2456db879a29Richard Smith bool TypeMayContainAuto = true; 3505b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl if (Init.get()) { 3515b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl bool DirectInit = D->isDirectInit(); 3525b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl SemaRef.AddInitializerToDecl(Var, Init.take(), DirectInit, 3535b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl TypeMayContainAuto); 3545b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl } else 3556aeaa60217e1ed11a621409acf1b53df0d14b591Eli Friedman SemaRef.ActOnUninitializedDecl(Var, TypeMayContainAuto); 3566eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor } else { 3576b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor // FIXME: Not too happy about invalidating the declaration 3586b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor // because of a bogus initializer. 3596b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor Var->setInvalidDecl(); 3606eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor } 361a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 3621f5f3a4d58a1c7c50c331b33329fc14563533c04Douglas Gregor SemaRef.PopExpressionEvaluationContext(); 363ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith } else if ((!Var->isStaticDataMember() || Var->isOutOfLine()) && 364ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith !Var->isCXXForRangeDecl()) 365d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall SemaRef.ActOnUninitializedDecl(Var, false); 3663d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 367e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith // Diagnose unused local variables with dependent types, where the diagnostic 368e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith // will have been deferred. 369e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith if (!Var->isInvalidDecl() && Owner->isFunctionOrMethod() && !Var->isUsed() && 370e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith D->getType()->isDependentType()) 3715764f613e61cb3183f3d7ceeafd23396de96ed16Douglas Gregor SemaRef.DiagnoseUnusedDecl(Var); 372bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 3733d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor return Var; 3743d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor} 3753d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 3766206d53f67613958ae1b023aba337ebb46f11a8bAbramo BagnaraDecl *TemplateDeclInstantiator::VisitAccessSpecDecl(AccessSpecDecl *D) { 3776206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara AccessSpecDecl* AD 3786206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara = AccessSpecDecl::Create(SemaRef.Context, D->getAccess(), Owner, 3796206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara D->getAccessSpecifierLoc(), D->getColonLoc()); 3806206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara Owner->addHiddenDecl(AD); 3816206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara return AD; 3826206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara} 3836206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara 3848dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *TemplateDeclInstantiator::VisitFieldDecl(FieldDecl *D) { 3858dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor bool Invalid = false; 386a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = D->getTypeSourceInfo(); 387561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor if (DI->getType()->isInstantiationDependentType() || 388836adf6771d5170d936599dfcce21687e37e9bbfDouglas Gregor DI->getType()->isVariablyModifiedType()) { 38907fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall DI = SemaRef.SubstType(DI, TemplateArgs, 39007fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall D->getLocation(), D->getDeclName()); 39107fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall if (!DI) { 392a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall DI = D->getTypeSourceInfo(); 39307fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall Invalid = true; 39407fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall } else if (DI->getType()->isFunctionType()) { 3958dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // C++ [temp.arg.type]p3: 3968dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // If a declaration acquires a function type through a type 3978dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // dependent on a template-parameter and this causes a 3988dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // declaration that does not use the syntactic form of a 3998dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // function declarator to have function type, the program is 4008dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // ill-formed. 4018dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor SemaRef.Diag(D->getLocation(), diag::err_field_instantiates_to_function) 40207fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall << DI->getType(); 4038dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Invalid = true; 4048dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 405b4eeaff1595b7d0a8fbc2b3c8bec7dc63f48b7fdDouglas Gregor } else { 406b4eeaff1595b7d0a8fbc2b3c8bec7dc63f48b7fdDouglas Gregor SemaRef.MarkDeclarationsReferencedInType(D->getLocation(), DI->getType()); 4078dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 4088dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 4098dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Expr *BitWidth = D->getBitWidth(); 4108dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Invalid) 4118dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor BitWidth = 0; 4128dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor else if (BitWidth) { 413f6702a3927147655206ae729a84339c4fda4c651Richard Smith // The bit-width expression is a constant expression. 414f6702a3927147655206ae729a84339c4fda4c651Richard Smith EnterExpressionEvaluationContext Unevaluated(SemaRef, 415f6702a3927147655206ae729a84339c4fda4c651Richard Smith Sema::ConstantEvaluated); 4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult InstantiatedBitWidth 418ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCall = SemaRef.SubstExpr(BitWidth, TemplateArgs); 4198dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (InstantiatedBitWidth.isInvalid()) { 4208dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Invalid = true; 4218dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor BitWidth = 0; 4228dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } else 423e9146f2e9f1c4e281544e8c080934c72d41012caAnders Carlsson BitWidth = InstantiatedBitWidth.takeAs<Expr>(); 4248dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 4258dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 42607fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall FieldDecl *Field = SemaRef.CheckFieldDecl(D->getDeclName(), 42707fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall DI->getType(), DI, 4281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump cast<RecordDecl>(Owner), 4298dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getLocation(), 4308dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->isMutable(), 4318dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor BitWidth, 4327a614d8380297fcd2bc23986241905d97222948cRichard Smith D->hasInClassInitializer(), 433ea218b8e8f9ba82d1c76bcb7e86d121a5f65ebedSteve Naroff D->getTypeSpecStartLoc(), 4348dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getAccess(), 4358dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 0); 436663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas Gregor if (!Field) { 437663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas Gregor cast<Decl>(Owner)->setInvalidDecl(); 438f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson return 0; 439663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas Gregor } 4401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44123323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins SemaRef.InstantiateAttrs(TemplateArgs, D, Field, LateAttrs, StartingScope); 442a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 443f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson if (Invalid) 444f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson Field->setInvalidDecl(); 4451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 446f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson if (!Field->getDeclName()) { 447f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson // Keep track of where this decl came from. 448f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson SemaRef.Context.setInstantiatedFromUnnamedFieldDecl(Field, D); 449a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi } 4509901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor if (CXXRecordDecl *Parent= dyn_cast<CXXRecordDecl>(Field->getDeclContext())) { 4519901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor if (Parent->isAnonymousStructOrUnion() && 4527a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl Parent->getRedeclContext()->isFunctionOrMethod()) 4539901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Field); 4548dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 4551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 456f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson Field->setImplicit(D->isImplicit()); 45746460a68f6508775e98c19b4bb8454bb471aac24John McCall Field->setAccess(D->getAccess()); 458f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson Owner->addDecl(Field); 4598dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 4608dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Field; 4618dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 4628dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 46387c2e121cf0522fc266efe2922b58091cd2e0182Francois PichetDecl *TemplateDeclInstantiator::VisitIndirectFieldDecl(IndirectFieldDecl *D) { 46487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet NamedDecl **NamedChain = 46587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet new (SemaRef.Context)NamedDecl*[D->getChainingSize()]; 46687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 46787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet int i = 0; 46887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet for (IndirectFieldDecl::chain_iterator PI = 46987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet D->chain_begin(), PE = D->chain_end(); 470b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor PI != PE; ++PI) { 471a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi NamedDecl *Next = SemaRef.FindInstantiatedDecl(D->getLocation(), *PI, 472b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor TemplateArgs); 473b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor if (!Next) 474b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor return 0; 475a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 476b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor NamedChain[i++] = Next; 477b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor } 47887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 47940e17752086c2c497951d64f5ac6ab5039466113Francois Pichet QualType T = cast<FieldDecl>(NamedChain[i-1])->getType(); 48087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet IndirectFieldDecl* IndirectField 48187c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet = IndirectFieldDecl::Create(SemaRef.Context, Owner, D->getLocation(), 48240e17752086c2c497951d64f5ac6ab5039466113Francois Pichet D->getIdentifier(), T, 48387c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet NamedChain, D->getChainingSize()); 48487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 48587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 48687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet IndirectField->setImplicit(D->isImplicit()); 48787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet IndirectField->setAccess(D->getAccess()); 48887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet Owner->addDecl(IndirectField); 48987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet return IndirectField; 49087c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet} 49187c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 49202cace78cf48cc26686bd5b07c78606abca13bcdJohn McCallDecl *TemplateDeclInstantiator::VisitFriendDecl(FriendDecl *D) { 49302cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall // Handle friend type expressions by simply substituting template 49406245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor // parameters into the pattern type and checking the result. 49532f2fb53d9d7c28c94d8569fd0fcf06cccee0c3dJohn McCall if (TypeSourceInfo *Ty = D->getFriendType()) { 4964fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TypeSourceInfo *InstTy; 4974fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth // If this is an unsupported friend, don't bother substituting template 4984fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth // arguments into it. The actual type referred to won't be used by any 4994fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth // parts of Clang, and may not be valid for instantiating. Just use the 5004fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth // same info for the instantiated friend. 5014fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth if (D->isUnsupportedFriend()) { 5024fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth InstTy = Ty; 5034fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth } else { 5044fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth InstTy = SemaRef.SubstType(Ty, TemplateArgs, 5054fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth D->getLocation(), DeclarationName()); 5064fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth } 5074fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth if (!InstTy) 50806245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor return 0; 509fd810b1386ed29b250e7d522ea826a65c815e49dJohn McCall 5100216df8fd3ce58f5a68ef2ab141ea34c96c11164Abramo Bagnara FriendDecl *FD = SemaRef.CheckFriendTypeDecl(D->getLocation(), 5110216df8fd3ce58f5a68ef2ab141ea34c96c11164Abramo Bagnara D->getFriendLoc(), InstTy); 51206245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor if (!FD) 51306245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor return 0; 514a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 51506245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor FD->setAccess(AS_public); 5169a34edb710917798aa30263374f624f13b594605John McCall FD->setUnsupportedFriend(D->isUnsupportedFriend()); 51706245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor Owner->addDecl(FD); 51806245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor return FD; 519a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi } 520a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 52106245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor NamedDecl *ND = D->getFriendDecl(); 52206245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor assert(ND && "friend decl must be a decl or a type!"); 52332f2fb53d9d7c28c94d8569fd0fcf06cccee0c3dJohn McCall 524af2094e7cecadf36667deb61a83587ffdd979bd3John McCall // All of the Visit implementations for the various potential friend 525af2094e7cecadf36667deb61a83587ffdd979bd3John McCall // declarations have to be carefully written to work for friend 526af2094e7cecadf36667deb61a83587ffdd979bd3John McCall // objects, with the most important detail being that the target 527af2094e7cecadf36667deb61a83587ffdd979bd3John McCall // decl should almost certainly not be placed in Owner. 528af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Decl *NewND = Visit(ND); 52906245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor if (!NewND) return 0; 5301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 53102cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall FriendDecl *FD = 532a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi FriendDecl::Create(SemaRef.Context, Owner, D->getLocation(), 53306245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor cast<NamedDecl>(NewND), D->getFriendLoc()); 5345fee110ac106370f75592df024001de73edced2aJohn McCall FD->setAccess(AS_public); 5359a34edb710917798aa30263374f624f13b594605John McCall FD->setUnsupportedFriend(D->isUnsupportedFriend()); 53602cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall Owner->addDecl(FD); 53702cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall return FD; 538fd810b1386ed29b250e7d522ea826a65c815e49dJohn McCall} 539fd810b1386ed29b250e7d522ea826a65c815e49dJohn McCall 5408dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *TemplateDeclInstantiator::VisitStaticAssertDecl(StaticAssertDecl *D) { 5418dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Expr *AssertExpr = D->getAssertExpr(); 5421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 543f6702a3927147655206ae729a84339c4fda4c651Richard Smith // The expression in a static assertion is a constant expression. 544f6702a3927147655206ae729a84339c4fda4c651Richard Smith EnterExpressionEvaluationContext Unevaluated(SemaRef, 545f6702a3927147655206ae729a84339c4fda4c651Richard Smith Sema::ConstantEvaluated); 5461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54760d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult InstantiatedAssertExpr 548ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCall = SemaRef.SubstExpr(AssertExpr, TemplateArgs); 5498dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (InstantiatedAssertExpr.isInvalid()) 5508dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return 0; 5518dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 55260d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Message(D->getMessage()); 5533fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall D->getMessage(); 554d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall return SemaRef.ActOnStaticAssertDeclaration(D->getLocation(), 5559ae2f076ca5ab1feb3ba95629099ec2319833701John McCall InstantiatedAssertExpr.get(), 556a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara Message.get(), 557a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara D->getRParenLoc()); 5588dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 5598dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 5608dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *TemplateDeclInstantiator::VisitEnumDecl(EnumDecl *D) { 561ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara EnumDecl *Enum = EnumDecl::Create(SemaRef.Context, Owner, D->getLocStart(), 5628dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getLocation(), D->getIdentifier(), 563a88cefd266c428be33cc06f7e8b00ff8fc97c1ffAbramo Bagnara /*PrevDecl=*/0, D->isScoped(), 564a88cefd266c428be33cc06f7e8b00ff8fc97c1ffAbramo Bagnara D->isScopedUsingClassTag(), D->isFixed()); 5651274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor if (D->isFixed()) { 5661274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor if (TypeSourceInfo* TI = D->getIntegerTypeSourceInfo()) { 5671274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor // If we have type source information for the underlying type, it means it 5681274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor // has been explicitly set by the user. Perform substitution on it before 5691274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor // moving on. 5701274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc(); 5711274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor Enum->setIntegerTypeSourceInfo(SemaRef.SubstType(TI, 5721274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor TemplateArgs, 5731274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor UnderlyingLoc, 5741274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor DeclarationName())); 575a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 5761274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor if (!Enum->getIntegerTypeSourceInfo()) 5771274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor Enum->setIntegerType(SemaRef.Context.IntTy); 5781274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor } 5791274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor else { 5801274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor assert(!D->getIntegerType()->isDependentType() 5811274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor && "Dependent type without type source info"); 5821274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor Enum->setIntegerType(D->getIntegerType()); 5831274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor } 5841274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor } 5851274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor 5865b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall SemaRef.InstantiateAttrs(TemplateArgs, D, Enum); 5875b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall 5888dbc3c64965f99e48830885835b7d2fc26ec3cf5Douglas Gregor Enum->setInstantiationOfMemberEnum(D); 58906c0fecd197fef21e265a41bca8dc5022de1f864Douglas Gregor Enum->setAccess(D->getAccess()); 590b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall if (SubstQualifier(D, Enum)) return 0; 59117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Owner->addDecl(Enum); 5928dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Enum->startDefinition(); 5938dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 59496084f171f4824397dc48453146f0a9719cb9247Douglas Gregor if (D->getDeclContext()->isFunctionOrMethod()) 59596084f171f4824397dc48453146f0a9719cb9247Douglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Enum); 596a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 5975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Decl*, 4> Enumerators; 5988dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 5998dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EnumConstantDecl *LastEnumConst = 0; 60017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (EnumDecl::enumerator_iterator EC = D->enumerator_begin(), 60117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis ECEnd = D->enumerator_end(); 6028dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EC != ECEnd; ++EC) { 6038dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // The specified value for the enumerator. 60460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Value = SemaRef.Owned((Expr *)0); 605ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor if (Expr *UninstValue = EC->getInitExpr()) { 606f6702a3927147655206ae729a84339c4fda4c651Richard Smith // The enumerator's value expression is a constant expression. 6071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(SemaRef, 608f6702a3927147655206ae729a84339c4fda4c651Richard Smith Sema::ConstantEvaluated); 6091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 610ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCall Value = SemaRef.SubstExpr(UninstValue, TemplateArgs); 611ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor } 6128dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 6138dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // Drop the initial value and continue. 6148dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor bool isInvalid = false; 6158dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Value.isInvalid()) { 6168dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Value = SemaRef.Owned((Expr *)0); 6178dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor isInvalid = true; 6188dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 6198dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 6201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnumConstantDecl *EnumConst 6218dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor = SemaRef.CheckEnumConstant(Enum, LastEnumConst, 6228dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EC->getLocation(), EC->getIdentifier(), 6239ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Value.get()); 6248dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 6258dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (isInvalid) { 6268dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (EnumConst) 6278dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EnumConst->setInvalidDecl(); 6288dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Enum->setInvalidDecl(); 6298dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 6308dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 6318dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (EnumConst) { 6325b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall SemaRef.InstantiateAttrs(TemplateArgs, *EC, EnumConst); 6335b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall 6343b85ecf2049c8670eba30d0c06f28f64168af9b8John McCall EnumConst->setAccess(Enum->getAccess()); 63517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Enum->addDecl(EnumConst); 636d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall Enumerators.push_back(EnumConst); 6378dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor LastEnumConst = EnumConst; 638a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 63996084f171f4824397dc48453146f0a9719cb9247Douglas Gregor if (D->getDeclContext()->isFunctionOrMethod()) { 64096084f171f4824397dc48453146f0a9719cb9247Douglas Gregor // If the enumeration is within a function or method, record the enum 64196084f171f4824397dc48453146f0a9719cb9247Douglas Gregor // constant as a local. 64296084f171f4824397dc48453146f0a9719cb9247Douglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(*EC, EnumConst); 64396084f171f4824397dc48453146f0a9719cb9247Douglas Gregor } 6448dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 6458dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 6461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 647c6e35aae23bc3cea7daf5ee075fa695c01c0f66fMike Stump // FIXME: Fixup LBraceLoc and RBraceLoc 648fee13819693c8492f0c364bc704645e844ef737aEdward O'Callaghan // FIXME: Empty Scope and AttributeList (required to handle attribute packed). 649c6e35aae23bc3cea7daf5ee075fa695c01c0f66fMike Stump SemaRef.ActOnEnumBody(Enum->getLocation(), SourceLocation(), SourceLocation(), 650d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall Enum, 651de7a0fcdf9f30cb5a97aab614f3975d93cd9926fEli Friedman Enumerators.data(), Enumerators.size(), 652fee13819693c8492f0c364bc704645e844ef737aEdward O'Callaghan 0, 0); 6538dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 6548dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Enum; 6558dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 6568dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 6576477b69cc93e0a0ff15036d60d604f3544da0f29Douglas GregorDecl *TemplateDeclInstantiator::VisitEnumConstantDecl(EnumConstantDecl *D) { 658b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("EnumConstantDecls can only occur within EnumDecls."); 6596477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor} 6606477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor 661e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCallDecl *TemplateDeclInstantiator::VisitClassTemplateDecl(ClassTemplateDecl *D) { 66293ba8579c341d5329175f1413cdc3b35a36592d2John McCall bool isFriend = (D->getFriendObjectKind() != Decl::FOK_None); 66393ba8579c341d5329175f1413cdc3b35a36592d2John McCall 664550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // Create a local instantiation scope for this class template, which 665550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // will contain the instantiations of the template parameters. 6662a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall LocalInstantiationScope Scope(SemaRef); 667e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall TemplateParameterList *TempParams = D->getTemplateParameters(); 668ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCall TemplateParameterList *InstParams = SubstTemplateParams(TempParams); 6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!InstParams) 670d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor return NULL; 671e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 672e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall CXXRecordDecl *Pattern = D->getTemplatedDecl(); 67393ba8579c341d5329175f1413cdc3b35a36592d2John McCall 67493ba8579c341d5329175f1413cdc3b35a36592d2John McCall // Instantiate the qualifier. We have to do this first in case 67593ba8579c341d5329175f1413cdc3b35a36592d2John McCall // we're a friend declaration, because if we are then we need to put 67693ba8579c341d5329175f1413cdc3b35a36592d2John McCall // the new declaration in the appropriate context. 677c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc = Pattern->getQualifierLoc(); 678c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) { 679c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc, 680c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TemplateArgs); 681c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (!QualifierLoc) 682c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return 0; 68393ba8579c341d5329175f1413cdc3b35a36592d2John McCall } 68493ba8579c341d5329175f1413cdc3b35a36592d2John McCall 68593ba8579c341d5329175f1413cdc3b35a36592d2John McCall CXXRecordDecl *PrevDecl = 0; 68693ba8579c341d5329175f1413cdc3b35a36592d2John McCall ClassTemplateDecl *PrevClassTemplate = 0; 68793ba8579c341d5329175f1413cdc3b35a36592d2John McCall 688ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor if (!isFriend && Pattern->getPreviousDecl()) { 68937574f55cd637340f651330f5cfda69742880d36Nick Lewycky DeclContext::lookup_result Found = Owner->lookup(Pattern->getDeclName()); 69037574f55cd637340f651330f5cfda69742880d36Nick Lewycky if (Found.first != Found.second) { 69137574f55cd637340f651330f5cfda69742880d36Nick Lewycky PrevClassTemplate = dyn_cast<ClassTemplateDecl>(*Found.first); 69237574f55cd637340f651330f5cfda69742880d36Nick Lewycky if (PrevClassTemplate) 69337574f55cd637340f651330f5cfda69742880d36Nick Lewycky PrevDecl = PrevClassTemplate->getTemplatedDecl(); 69437574f55cd637340f651330f5cfda69742880d36Nick Lewycky } 69537574f55cd637340f651330f5cfda69742880d36Nick Lewycky } 69637574f55cd637340f651330f5cfda69742880d36Nick Lewycky 69793ba8579c341d5329175f1413cdc3b35a36592d2John McCall // If this isn't a friend, then it's a member template, in which 69893ba8579c341d5329175f1413cdc3b35a36592d2John McCall // case we just want to build the instantiation in the 69993ba8579c341d5329175f1413cdc3b35a36592d2John McCall // specialization. If it is a friend, we want to build it in 70093ba8579c341d5329175f1413cdc3b35a36592d2John McCall // the appropriate context. 70193ba8579c341d5329175f1413cdc3b35a36592d2John McCall DeclContext *DC = Owner; 70293ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (isFriend) { 703c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) { 70493ba8579c341d5329175f1413cdc3b35a36592d2John McCall CXXScopeSpec SS; 705c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SS.Adopt(QualifierLoc); 70693ba8579c341d5329175f1413cdc3b35a36592d2John McCall DC = SemaRef.computeDeclContext(SS); 70793ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (!DC) return 0; 70893ba8579c341d5329175f1413cdc3b35a36592d2John McCall } else { 70993ba8579c341d5329175f1413cdc3b35a36592d2John McCall DC = SemaRef.FindInstantiatedContext(Pattern->getLocation(), 71093ba8579c341d5329175f1413cdc3b35a36592d2John McCall Pattern->getDeclContext(), 71193ba8579c341d5329175f1413cdc3b35a36592d2John McCall TemplateArgs); 71293ba8579c341d5329175f1413cdc3b35a36592d2John McCall } 71393ba8579c341d5329175f1413cdc3b35a36592d2John McCall 71493ba8579c341d5329175f1413cdc3b35a36592d2John McCall // Look for a previous declaration of the template in the owning 71593ba8579c341d5329175f1413cdc3b35a36592d2John McCall // context. 71693ba8579c341d5329175f1413cdc3b35a36592d2John McCall LookupResult R(SemaRef, Pattern->getDeclName(), Pattern->getLocation(), 71793ba8579c341d5329175f1413cdc3b35a36592d2John McCall Sema::LookupOrdinaryName, Sema::ForRedeclaration); 71893ba8579c341d5329175f1413cdc3b35a36592d2John McCall SemaRef.LookupQualifiedName(R, DC); 71993ba8579c341d5329175f1413cdc3b35a36592d2John McCall 72093ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (R.isSingleResult()) { 72193ba8579c341d5329175f1413cdc3b35a36592d2John McCall PrevClassTemplate = R.getAsSingle<ClassTemplateDecl>(); 72293ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (PrevClassTemplate) 72393ba8579c341d5329175f1413cdc3b35a36592d2John McCall PrevDecl = PrevClassTemplate->getTemplatedDecl(); 72493ba8579c341d5329175f1413cdc3b35a36592d2John McCall } 72593ba8579c341d5329175f1413cdc3b35a36592d2John McCall 726c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (!PrevClassTemplate && QualifierLoc) { 72793ba8579c341d5329175f1413cdc3b35a36592d2John McCall SemaRef.Diag(Pattern->getLocation(), diag::err_not_tag_in_scope) 7281eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregor << D->getTemplatedDecl()->getTagKind() << Pattern->getDeclName() << DC 729c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor << QualifierLoc.getSourceRange(); 73093ba8579c341d5329175f1413cdc3b35a36592d2John McCall return 0; 73193ba8579c341d5329175f1413cdc3b35a36592d2John McCall } 73293ba8579c341d5329175f1413cdc3b35a36592d2John McCall 733c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor bool AdoptedPreviousTemplateParams = false; 73493ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (PrevClassTemplate) { 735c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor bool Complain = true; 736c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor 737c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor // HACK: libstdc++ 4.2.1 contains an ill-formed friend class 738c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor // template for struct std::tr1::__detail::_Map_base, where the 739c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor // template parameters of the friend declaration don't match the 740c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor // template parameters of the original declaration. In this one 741c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor // case, we don't complain about the ill-formed friend 742c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor // declaration. 743a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi if (isFriend && Pattern->getIdentifier() && 744c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor Pattern->getIdentifier()->isStr("_Map_base") && 745c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor DC->isNamespace() && 746c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor cast<NamespaceDecl>(DC)->getIdentifier() && 747c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__detail")) { 748c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor DeclContext *DCParent = DC->getParent(); 749c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor if (DCParent->isNamespace() && 750c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor cast<NamespaceDecl>(DCParent)->getIdentifier() && 751c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor cast<NamespaceDecl>(DCParent)->getIdentifier()->isStr("tr1")) { 752c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor DeclContext *DCParent2 = DCParent->getParent(); 753c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor if (DCParent2->isNamespace() && 754c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor cast<NamespaceDecl>(DCParent2)->getIdentifier() && 755c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor cast<NamespaceDecl>(DCParent2)->getIdentifier()->isStr("std") && 756c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor DCParent2->getParent()->isTranslationUnit()) 757c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor Complain = false; 758c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor } 759c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor } 760c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor 76193ba8579c341d5329175f1413cdc3b35a36592d2John McCall TemplateParameterList *PrevParams 76293ba8579c341d5329175f1413cdc3b35a36592d2John McCall = PrevClassTemplate->getTemplateParameters(); 76393ba8579c341d5329175f1413cdc3b35a36592d2John McCall 76493ba8579c341d5329175f1413cdc3b35a36592d2John McCall // Make sure the parameter lists match. 76593ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (!SemaRef.TemplateParameterListsAreEqual(InstParams, PrevParams, 766a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Complain, 767c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor Sema::TPL_TemplateMatch)) { 768c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor if (Complain) 769c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor return 0; 770c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor 771c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor AdoptedPreviousTemplateParams = true; 772c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor InstParams = PrevParams; 773c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor } 77493ba8579c341d5329175f1413cdc3b35a36592d2John McCall 77593ba8579c341d5329175f1413cdc3b35a36592d2John McCall // Do some additional validation, then merge default arguments 77693ba8579c341d5329175f1413cdc3b35a36592d2John McCall // from the existing declarations. 777c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor if (!AdoptedPreviousTemplateParams && 778c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor SemaRef.CheckTemplateParameterList(InstParams, PrevParams, 77993ba8579c341d5329175f1413cdc3b35a36592d2John McCall Sema::TPC_ClassTemplate)) 78093ba8579c341d5329175f1413cdc3b35a36592d2John McCall return 0; 78193ba8579c341d5329175f1413cdc3b35a36592d2John McCall } 78293ba8579c341d5329175f1413cdc3b35a36592d2John McCall } 78393ba8579c341d5329175f1413cdc3b35a36592d2John McCall 784e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall CXXRecordDecl *RecordInst 78593ba8579c341d5329175f1413cdc3b35a36592d2John McCall = CXXRecordDecl::Create(SemaRef.Context, Pattern->getTagKind(), DC, 786ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Pattern->getLocStart(), Pattern->getLocation(), 787ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Pattern->getIdentifier(), PrevDecl, 788f0510d49a6985e9284d30cfc36a0df2a6292a638Douglas Gregor /*DelayTypeCreation=*/true); 789e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 790c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) 791c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor RecordInst->setQualifierInfo(QualifierLoc); 792b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 793e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall ClassTemplateDecl *Inst 79493ba8579c341d5329175f1413cdc3b35a36592d2John McCall = ClassTemplateDecl::Create(SemaRef.Context, DC, D->getLocation(), 79593ba8579c341d5329175f1413cdc3b35a36592d2John McCall D->getIdentifier(), InstParams, RecordInst, 79693ba8579c341d5329175f1413cdc3b35a36592d2John McCall PrevClassTemplate); 797e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall RecordInst->setDescribedClassTemplate(Inst); 798ea7390c7b384ce607bfc8fc13c01f37cfc3776f0John McCall 79993ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (isFriend) { 800ea7390c7b384ce607bfc8fc13c01f37cfc3776f0John McCall if (PrevClassTemplate) 801ea7390c7b384ce607bfc8fc13c01f37cfc3776f0John McCall Inst->setAccess(PrevClassTemplate->getAccess()); 802ea7390c7b384ce607bfc8fc13c01f37cfc3776f0John McCall else 803ea7390c7b384ce607bfc8fc13c01f37cfc3776f0John McCall Inst->setAccess(D->getAccess()); 804ea7390c7b384ce607bfc8fc13c01f37cfc3776f0John McCall 80593ba8579c341d5329175f1413cdc3b35a36592d2John McCall Inst->setObjectOfFriendDecl(PrevClassTemplate != 0); 80693ba8579c341d5329175f1413cdc3b35a36592d2John McCall // TODO: do we want to track the instantiation progeny of this 80793ba8579c341d5329175f1413cdc3b35a36592d2John McCall // friend target decl? 80893ba8579c341d5329175f1413cdc3b35a36592d2John McCall } else { 809e8c01bdb56549adcecd71ce39160eea54b2c51c8Douglas Gregor Inst->setAccess(D->getAccess()); 81037574f55cd637340f651330f5cfda69742880d36Nick Lewycky if (!PrevClassTemplate) 81137574f55cd637340f651330f5cfda69742880d36Nick Lewycky Inst->setInstantiatedFromMemberTemplate(D); 81293ba8579c341d5329175f1413cdc3b35a36592d2John McCall } 813a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 814f0510d49a6985e9284d30cfc36a0df2a6292a638Douglas Gregor // Trigger creation of the type for the instantiation. 8153cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall SemaRef.Context.getInjectedClassNameType(RecordInst, 81624bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor Inst->getInjectedClassNameSpecialization()); 817ea7390c7b384ce607bfc8fc13c01f37cfc3776f0John McCall 818259571e27e513cfaf691cc7447e09b31a47d5438Douglas Gregor // Finish handling of friends. 81993ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (isFriend) { 82093ba8579c341d5329175f1413cdc3b35a36592d2John McCall DC->makeDeclVisibleInContext(Inst, /*Recoverable*/ false); 8214c51548271d2f8385127e1d943764ae8939d7794Abramo Bagnara Inst->setLexicalDeclContext(Owner); 8224c51548271d2f8385127e1d943764ae8939d7794Abramo Bagnara RecordInst->setLexicalDeclContext(Owner); 823e8c01bdb56549adcecd71ce39160eea54b2c51c8Douglas Gregor return Inst; 824259571e27e513cfaf691cc7447e09b31a47d5438Douglas Gregor } 825a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 8264c51548271d2f8385127e1d943764ae8939d7794Abramo Bagnara if (D->isOutOfLine()) { 8274c51548271d2f8385127e1d943764ae8939d7794Abramo Bagnara Inst->setLexicalDeclContext(D->getLexicalDeclContext()); 8284c51548271d2f8385127e1d943764ae8939d7794Abramo Bagnara RecordInst->setLexicalDeclContext(D->getLexicalDeclContext()); 8294c51548271d2f8385127e1d943764ae8939d7794Abramo Bagnara } 8304c51548271d2f8385127e1d943764ae8939d7794Abramo Bagnara 831e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall Owner->addDecl(Inst); 832d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor 833d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor if (!PrevClassTemplate) { 834d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor // Queue up any out-of-line partial specializations of this member 835d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor // class template; the client will force their instantiation once 836d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor // the enclosing class has been instantiated. 8375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ClassTemplatePartialSpecializationDecl *, 4> PartialSpecs; 838d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor D->getPartialSpecializations(PartialSpecs); 839d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor for (unsigned I = 0, N = PartialSpecs.size(); I != N; ++I) 840d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor if (PartialSpecs[I]->isOutOfLine()) 841d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor OutOfLinePartialSpecs.push_back(std::make_pair(Inst, PartialSpecs[I])); 842d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor } 843d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor 844e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall return Inst; 845e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall} 846e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 847d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas GregorDecl * 8487974c3b7062f85bb7c0ada34526cdefe1d30f89bDouglas GregorTemplateDeclInstantiator::VisitClassTemplatePartialSpecializationDecl( 8497974c3b7062f85bb7c0ada34526cdefe1d30f89bDouglas Gregor ClassTemplatePartialSpecializationDecl *D) { 850ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor ClassTemplateDecl *ClassTemplate = D->getSpecializedTemplate(); 851a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 852ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Lookup the already-instantiated declaration in the instantiation 853ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // of the class template and return that. 854ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor DeclContext::lookup_result Found 855ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = Owner->lookup(ClassTemplate->getDeclName()); 856ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (Found.first == Found.second) 857ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return 0; 858a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 859ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor ClassTemplateDecl *InstClassTemplate 860ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<ClassTemplateDecl>(*Found.first); 861ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (!InstClassTemplate) 862ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return 0; 863a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 864d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor if (ClassTemplatePartialSpecializationDecl *Result 865d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor = InstClassTemplate->findPartialSpecInstantiatedFromMember(D)) 866d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor return Result; 867d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor 868d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor return InstantiateClassTemplatePartialSpecialization(InstClassTemplate, D); 8697974c3b7062f85bb7c0ada34526cdefe1d30f89bDouglas Gregor} 8707974c3b7062f85bb7c0ada34526cdefe1d30f89bDouglas Gregor 8717974c3b7062f85bb7c0ada34526cdefe1d30f89bDouglas GregorDecl * 872d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas GregorTemplateDeclInstantiator::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 873550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // Create a local instantiation scope for this function template, which 874550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // will contain the instantiations of the template parameters and then get 875a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi // merged with the local instantiation scope for the function template 876550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // itself. 8772a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall LocalInstantiationScope Scope(SemaRef); 878895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor 879d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor TemplateParameterList *TempParams = D->getTemplateParameters(); 880d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor TemplateParameterList *InstParams = SubstTemplateParams(TempParams); 8811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!InstParams) 882d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor return NULL; 883a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 884a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor FunctionDecl *Instantiated = 0; 885a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor if (CXXMethodDecl *DMethod = dyn_cast<CXXMethodDecl>(D->getTemplatedDecl())) 886a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Instantiated = cast_or_null<FunctionDecl>(VisitCXXMethodDecl(DMethod, 887a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor InstParams)); 888a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor else 889a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor Instantiated = cast_or_null<FunctionDecl>(VisitFunctionDecl( 890a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi D->getTemplatedDecl(), 891a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor InstParams)); 892a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 893a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor if (!Instantiated) 894d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor return 0; 895d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor 89646460a68f6508775e98c19b4bb8454bb471aac24John McCall Instantiated->setAccess(D->getAccess()); 89746460a68f6508775e98c19b4bb8454bb471aac24John McCall 8981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Link the instantiated function template declaration to the function 899d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // template from which it was instantiated. 900a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi FunctionTemplateDecl *InstTemplate 901a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor = Instantiated->getDescribedFunctionTemplate(); 90237d68185088947322a97eabdc1c0714b0debd929Douglas Gregor InstTemplate->setAccess(D->getAccess()); 903a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi assert(InstTemplate && 904a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor "VisitFunctionDecl/CXXMethodDecl didn't create a template!"); 905e976ffe18ee60b81641423f42ff6feec2f5e3cb7John McCall 906b1a56e767cfb645fcb25027ab728dd5824d92615John McCall bool isFriend = (InstTemplate->getFriendObjectKind() != Decl::FOK_None); 907b1a56e767cfb645fcb25027ab728dd5824d92615John McCall 908e976ffe18ee60b81641423f42ff6feec2f5e3cb7John McCall // Link the instantiation back to the pattern *unless* this is a 909e976ffe18ee60b81641423f42ff6feec2f5e3cb7John McCall // non-definition friend declaration. 910e976ffe18ee60b81641423f42ff6feec2f5e3cb7John McCall if (!InstTemplate->getInstantiatedFromMemberTemplate() && 911b1a56e767cfb645fcb25027ab728dd5824d92615John McCall !(isFriend && !D->getTemplatedDecl()->isThisDeclarationADefinition())) 912a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor InstTemplate->setInstantiatedFromMemberTemplate(D); 913a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 914b1a56e767cfb645fcb25027ab728dd5824d92615John McCall // Make declarations visible in the appropriate context. 915b1a56e767cfb645fcb25027ab728dd5824d92615John McCall if (!isFriend) 916a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor Owner->addDecl(InstTemplate); 917b1a56e767cfb645fcb25027ab728dd5824d92615John McCall 918d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor return InstTemplate; 919d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor} 920d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor 921d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas GregorDecl *TemplateDeclInstantiator::VisitCXXRecordDecl(CXXRecordDecl *D) { 922d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor CXXRecordDecl *PrevDecl = 0; 923d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor if (D->isInjectedClassName()) 924d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor PrevDecl = cast<CXXRecordDecl>(Owner); 925ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor else if (D->getPreviousDecl()) { 9267c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->getLocation(), 927ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor D->getPreviousDecl(), 9286c1c1b8c6ca743a5b6b4c81f9ac56392c12c7457John McCall TemplateArgs); 9296c1c1b8c6ca743a5b6b4c81f9ac56392c12c7457John McCall if (!Prev) return 0; 9306c1c1b8c6ca743a5b6b4c81f9ac56392c12c7457John McCall PrevDecl = cast<CXXRecordDecl>(Prev); 9316c1c1b8c6ca743a5b6b4c81f9ac56392c12c7457John McCall } 932d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor 933d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor CXXRecordDecl *Record 9341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = CXXRecordDecl::Create(SemaRef.Context, D->getTagKind(), Owner, 935ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara D->getLocStart(), D->getLocation(), 936ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara D->getIdentifier(), PrevDecl); 937b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 938b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall // Substitute the nested name specifier, if any. 939b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall if (SubstQualifier(D, Record)) 940b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall return 0; 941b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 942d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor Record->setImplicit(D->isImplicit()); 943eaba1af8529c381d7bfd4dd0a8b48d2c01647972Eli Friedman // FIXME: Check against AS_none is an ugly hack to work around the issue that 944eaba1af8529c381d7bfd4dd0a8b48d2c01647972Eli Friedman // the tag decls introduced by friend class declarations don't have an access 945eaba1af8529c381d7bfd4dd0a8b48d2c01647972Eli Friedman // specifier. Remove once this area of the code gets sorted out. 946eaba1af8529c381d7bfd4dd0a8b48d2c01647972Eli Friedman if (D->getAccess() != AS_none) 947eaba1af8529c381d7bfd4dd0a8b48d2c01647972Eli Friedman Record->setAccess(D->getAccess()); 948d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor if (!D->isInjectedClassName()) 949f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor Record->setInstantiationOfMemberClass(D, TSK_ImplicitInstantiation); 950d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor 95102cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall // If the original function was part of a friend declaration, 95202cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall // inherit its namespace state. 95302cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall if (Decl::FriendObjectKind FOK = D->getFriendObjectKind()) 95402cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall Record->setObjectOfFriendDecl(FOK == Decl::FOK_Declared); 95502cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall 9569901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor // Make sure that anonymous structs and unions are recorded. 9579901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor if (D->isAnonymousStructOrUnion()) { 9589901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor Record->setAnonymousStructOrUnion(true); 9597a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl if (Record->getDeclContext()->getRedeclContext()->isFunctionOrMethod()) 9609901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Record); 9619901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor } 962d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson 96317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Owner->addDecl(Record); 964d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor return Record; 965d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor} 966d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor 96702cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// Normal class members are of more specific types and therefore 96802cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// don't make it here. This function serves two purposes: 96902cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// 1) instantiating function templates 97002cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// 2) substituting friend declarations 97102cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// FIXME: preserve function definitions in case #2 9727557a1348d2821dce126a778aa7acd7a00b814fdDouglas GregorDecl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D, 973a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor TemplateParameterList *TemplateParams) { 974127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // Check whether there is already a function template specialization for 975127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // this declaration. 976127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor FunctionTemplateDecl *FunctionTemplate = D->getDescribedFunctionTemplate(); 977127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor void *InsertPos = 0; 978b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (FunctionTemplate && !TemplateParams) { 979a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi std::pair<const TemplateArgument *, unsigned> Innermost 98024bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor = TemplateArgs.getInnermost(); 9811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9822c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis FunctionDecl *SpecFunc 9832c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis = FunctionTemplate->findSpecialization(Innermost.first, Innermost.second, 9842c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis InsertPos); 9851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 986127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // If we already have a function template specialization, return it. 9872c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis if (SpecFunc) 9882c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis return SpecFunc; 989127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor } 9901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 991b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall bool isFriend; 992b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (FunctionTemplate) 993b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall isFriend = (FunctionTemplate->getFriendObjectKind() != Decl::FOK_None); 994b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall else 995b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall isFriend = (D->getFriendObjectKind() != Decl::FOK_None); 996b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall 99779c2278a66d8fc0943774d1b7c71a32f7764e1e2Douglas Gregor bool MergeWithParentScope = (TemplateParams != 0) || 998b212d9a8e10308cde5b7a1ce07bd59d8df14fa06Douglas Gregor Owner->isFunctionOrMethod() || 999a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi !(isa<Decl>(Owner) && 100079c2278a66d8fc0943774d1b7c71a32f7764e1e2Douglas Gregor cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod()); 10012a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall LocalInstantiationScope Scope(SemaRef, MergeWithParentScope); 10021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ParmVarDecl *, 4> Params; 100464b4b43a23aa8b8009470e3cc451333f623d7d58David Blaikie TypeSourceInfo *TInfo = SubstFunctionType(D, Params); 100521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (!TInfo) 10062dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return 0; 100721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall QualType T = TInfo->getType(); 1008fd810b1386ed29b250e7d522ea826a65c815e49dJohn McCall 1009c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc(); 1010c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) { 1011c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc, 1012c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TemplateArgs); 1013c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (!QualifierLoc) 1014c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return 0; 1015d325daa506338ab86f9dd468b48fd010673f49a6John McCall } 1016d325daa506338ab86f9dd468b48fd010673f49a6John McCall 101768b6b87b6beb7922fc2c8ab923ba2ce125490363John McCall // If we're instantiating a local function declaration, put the result 101868b6b87b6beb7922fc2c8ab923ba2ce125490363John McCall // in the owner; otherwise we need to find the instantiated context. 101968b6b87b6beb7922fc2c8ab923ba2ce125490363John McCall DeclContext *DC; 102068b6b87b6beb7922fc2c8ab923ba2ce125490363John McCall if (D->getDeclContext()->isFunctionOrMethod()) 102168b6b87b6beb7922fc2c8ab923ba2ce125490363John McCall DC = Owner; 1022c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor else if (isFriend && QualifierLoc) { 1023d325daa506338ab86f9dd468b48fd010673f49a6John McCall CXXScopeSpec SS; 1024c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SS.Adopt(QualifierLoc); 1025d325daa506338ab86f9dd468b48fd010673f49a6John McCall DC = SemaRef.computeDeclContext(SS); 1026d325daa506338ab86f9dd468b48fd010673f49a6John McCall if (!DC) return 0; 1027d325daa506338ab86f9dd468b48fd010673f49a6John McCall } else { 1028a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi DC = SemaRef.FindInstantiatedContext(D->getLocation(), D->getDeclContext(), 10297c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor TemplateArgs); 1030d325daa506338ab86f9dd468b48fd010673f49a6John McCall } 103168b6b87b6beb7922fc2c8ab923ba2ce125490363John McCall 103202cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall FunctionDecl *Function = 1033ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara FunctionDecl::Create(SemaRef.Context, DC, D->getInnerLocStart(), 1034ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getLocation(), D->getDeclName(), T, TInfo, 103516573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor D->getStorageClass(), D->getStorageClassAsWritten(), 1036af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith D->isInlineSpecified(), D->hasWrittenPrototype(), 103786c3ae46250cdcc57778c27826060779a92f3815Richard Smith D->isConstexpr()); 1038b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 1039c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) 1040c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Function->setQualifierInfo(QualifierLoc); 1041b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 1042b1a56e767cfb645fcb25027ab728dd5824d92615John McCall DeclContext *LexicalDC = Owner; 1043b1a56e767cfb645fcb25027ab728dd5824d92615John McCall if (!isFriend && D->isOutOfLine()) { 1044b1a56e767cfb645fcb25027ab728dd5824d92615John McCall assert(D->getDeclContext()->isFileContext()); 1045b1a56e767cfb645fcb25027ab728dd5824d92615John McCall LexicalDC = D->getDeclContext(); 1046b1a56e767cfb645fcb25027ab728dd5824d92615John McCall } 1047b1a56e767cfb645fcb25027ab728dd5824d92615John McCall 1048b1a56e767cfb645fcb25027ab728dd5824d92615John McCall Function->setLexicalDeclContext(LexicalDC); 10491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1050e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // Attach the parameters 10515cbe101b502e06d16bc77df45a27ce8bc13f33c8Douglas Gregor if (isa<FunctionProtoType>(Function->getType().IgnoreParens())) { 10521d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor // Adopt the already-instantiated parameters into our own context. 10531d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor for (unsigned P = 0; P < Params.size(); ++P) 10541d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor if (Params[P]) 10551d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor Params[P]->setOwningFunction(Function); 10561d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor } else { 10571d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor // Since we were instantiated via a typedef of a function type, create 10581d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor // new parameters. 10591d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor const FunctionProtoType *Proto 10601d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor = Function->getType()->getAs<FunctionProtoType>(); 10611d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor assert(Proto && "No function prototype in template instantiation?"); 10621d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor for (FunctionProtoType::arg_type_iterator AI = Proto->arg_type_begin(), 10631d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor AE = Proto->arg_type_end(); AI != AE; ++AI) { 10641d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor ParmVarDecl *Param 10651d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor = SemaRef.BuildParmVarDeclForTypedef(Function, Function->getLocation(), 10661d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor *AI); 10671d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor Param->setScopeInfo(0, Params.size()); 10681d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor Params.push_back(Param); 10691d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor } 10701d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor } 10714278c654b645402554eb52a48e9c7097c9f1233aDavid Blaikie Function->setParams(Params); 107202cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall 1073ac7c2c8a9d47df7d652364af3043c41816a18fa4Douglas Gregor SourceLocation InstantiateAtPOI; 1074a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor if (TemplateParams) { 1075a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // Our resulting instantiation is actually a function template, since we 1076a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // are substituting only the outer template parameters. For example, given 1077a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // 1078a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // template<typename T> 1079a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // struct X { 1080a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // template<typename U> friend void f(T, U); 1081a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // }; 1082a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // 1083a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // X<int> x; 1084a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // 1085a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi // We are instantiating the friend function template "f" within X<int>, 1086a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // which means substituting int for T, but leaving "f" as a friend function 1087a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // template. 1088a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // Build the function template itself. 1089d325daa506338ab86f9dd468b48fd010673f49a6John McCall FunctionTemplate = FunctionTemplateDecl::Create(SemaRef.Context, DC, 1090a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor Function->getLocation(), 1091a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor Function->getDeclName(), 1092a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor TemplateParams, Function); 1093a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor Function->setDescribedFunctionTemplate(FunctionTemplate); 1094b1a56e767cfb645fcb25027ab728dd5824d92615John McCall 1095b1a56e767cfb645fcb25027ab728dd5824d92615John McCall FunctionTemplate->setLexicalDeclContext(LexicalDC); 1096d325daa506338ab86f9dd468b48fd010673f49a6John McCall 1097d325daa506338ab86f9dd468b48fd010673f49a6John McCall if (isFriend && D->isThisDeclarationADefinition()) { 1098d325daa506338ab86f9dd468b48fd010673f49a6John McCall // TODO: should we remember this connection regardless of whether 1099d325daa506338ab86f9dd468b48fd010673f49a6John McCall // the friend declaration provided a body? 1100d325daa506338ab86f9dd468b48fd010673f49a6John McCall FunctionTemplate->setInstantiatedFromMemberTemplate( 1101d325daa506338ab86f9dd468b48fd010673f49a6John McCall D->getDescribedFunctionTemplate()); 1102d325daa506338ab86f9dd468b48fd010673f49a6John McCall } 110366724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor } else if (FunctionTemplate) { 110466724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor // Record this function template specialization. 1105a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi std::pair<const TemplateArgument *, unsigned> Innermost 110624bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor = TemplateArgs.getInnermost(); 1107838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor Function->setFunctionTemplateSpecialization(FunctionTemplate, 1108910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgumentList::CreateCopy(SemaRef.Context, 110924bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor Innermost.first, 111024bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor Innermost.second), 111166724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor InsertPos); 111280f5b16efb658dabbcf971f42ed8b789aaaa6baaChandler Carruth } else if (isFriend) { 111380f5b16efb658dabbcf971f42ed8b789aaaa6baaChandler Carruth // Note, we need this connection even if the friend doesn't have a body. 111480f5b16efb658dabbcf971f42ed8b789aaaa6baaChandler Carruth // Its body may exist but not have been attached yet due to deferred 111580f5b16efb658dabbcf971f42ed8b789aaaa6baaChandler Carruth // parsing. 111680f5b16efb658dabbcf971f42ed8b789aaaa6baaChandler Carruth // FIXME: It might be cleaner to set this when attaching the body to the 111780f5b16efb658dabbcf971f42ed8b789aaaa6baaChandler Carruth // friend function declaration, however that would require finding all the 111880f5b16efb658dabbcf971f42ed8b789aaaa6baaChandler Carruth // instantiations and modifying them. 1119d325daa506338ab86f9dd468b48fd010673f49a6John McCall Function->setInstantiationOfMemberFunction(D, TSK_ImplicitInstantiation); 112002cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall } 1121a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 1122e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (InitFunctionInstantiation(Function, D)) 1123e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor Function->setInvalidDecl(); 11241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1125af2094e7cecadf36667deb61a83587ffdd979bd3John McCall bool isExplicitSpecialization = false; 1126a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 11276826314938f8510cd1a6b03b5d032592456ae27bJohn McCall LookupResult Previous(SemaRef, Function->getDeclName(), SourceLocation(), 11286826314938f8510cd1a6b03b5d032592456ae27bJohn McCall Sema::LookupOrdinaryName, Sema::ForRedeclaration); 11296826314938f8510cd1a6b03b5d032592456ae27bJohn McCall 1130af2094e7cecadf36667deb61a83587ffdd979bd3John McCall if (DependentFunctionTemplateSpecializationInfo *Info 1131af2094e7cecadf36667deb61a83587ffdd979bd3John McCall = D->getDependentSpecializationInfo()) { 1132af2094e7cecadf36667deb61a83587ffdd979bd3John McCall assert(isFriend && "non-friend has dependent specialization info?"); 1133af2094e7cecadf36667deb61a83587ffdd979bd3John McCall 1134af2094e7cecadf36667deb61a83587ffdd979bd3John McCall // This needs to be set now for future sanity. 1135af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Function->setObjectOfFriendDecl(/*HasPrevious*/ true); 1136af2094e7cecadf36667deb61a83587ffdd979bd3John McCall 1137af2094e7cecadf36667deb61a83587ffdd979bd3John McCall // Instantiate the explicit template arguments. 1138af2094e7cecadf36667deb61a83587ffdd979bd3John McCall TemplateArgumentListInfo ExplicitArgs(Info->getLAngleLoc(), 1139af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Info->getRAngleLoc()); 1140e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor if (SemaRef.Subst(Info->getTemplateArgs(), Info->getNumTemplateArgs(), 1141e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor ExplicitArgs, TemplateArgs)) 1142e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor return 0; 1143af2094e7cecadf36667deb61a83587ffdd979bd3John McCall 1144af2094e7cecadf36667deb61a83587ffdd979bd3John McCall // Map the candidate templates to their instantiations. 1145af2094e7cecadf36667deb61a83587ffdd979bd3John McCall for (unsigned I = 0, E = Info->getNumTemplates(); I != E; ++I) { 1146af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Decl *Temp = SemaRef.FindInstantiatedDecl(D->getLocation(), 1147af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Info->getTemplate(I), 1148af2094e7cecadf36667deb61a83587ffdd979bd3John McCall TemplateArgs); 1149af2094e7cecadf36667deb61a83587ffdd979bd3John McCall if (!Temp) return 0; 1150af2094e7cecadf36667deb61a83587ffdd979bd3John McCall 1151af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Previous.addDecl(cast<FunctionTemplateDecl>(Temp)); 1152af2094e7cecadf36667deb61a83587ffdd979bd3John McCall } 1153af2094e7cecadf36667deb61a83587ffdd979bd3John McCall 1154af2094e7cecadf36667deb61a83587ffdd979bd3John McCall if (SemaRef.CheckFunctionTemplateSpecialization(Function, 1155af2094e7cecadf36667deb61a83587ffdd979bd3John McCall &ExplicitArgs, 1156af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Previous)) 1157af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Function->setInvalidDecl(); 1158a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 1159af2094e7cecadf36667deb61a83587ffdd979bd3John McCall isExplicitSpecialization = true; 1160af2094e7cecadf36667deb61a83587ffdd979bd3John McCall 1161af2094e7cecadf36667deb61a83587ffdd979bd3John McCall } else if (TemplateParams || !FunctionTemplate) { 1162a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi // Look only into the namespace where the friend would be declared to 1163a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi // find a previous declaration. This is the innermost enclosing namespace, 1164a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // as described in ActOnFriendFunctionDecl. 11656826314938f8510cd1a6b03b5d032592456ae27bJohn McCall SemaRef.LookupQualifiedName(Previous, DC); 1166a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 1167a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // In C++, the previous declaration we find might be a tag type 1168a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // (class or enum). In this case, the new declaration will hide the 1169a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // tag type. Note that this does does not apply if we're declaring a 1170a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // typedef (C++ [dcl.typedef]p4). 11716826314938f8510cd1a6b03b5d032592456ae27bJohn McCall if (Previous.isSingleTagDecl()) 11726826314938f8510cd1a6b03b5d032592456ae27bJohn McCall Previous.clear(); 1173a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor } 1174a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 11759f54ad4381370c6b771424b53d219e661d6d6706John McCall SemaRef.CheckFunctionDeclaration(/*Scope*/ 0, Function, Previous, 11762c712f50cd56eaf3662989b556e9c6b1e8fcd11aKaelyn Uhrain isExplicitSpecialization); 1177e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 117876d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall NamedDecl *PrincipalDecl = (TemplateParams 117976d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall ? cast<NamedDecl>(FunctionTemplate) 118076d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall : Function); 118176d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall 1182a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // If the original function was part of a friend declaration, 1183a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // inherit its namespace state and add it to the owner. 1184d325daa506338ab86f9dd468b48fd010673f49a6John McCall if (isFriend) { 11856826314938f8510cd1a6b03b5d032592456ae27bJohn McCall NamedDecl *PrevDecl; 118676d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall if (TemplateParams) 1187ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor PrevDecl = FunctionTemplate->getPreviousDecl(); 118876d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall else 1189ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor PrevDecl = Function->getPreviousDecl(); 119076d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall 119176d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall PrincipalDecl->setObjectOfFriendDecl(PrevDecl != 0); 119276d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall DC->makeDeclVisibleInContext(PrincipalDecl, /*Recoverable=*/ false); 1193ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif 119477535dfde258765c056ef4c6786ef56cc48f0c76Gabor Greif bool queuedInstantiation = false; 1195ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif 119653e535161dfa9850de394b300915fc250eb0fdf4Richard Smith // C++98 [temp.friend]p5: When a function is defined in a friend function 119753e535161dfa9850de394b300915fc250eb0fdf4Richard Smith // declaration in a class template, the function is defined at each 119853e535161dfa9850de394b300915fc250eb0fdf4Richard Smith // instantiation of the class template. The function is defined even if it 119953e535161dfa9850de394b300915fc250eb0fdf4Richard Smith // is never used. 120053e535161dfa9850de394b300915fc250eb0fdf4Richard Smith // C++11 [temp.friend]p4: When a function is defined in a friend function 120153e535161dfa9850de394b300915fc250eb0fdf4Richard Smith // declaration in a class template, the function is instantiated when the 120253e535161dfa9850de394b300915fc250eb0fdf4Richard Smith // function is odr-used. 120353e535161dfa9850de394b300915fc250eb0fdf4Richard Smith // 120453e535161dfa9850de394b300915fc250eb0fdf4Richard Smith // If -Wc++98-compat is enabled, we go through the motions of checking for a 120553e535161dfa9850de394b300915fc250eb0fdf4Richard Smith // redefinition, but don't instantiate the function. 12064e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if ((!SemaRef.getLangOpts().CPlusPlus0x || 120753e535161dfa9850de394b300915fc250eb0fdf4Richard Smith SemaRef.Diags.getDiagnosticLevel( 120853e535161dfa9850de394b300915fc250eb0fdf4Richard Smith diag::warn_cxx98_compat_friend_redefinition, 120953e535161dfa9850de394b300915fc250eb0fdf4Richard Smith Function->getLocation()) 121053e535161dfa9850de394b300915fc250eb0fdf4Richard Smith != DiagnosticsEngine::Ignored) && 1211238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor D->isThisDeclarationADefinition()) { 1212238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor // Check for a function body. 1213238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor const FunctionDecl *Definition = 0; 121410620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt if (Function->isDefined(Definition) && 1215238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor Definition->getTemplateSpecializationKind() == TSK_Undeclared) { 121653e535161dfa9850de394b300915fc250eb0fdf4Richard Smith SemaRef.Diag(Function->getLocation(), 12174e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie SemaRef.getLangOpts().CPlusPlus0x ? 121853e535161dfa9850de394b300915fc250eb0fdf4Richard Smith diag::warn_cxx98_compat_friend_redefinition : 121953e535161dfa9850de394b300915fc250eb0fdf4Richard Smith diag::err_redefinition) << Function->getDeclName(); 1220238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor SemaRef.Diag(Definition->getLocation(), diag::note_previous_definition); 12214e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!SemaRef.getLangOpts().CPlusPlus0x) 122253e535161dfa9850de394b300915fc250eb0fdf4Richard Smith Function->setInvalidDecl(); 1223a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi } 1224238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor // Check for redefinitions due to other instantiations of this or 1225238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor // a similar friend function. 1226238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor else for (FunctionDecl::redecl_iterator R = Function->redecls_begin(), 1227238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor REnd = Function->redecls_end(); 1228238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor R != REnd; ++R) { 122913a8affbb87cdb869adabe2a6e5998559f2598c4Gabor Greif if (*R == Function) 123013a8affbb87cdb869adabe2a6e5998559f2598c4Gabor Greif continue; 1231ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif switch (R->getFriendObjectKind()) { 1232ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif case Decl::FOK_None: 12334e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!SemaRef.getLangOpts().CPlusPlus0x && 123453e535161dfa9850de394b300915fc250eb0fdf4Richard Smith !queuedInstantiation && R->isUsed(false)) { 1235ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif if (MemberSpecializationInfo *MSInfo 1236ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif = Function->getMemberSpecializationInfo()) { 1237ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif if (MSInfo->getPointOfInstantiation().isInvalid()) { 1238ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif SourceLocation Loc = R->getLocation(); // FIXME 1239ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif MSInfo->setPointOfInstantiation(Loc); 1240ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif SemaRef.PendingLocalImplicitInstantiations.push_back( 1241ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif std::make_pair(Function, Loc)); 1242ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif queuedInstantiation = true; 1243ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif } 1244ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif } 1245ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif } 1246ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif break; 1247ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif default: 1248238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor if (const FunctionDecl *RPattern 12496a557d8f6b3d7a747a0b57960d4b86f05ba2e53cGabor Greif = R->getTemplateInstantiationPattern()) 125010620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt if (RPattern->isDefined(RPattern)) { 125153e535161dfa9850de394b300915fc250eb0fdf4Richard Smith SemaRef.Diag(Function->getLocation(), 12524e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie SemaRef.getLangOpts().CPlusPlus0x ? 125353e535161dfa9850de394b300915fc250eb0fdf4Richard Smith diag::warn_cxx98_compat_friend_redefinition : 125453e535161dfa9850de394b300915fc250eb0fdf4Richard Smith diag::err_redefinition) 1255238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor << Function->getDeclName(); 12566a557d8f6b3d7a747a0b57960d4b86f05ba2e53cGabor Greif SemaRef.Diag(R->getLocation(), diag::note_previous_definition); 12574e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!SemaRef.getLangOpts().CPlusPlus0x) 125853e535161dfa9850de394b300915fc250eb0fdf4Richard Smith Function->setInvalidDecl(); 1259238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor break; 1260238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor } 1261238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor } 1262238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor } 1263238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor } 1264a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor } 1265a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor 126676d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall if (Function->isOverloadedOperator() && !DC->isRecord() && 126776d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall PrincipalDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 126876d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall PrincipalDecl->setNonMemberOperator(); 126976d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall 1270eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt assert(!D->isDefaulted() && "only methods should be defaulted"); 1271e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor return Function; 1272e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor} 12732dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 1274d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas GregorDecl * 1275d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas GregorTemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D, 1276af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet TemplateParameterList *TemplateParams, 1277af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet bool IsClassScopeSpecialization) { 12786b906869527be40b0d38d755e9ef51b331b88162Douglas Gregor FunctionTemplateDecl *FunctionTemplate = D->getDescribedFunctionTemplate(); 12796b906869527be40b0d38d755e9ef51b331b88162Douglas Gregor void *InsertPos = 0; 1280d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor if (FunctionTemplate && !TemplateParams) { 12811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // We are creating a function template specialization from a function 12821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // template. Check whether there is already a function template 1283d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // specialization for this particular set of template arguments. 1284a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi std::pair<const TemplateArgument *, unsigned> Innermost 128524bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor = TemplateArgs.getInnermost(); 12861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12872c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis FunctionDecl *SpecFunc 12882c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis = FunctionTemplate->findSpecialization(Innermost.first, Innermost.second, 12892c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis InsertPos); 12901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 12916b906869527be40b0d38d755e9ef51b331b88162Douglas Gregor // If we already have a function template specialization, return it. 12922c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis if (SpecFunc) 12932c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis return SpecFunc; 12946b906869527be40b0d38d755e9ef51b331b88162Douglas Gregor } 12956b906869527be40b0d38d755e9ef51b331b88162Douglas Gregor 1296b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall bool isFriend; 1297b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (FunctionTemplate) 1298b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall isFriend = (FunctionTemplate->getFriendObjectKind() != Decl::FOK_None); 1299b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall else 1300b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall isFriend = (D->getFriendObjectKind() != Decl::FOK_None); 1301b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall 130279c2278a66d8fc0943774d1b7c71a32f7764e1e2Douglas Gregor bool MergeWithParentScope = (TemplateParams != 0) || 1303a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi !(isa<Decl>(Owner) && 130479c2278a66d8fc0943774d1b7c71a32f7764e1e2Douglas Gregor cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod()); 13052a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall LocalInstantiationScope Scope(SemaRef, MergeWithParentScope); 130648dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor 13074eab39f0745fb1949dbb40c4145771b927888242John McCall // Instantiate enclosing template arguments for friends. 13085f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateParameterList *, 4> TempParamLists; 13094eab39f0745fb1949dbb40c4145771b927888242John McCall unsigned NumTempParamLists = 0; 13104eab39f0745fb1949dbb40c4145771b927888242John McCall if (isFriend && (NumTempParamLists = D->getNumTemplateParameterLists())) { 13114eab39f0745fb1949dbb40c4145771b927888242John McCall TempParamLists.set_size(NumTempParamLists); 13124eab39f0745fb1949dbb40c4145771b927888242John McCall for (unsigned I = 0; I != NumTempParamLists; ++I) { 13134eab39f0745fb1949dbb40c4145771b927888242John McCall TemplateParameterList *TempParams = D->getTemplateParameterList(I); 13144eab39f0745fb1949dbb40c4145771b927888242John McCall TemplateParameterList *InstParams = SubstTemplateParams(TempParams); 13154eab39f0745fb1949dbb40c4145771b927888242John McCall if (!InstParams) 13164eab39f0745fb1949dbb40c4145771b927888242John McCall return NULL; 13174eab39f0745fb1949dbb40c4145771b927888242John McCall TempParamLists[I] = InstParams; 13184eab39f0745fb1949dbb40c4145771b927888242John McCall } 13194eab39f0745fb1949dbb40c4145771b927888242John McCall } 13204eab39f0745fb1949dbb40c4145771b927888242John McCall 13215f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ParmVarDecl *, 4> Params; 1322dc370c1e70a2f876c65be4057ead751b72c8ddd5Benjamin Kramer TypeSourceInfo *TInfo = SubstFunctionType(D, Params); 132321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (!TInfo) 13242dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return 0; 132521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall QualType T = TInfo->getType(); 13262dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 1327723df245307a530da5433dfb43accf187dc3e243Abramo Bagnara // \brief If the type of this function, after ignoring parentheses, 1328723df245307a530da5433dfb43accf187dc3e243Abramo Bagnara // is not *directly* a function type, then we're instantiating a function 1329723df245307a530da5433dfb43accf187dc3e243Abramo Bagnara // that was declared via a typedef, e.g., 13305f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor // 13315f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor // typedef int functype(int, int); 13325f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor // functype func; 13335f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor // 13345f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor // In this case, we'll just go instantiate the ParmVarDecls that we 13355f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor // synthesized in the method declaration. 1336723df245307a530da5433dfb43accf187dc3e243Abramo Bagnara if (!isa<FunctionProtoType>(T.IgnoreParens())) { 13375f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor assert(!Params.size() && "Instantiating type could not yield parameters"); 13385f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 4> ParamTypes; 1339a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi if (SemaRef.SubstParmTypes(D->getLocation(), D->param_begin(), 1340a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi D->getNumParams(), TemplateArgs, ParamTypes, 134112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor &Params)) 1342a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi return 0; 13435f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor } 13445f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor 1345c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc(); 1346c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) { 1347c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc, 1348b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall TemplateArgs); 1349a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi if (!QualifierLoc) 1350c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return 0; 1351b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } 1352b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall 1353b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall DeclContext *DC = Owner; 1354b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (isFriend) { 1355c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) { 1356b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall CXXScopeSpec SS; 1357c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SS.Adopt(QualifierLoc); 1358b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall DC = SemaRef.computeDeclContext(SS); 1359c54d688c604d28dcb9ab8f92047837c10c8f9c61John McCall 1360c54d688c604d28dcb9ab8f92047837c10c8f9c61John McCall if (DC && SemaRef.RequireCompleteDeclContext(SS, DC)) 1361c54d688c604d28dcb9ab8f92047837c10c8f9c61John McCall return 0; 1362b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } else { 1363b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall DC = SemaRef.FindInstantiatedContext(D->getLocation(), 1364b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall D->getDeclContext(), 1365b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall TemplateArgs); 1366b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } 1367b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (!DC) return 0; 1368b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } 1369b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall 13702dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // Build the instantiated method declaration. 1371b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall CXXRecordDecl *Record = cast<CXXRecordDecl>(DC); 1372dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor CXXMethodDecl *Method = 0; 13731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1374ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc = D->getInnerLocStart(); 13752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo 13762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara = SemaRef.SubstDeclarationNameInfo(D->getNameInfo(), TemplateArgs); 137717e32f30e2d1eaf6639d3d4e2196a8d7c709fbacDouglas Gregor if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) { 13781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Method = CXXConstructorDecl::Create(SemaRef.Context, Record, 1379ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara StartLoc, NameInfo, T, TInfo, 13801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Constructor->isExplicit(), 138116573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor Constructor->isInlineSpecified(), 138286c3ae46250cdcc57778c27826060779a92f3815Richard Smith false, Constructor->isConstexpr()); 138317e32f30e2d1eaf6639d3d4e2196a8d7c709fbacDouglas Gregor } else if (CXXDestructorDecl *Destructor = dyn_cast<CXXDestructorDecl>(D)) { 138417e32f30e2d1eaf6639d3d4e2196a8d7c709fbacDouglas Gregor Method = CXXDestructorDecl::Create(SemaRef.Context, Record, 1385ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara StartLoc, NameInfo, T, TInfo, 13862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara Destructor->isInlineSpecified(), 138716573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor false); 138865ec1fda479688d143fe2403242cd9c730c800a1Douglas Gregor } else if (CXXConversionDecl *Conversion = dyn_cast<CXXConversionDecl>(D)) { 138965ec1fda479688d143fe2403242cd9c730c800a1Douglas Gregor Method = CXXConversionDecl::Create(SemaRef.Context, Record, 1390ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara StartLoc, NameInfo, T, TInfo, 13910130f3cc4ccd5f46361c48d5fe94133d74619424Douglas Gregor Conversion->isInlineSpecified(), 1392f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor Conversion->isExplicit(), 139386c3ae46250cdcc57778c27826060779a92f3815Richard Smith Conversion->isConstexpr(), 13949f569cca2a4c5fb6026005434e27025b9e71309dRichard Smith Conversion->getLocEnd()); 1395dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor } else { 13962577743c5650c646fb705df01403707e94f2df04Abramo Bagnara Method = CXXMethodDecl::Create(SemaRef.Context, Record, 1397ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara StartLoc, NameInfo, T, TInfo, 139816573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor D->isStatic(), 139916573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor D->getStorageClassAsWritten(), 1400f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor D->isInlineSpecified(), 140186c3ae46250cdcc57778c27826060779a92f3815Richard Smith D->isConstexpr(), D->getLocEnd()); 1402dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor } 14036b906869527be40b0d38d755e9ef51b331b88162Douglas Gregor 1404c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) 1405c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Method->setQualifierInfo(QualifierLoc); 1406b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 1407d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor if (TemplateParams) { 1408d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // Our resulting instantiation is actually a function template, since we 1409d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // are substituting only the outer template parameters. For example, given 14101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 1411d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // template<typename T> 1412d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // struct X { 1413d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // template<typename U> void f(T, U); 1414d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // }; 1415d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // 1416d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // X<int> x; 1417d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // 1418d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // We are instantiating the member template "f" within X<int>, which means 1419d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // substituting int for T, but leaving "f" as a member function template. 1420d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // Build the function template itself. 1421d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor FunctionTemplate = FunctionTemplateDecl::Create(SemaRef.Context, Record, 1422d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor Method->getLocation(), 14231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Method->getDeclName(), 1424d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor TemplateParams, Method); 1425b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (isFriend) { 1426b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall FunctionTemplate->setLexicalDeclContext(Owner); 1427b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall FunctionTemplate->setObjectOfFriendDecl(true); 1428b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } else if (D->isOutOfLine()) 14291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FunctionTemplate->setLexicalDeclContext(D->getLexicalDeclContext()); 1430d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor Method->setDescribedFunctionTemplate(FunctionTemplate); 143166724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor } else if (FunctionTemplate) { 143266724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor // Record this function template specialization. 1433a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi std::pair<const TemplateArgument *, unsigned> Innermost 143424bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor = TemplateArgs.getInnermost(); 1435838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor Method->setFunctionTemplateSpecialization(FunctionTemplate, 1436910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgumentList::CreateCopy(SemaRef.Context, 1437910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Innermost.first, 1438910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Innermost.second), 143966724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor InsertPos); 1440b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } else if (!isFriend) { 144166724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor // Record that this is an instantiation of a member function. 14422db323294ac02296125e1e0beb4c3595992e75bbDouglas Gregor Method->setInstantiationOfMemberFunction(D, TSK_ImplicitInstantiation); 144366724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor } 1444a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 14451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If we are instantiating a member function defined 14467caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // out-of-line, the instantiation will have the same lexical 14477caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // context (which will be a namespace scope) as the template. 1448b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (isFriend) { 14494eab39f0745fb1949dbb40c4145771b927888242John McCall if (NumTempParamLists) 14504eab39f0745fb1949dbb40c4145771b927888242John McCall Method->setTemplateParameterListsInfo(SemaRef.Context, 14514eab39f0745fb1949dbb40c4145771b927888242John McCall NumTempParamLists, 14524eab39f0745fb1949dbb40c4145771b927888242John McCall TempParamLists.data()); 14534eab39f0745fb1949dbb40c4145771b927888242John McCall 1454b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall Method->setLexicalDeclContext(Owner); 1455b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall Method->setObjectOfFriendDecl(true); 1456b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } else if (D->isOutOfLine()) 14577caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor Method->setLexicalDeclContext(D->getLexicalDeclContext()); 14581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14595545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // Attach the parameters 14605545e166a956a20d7a6b58408e251a1119025485Douglas Gregor for (unsigned P = 0; P < Params.size(); ++P) 14615545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Params[P]->setOwningFunction(Method); 14624278c654b645402554eb52a48e9c7097c9f1233aDavid Blaikie Method->setParams(Params); 14635545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 14645545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (InitMethodInstantiation(Method, D)) 14655545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Method->setInvalidDecl(); 14662dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 14672577743c5650c646fb705df01403707e94f2df04Abramo Bagnara LookupResult Previous(SemaRef, NameInfo, Sema::LookupOrdinaryName, 14682577743c5650c646fb705df01403707e94f2df04Abramo Bagnara Sema::ForRedeclaration); 14691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1470b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (!FunctionTemplate || TemplateParams || isFriend) { 1471b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall SemaRef.LookupQualifiedName(Previous, Record); 14721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1473dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor // In C++, the previous declaration we find might be a tag type 1474dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor // (class or enum). In this case, the new declaration will hide the 1475dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor // tag type. Note that this does does not apply if we're declaring a 1476dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor // typedef (C++ [dcl.typedef]p4). 14776826314938f8510cd1a6b03b5d032592456ae27bJohn McCall if (Previous.isSingleTagDecl()) 14786826314938f8510cd1a6b03b5d032592456ae27bJohn McCall Previous.clear(); 1479dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor } 14802dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 1481af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet if (!IsClassScopeSpecialization) 14822c712f50cd56eaf3662989b556e9c6b1e8fcd11aKaelyn Uhrain SemaRef.CheckFunctionDeclaration(0, Method, Previous, false); 148365ec1fda479688d143fe2403242cd9c730c800a1Douglas Gregor 14844ba3136b3eb9740a07bd61d0ab23ce9a8d894deeDouglas Gregor if (D->isPure()) 14854ba3136b3eb9740a07bd61d0ab23ce9a8d894deeDouglas Gregor SemaRef.CheckPureMethod(Method, SourceRange()); 14864ba3136b3eb9740a07bd61d0ab23ce9a8d894deeDouglas Gregor 148746460a68f6508775e98c19b4bb8454bb471aac24John McCall Method->setAccess(D->getAccess()); 148846460a68f6508775e98c19b4bb8454bb471aac24John McCall 14899eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlsson SemaRef.CheckOverrideControl(Method); 14909eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlsson 14913bc451593fa44bfc45753e44e37cb4242e714f82Eli Friedman // If a function is defined as defaulted or deleted, mark it as such now. 14923bc451593fa44bfc45753e44e37cb4242e714f82Eli Friedman if (D->isDefaulted()) 14933bc451593fa44bfc45753e44e37cb4242e714f82Eli Friedman Method->setDefaulted(); 14943bc451593fa44bfc45753e44e37cb4242e714f82Eli Friedman if (D->isDeletedAsWritten()) 14953bc451593fa44bfc45753e44e37cb4242e714f82Eli Friedman Method->setDeletedAsWritten(); 14963bc451593fa44bfc45753e44e37cb4242e714f82Eli Friedman 1497b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (FunctionTemplate) { 1498b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall // If there's a function template, let our caller handle it. 1499b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } else if (Method->isInvalidDecl() && !Previous.empty()) { 1500b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall // Don't hide a (potentially) valid declaration with an invalid one. 1501b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } else { 1502b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall NamedDecl *DeclToAdd = (TemplateParams 1503b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall ? cast<NamedDecl>(FunctionTemplate) 1504b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall : Method); 1505b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (isFriend) 1506b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall Record->makeDeclVisibleInContext(DeclToAdd); 1507af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet else if (!IsClassScopeSpecialization) 1508b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall Owner->addDecl(DeclToAdd); 1509b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } 1510eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt 1511eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt if (D->isExplicitlyDefaulted()) { 1512eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt SemaRef.SetDeclDefaulted(Method, Method->getLocation()); 1513eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt } else { 1514eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt assert(!D->isDefaulted() && 1515eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt "should not implicitly default uninstantiated function"); 1516eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt } 1517eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt 15182dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return Method; 15192dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor} 15202dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 1521615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 1522dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor return VisitCXXMethodDecl(D); 1523615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor} 1524615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 152503b2b07aaef3a585aec13048a33356c7f635de72Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 152617e32f30e2d1eaf6639d3d4e2196a8d7c709fbacDouglas Gregor return VisitCXXMethodDecl(D); 152703b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor} 152803b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor 1529bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXConversionDecl(CXXConversionDecl *D) { 153065ec1fda479688d143fe2403242cd9c730c800a1Douglas Gregor return VisitCXXMethodDecl(D); 1531bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor} 1532bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor 15336477b69cc93e0a0ff15036d60d604f3544da0f29Douglas GregorParmVarDecl *TemplateDeclInstantiator::VisitParmVarDecl(ParmVarDecl *D) { 1534fb44de956f27875def889482b5393475060392afJohn McCall return SemaRef.SubstParmVarDecl(D, TemplateArgs, /*indexAdjustment*/ 0, 1535d1bb4ae6cbc0f8bea4b329e040f58b18c03388e7Douglas Gregor llvm::Optional<unsigned>(), 1536d1bb4ae6cbc0f8bea4b329e040f58b18c03388e7Douglas Gregor /*ExpectParameterPack=*/false); 15372dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor} 15382dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 1539e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCallDecl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl( 1540e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall TemplateTypeParmDecl *D) { 1541e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall // TODO: don't always clone when decls are refcounted. 15424fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth assert(D->getTypeForDecl()->isTemplateTypeParmType()); 15431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1544e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall TemplateTypeParmDecl *Inst = 1545344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara TemplateTypeParmDecl::Create(SemaRef.Context, Owner, 1546344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara D->getLocStart(), D->getLocation(), 15474fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth D->getDepth() - TemplateArgs.getNumLevels(), 15484fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth D->getIndex(), D->getIdentifier(), 1549e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall D->wasDeclaredWithTypename(), 1550e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall D->isParameterPack()); 15519a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor Inst->setAccess(AS_public); 1552a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 15530f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor if (D->hasDefaultArgument()) 1554a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Inst->setDefaultArgument(D->getDefaultArgumentInfo(), false); 1555e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 1556a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi // Introduce this template parameter's instantiation into the instantiation 1557550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // scope. 1558550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Inst); 1559a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 1560e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall return Inst; 1561e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall} 1562e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 156333642df30088f2ddb0b22c609523ab8df9dff595Douglas GregorDecl *TemplateDeclInstantiator::VisitNonTypeTemplateParmDecl( 156433642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor NonTypeTemplateParmDecl *D) { 156533642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor // Substitute into the type of the non-type template parameter. 15666952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeLoc TL = D->getTypeSourceInfo()->getTypeLoc(); 15675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TypeSourceInfo *, 4> ExpandedParameterPackTypesAsWritten; 15685f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 4> ExpandedParameterPackTypes; 15696952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor bool IsExpandedParameterPack = false; 1570a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi TypeSourceInfo *DI; 157133642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor QualType T; 157233642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor bool Invalid = false; 15736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 15746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (D->isExpandedParameterPack()) { 1575a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi // The non-type template parameter pack is an already-expanded pack 15766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // expansion of types. Substitute into each of the expanded types. 15776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypes.reserve(D->getNumExpansionTypes()); 15786952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypesAsWritten.reserve(D->getNumExpansionTypes()); 15796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) { 15806952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *NewDI =SemaRef.SubstType(D->getExpansionTypeSourceInfo(I), 15816952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TemplateArgs, 1582a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi D->getLocation(), 15836952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getDeclName()); 15846952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (!NewDI) 15856952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 1586a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 15876952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypesAsWritten.push_back(NewDI); 15886952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor QualType NewT =SemaRef.CheckNonTypeTemplateParameterType(NewDI->getType(), 15896952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getLocation()); 15906952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NewT.isNull()) 15916952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 15926952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypes.push_back(NewT); 15936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 1594a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 15956952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor IsExpandedParameterPack = true; 15966952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor DI = D->getTypeSourceInfo(); 15976952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T = DI->getType(); 15986952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else if (isa<PackExpansionTypeLoc>(TL)) { 15996952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // The non-type template parameter pack's type is a pack expansion of types. 16006952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // Determine whether we need to expand this parameter pack into separate 16016952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // types. 16026952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor PackExpansionTypeLoc Expansion = cast<PackExpansionTypeLoc>(TL); 16036952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeLoc Pattern = Expansion.getPatternLoc(); 16045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<UnexpandedParameterPack, 2> Unexpanded; 16056952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 1606a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 16076952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // Determine whether the set of unexpanded parameter packs can and should 16086952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // be expanded. 16096952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor bool Expand = true; 16106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor bool RetainExpansion = false; 16116952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor llvm::Optional<unsigned> OrigNumExpansions 16126952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor = Expansion.getTypePtr()->getNumExpansions(); 16136952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor llvm::Optional<unsigned> NumExpansions = OrigNumExpansions; 16146952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (SemaRef.CheckParameterPacksForExpansion(Expansion.getEllipsisLoc(), 16156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Pattern.getSourceRange(), 1616a71f9d0a5e1f8cafdd23a17e292de22fdc8e99ffDavid Blaikie Unexpanded, 16176952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TemplateArgs, 1618a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Expand, RetainExpansion, 16196952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumExpansions)) 16206952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 1621a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 16226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (Expand) { 16236952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0; I != *NumExpansions; ++I) { 16246952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 16256952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *NewDI = SemaRef.SubstType(Pattern, TemplateArgs, 1626a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi D->getLocation(), 16276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getDeclName()); 16286952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (!NewDI) 16296952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 1630a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 16316952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypesAsWritten.push_back(NewDI); 16326952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor QualType NewT = SemaRef.CheckNonTypeTemplateParameterType( 16336952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NewDI->getType(), 16346952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getLocation()); 16356952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NewT.isNull()) 16366952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 16376952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypes.push_back(NewT); 16386952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 1639a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 16406952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // Note that we have an expanded parameter pack. The "type" of this 16416952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // expanded parameter pack is the original expansion type, but callers 16426952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // will end up using the expanded parameter pack types for type-checking. 16436952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor IsExpandedParameterPack = true; 16446952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor DI = D->getTypeSourceInfo(); 16456952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T = DI->getType(); 16466952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else { 16476952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // We cannot fully expand the pack expansion now, so substitute into the 16486952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // pattern and create a new pack expansion type. 16496952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, -1); 16506952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *NewPattern = SemaRef.SubstType(Pattern, TemplateArgs, 1651a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi D->getLocation(), 16526952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getDeclName()); 16536952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (!NewPattern) 16546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 1655a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 16566952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor DI = SemaRef.CheckPackExpansion(NewPattern, Expansion.getEllipsisLoc(), 16576952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumExpansions); 16586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (!DI) 16596952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 1660a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 16616952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T = DI->getType(); 16626952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 16636952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else { 16646952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // Simple case: substitution into a parameter that is not a parameter pack. 1665a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi DI = SemaRef.SubstType(D->getTypeSourceInfo(), TemplateArgs, 16666952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getLocation(), D->getDeclName()); 16676952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (!DI) 16686952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 1669a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 16706952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // Check that this type is acceptable for a non-type template parameter. 1671a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi T = SemaRef.CheckNonTypeTemplateParameterType(DI->getType(), 16726952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getLocation()); 16736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (T.isNull()) { 16746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T = SemaRef.Context.IntTy; 16756952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Invalid = true; 16766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 167733642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor } 1678a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 16796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NonTypeTemplateParmDecl *Param; 16806952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (IsExpandedParameterPack) 1681a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Param = NonTypeTemplateParmDecl::Create(SemaRef.Context, Owner, 1682ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 1683ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getLocation(), 1684a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi D->getDepth() - TemplateArgs.getNumLevels(), 1685a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi D->getPosition(), 16866952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getIdentifier(), T, 16876952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor DI, 16886952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypes.data(), 16896952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypes.size(), 16906952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypesAsWritten.data()); 16916952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor else 1692a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Param = NonTypeTemplateParmDecl::Create(SemaRef.Context, Owner, 1693ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 16946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getLocation(), 1695a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi D->getDepth() - TemplateArgs.getNumLevels(), 1696a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi D->getPosition(), 1697a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi D->getIdentifier(), T, 16986952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->isParameterPack(), DI); 1699a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 17009a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor Param->setAccess(AS_public); 170133642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor if (Invalid) 170233642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor Param->setInvalidDecl(); 1703a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 1704d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara Param->setDefaultArgument(D->getDefaultArgument(), false); 1705a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 1706a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi // Introduce this template parameter's instantiation into the instantiation 1707550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // scope. 1708550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param); 170933642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor return Param; 171033642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor} 171133642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor 17120dde18e5a713bc186062ca1ebc9967500b07faeeAnders CarlssonDecl * 17139106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas GregorTemplateDeclInstantiator::VisitTemplateTemplateParmDecl( 17149106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor TemplateTemplateParmDecl *D) { 17159106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor // Instantiate the template parameter list of the template template parameter. 17169106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor TemplateParameterList *TempParams = D->getTemplateParameters(); 17179106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor TemplateParameterList *InstParams; 17189106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor { 17199106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor // Perform the actual substitution of template parameters within a new, 17209106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor // local instantiation scope. 17212a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall LocalInstantiationScope Scope(SemaRef); 17229106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor InstParams = SubstTemplateParams(TempParams); 17239106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor if (!InstParams) 17249106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor return NULL; 1725a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi } 1726a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 17279106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor // Build the template template parameter. 17289106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor TemplateTemplateParmDecl *Param 17299106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor = TemplateTemplateParmDecl::Create(SemaRef.Context, Owner, D->getLocation(), 1730a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi D->getDepth() - TemplateArgs.getNumLevels(), 1731a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi D->getPosition(), D->isParameterPack(), 173261c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor D->getIdentifier(), InstParams); 1733d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara Param->setDefaultArgument(D->getDefaultArgument(), false); 17349a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor Param->setAccess(AS_public); 1735a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 1736a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi // Introduce this template parameter's instantiation into the instantiation 17379106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor // scope. 17389106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param); 1739a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 17409106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor return Param; 17419106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor} 17429106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor 174348c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas GregorDecl *TemplateDeclInstantiator::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { 1744db9924191092b4d426cc066637d81698211846aaDouglas Gregor // Using directives are never dependent (and never contain any types or 1745db9924191092b4d426cc066637d81698211846aaDouglas Gregor // expressions), so they require no explicit instantiation work. 1746a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 174748c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor UsingDirectiveDecl *Inst 174848c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor = UsingDirectiveDecl::Create(SemaRef.Context, Owner, D->getLocation(), 1749a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi D->getNamespaceKeyLocation(), 1750db9924191092b4d426cc066637d81698211846aaDouglas Gregor D->getQualifierLoc(), 1751a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi D->getIdentLocation(), 1752a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi D->getNominatedNamespace(), 175348c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor D->getCommonAncestor()); 175448c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor Owner->addDecl(Inst); 175548c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor return Inst; 175648c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor} 175748c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor 1758ed97649e9574b9d854fa4d6109c9333ae0993554John McCallDecl *TemplateDeclInstantiator::VisitUsingDecl(UsingDecl *D) { 17591b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor 17601b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // The nested name specifier may be dependent, for example 17611b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // template <typename T> struct t { 17621b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // struct s1 { T f1(); }; 17631b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // struct s2 : s1 { using s1::f1; }; 17641b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // }; 17651b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // template struct t<int>; 17661b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // Here, in using s1::f1, s1 refers to t<T>::s1; 17671b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // we need to substitute for t<int>::s1. 17685149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor NestedNameSpecifierLoc QualifierLoc 17695149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(), 17705149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor TemplateArgs); 17715149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor if (!QualifierLoc) 1772dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor return 0; 17731b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor 17741b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // The name info is non-dependent, so no transformation 17751b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // is required. 1776ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara DeclarationNameInfo NameInfo = D->getNameInfo(); 1777ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 17789f54ad4381370c6b771424b53d219e661d6d6706John McCall // We only need to do redeclaration lookups if we're in a class 17799f54ad4381370c6b771424b53d219e661d6d6706John McCall // scope (in fact, it's not really even possible in non-class 17809f54ad4381370c6b771424b53d219e661d6d6706John McCall // scopes). 17819f54ad4381370c6b771424b53d219e661d6d6706John McCall bool CheckRedeclaration = Owner->isRecord(); 17829f54ad4381370c6b771424b53d219e661d6d6706John McCall 1783ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara LookupResult Prev(SemaRef, NameInfo, Sema::LookupUsingDeclName, 1784ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara Sema::ForRedeclaration); 17859f54ad4381370c6b771424b53d219e661d6d6706John McCall 1786ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingDecl *NewUD = UsingDecl::Create(SemaRef.Context, Owner, 1787ed97649e9574b9d854fa4d6109c9333ae0993554John McCall D->getUsingLocation(), 17885149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor QualifierLoc, 1789ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara NameInfo, 1790ed97649e9574b9d854fa4d6109c9333ae0993554John McCall D->isTypeName()); 1791ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 17925149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor CXXScopeSpec SS; 17935149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor SS.Adopt(QualifierLoc); 17949f54ad4381370c6b771424b53d219e661d6d6706John McCall if (CheckRedeclaration) { 17959f54ad4381370c6b771424b53d219e661d6d6706John McCall Prev.setHideTags(false); 17969f54ad4381370c6b771424b53d219e661d6d6706John McCall SemaRef.LookupQualifiedName(Prev, Owner); 17979f54ad4381370c6b771424b53d219e661d6d6706John McCall 17989f54ad4381370c6b771424b53d219e661d6d6706John McCall // Check for invalid redeclarations. 17999f54ad4381370c6b771424b53d219e661d6d6706John McCall if (SemaRef.CheckUsingDeclRedeclaration(D->getUsingLocation(), 18009f54ad4381370c6b771424b53d219e661d6d6706John McCall D->isTypeName(), SS, 18019f54ad4381370c6b771424b53d219e661d6d6706John McCall D->getLocation(), Prev)) 18029f54ad4381370c6b771424b53d219e661d6d6706John McCall NewUD->setInvalidDecl(); 18039f54ad4381370c6b771424b53d219e661d6d6706John McCall 18049f54ad4381370c6b771424b53d219e661d6d6706John McCall } 18059f54ad4381370c6b771424b53d219e661d6d6706John McCall 18069f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!NewUD->isInvalidDecl() && 18079f54ad4381370c6b771424b53d219e661d6d6706John McCall SemaRef.CheckUsingDeclQualifier(D->getUsingLocation(), SS, 1808ed97649e9574b9d854fa4d6109c9333ae0993554John McCall D->getLocation())) 1809ed97649e9574b9d854fa4d6109c9333ae0993554John McCall NewUD->setInvalidDecl(); 18109f54ad4381370c6b771424b53d219e661d6d6706John McCall 1811ed97649e9574b9d854fa4d6109c9333ae0993554John McCall SemaRef.Context.setInstantiatedFromUsingDecl(NewUD, D); 1812ed97649e9574b9d854fa4d6109c9333ae0993554John McCall NewUD->setAccess(D->getAccess()); 1813ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Owner->addDecl(NewUD); 1814ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 18159f54ad4381370c6b771424b53d219e661d6d6706John McCall // Don't process the shadow decls for an invalid decl. 18169f54ad4381370c6b771424b53d219e661d6d6706John McCall if (NewUD->isInvalidDecl()) 18179f54ad4381370c6b771424b53d219e661d6d6706John McCall return NewUD; 18189f54ad4381370c6b771424b53d219e661d6d6706John McCall 1819323c310efa0abd7a786b0303501186b5f33eb8d7John McCall bool isFunctionScope = Owner->isFunctionOrMethod(); 1820323c310efa0abd7a786b0303501186b5f33eb8d7John McCall 18219f54ad4381370c6b771424b53d219e661d6d6706John McCall // Process the shadow decls. 18229f54ad4381370c6b771424b53d219e661d6d6706John McCall for (UsingDecl::shadow_iterator I = D->shadow_begin(), E = D->shadow_end(); 18239f54ad4381370c6b771424b53d219e661d6d6706John McCall I != E; ++I) { 18249f54ad4381370c6b771424b53d219e661d6d6706John McCall UsingShadowDecl *Shadow = *I; 18259f54ad4381370c6b771424b53d219e661d6d6706John McCall NamedDecl *InstTarget = 1826b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor cast_or_null<NamedDecl>(SemaRef.FindInstantiatedDecl( 1827b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor Shadow->getLocation(), 1828b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor Shadow->getTargetDecl(), 1829b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor TemplateArgs)); 1830b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor if (!InstTarget) 1831b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor return 0; 18329f54ad4381370c6b771424b53d219e661d6d6706John McCall 18339f54ad4381370c6b771424b53d219e661d6d6706John McCall if (CheckRedeclaration && 18349f54ad4381370c6b771424b53d219e661d6d6706John McCall SemaRef.CheckUsingShadowDecl(NewUD, InstTarget, Prev)) 18359f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 18369f54ad4381370c6b771424b53d219e661d6d6706John McCall 18379f54ad4381370c6b771424b53d219e661d6d6706John McCall UsingShadowDecl *InstShadow 18389f54ad4381370c6b771424b53d219e661d6d6706John McCall = SemaRef.BuildUsingShadowDecl(/*Scope*/ 0, NewUD, InstTarget); 18399f54ad4381370c6b771424b53d219e661d6d6706John McCall SemaRef.Context.setInstantiatedFromUsingShadowDecl(InstShadow, Shadow); 1840323c310efa0abd7a786b0303501186b5f33eb8d7John McCall 1841323c310efa0abd7a786b0303501186b5f33eb8d7John McCall if (isFunctionScope) 1842323c310efa0abd7a786b0303501186b5f33eb8d7John McCall SemaRef.CurrentInstantiationScope->InstantiatedLocal(Shadow, InstShadow); 18439f54ad4381370c6b771424b53d219e661d6d6706John McCall } 1844ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 1845ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return NewUD; 1846ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 1847ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 1848ed97649e9574b9d854fa4d6109c9333ae0993554John McCallDecl *TemplateDeclInstantiator::VisitUsingShadowDecl(UsingShadowDecl *D) { 18499f54ad4381370c6b771424b53d219e661d6d6706John McCall // Ignore these; we handle them in bulk when processing the UsingDecl. 18509f54ad4381370c6b771424b53d219e661d6d6706John McCall return 0; 1851ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 1852ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 18537ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallDecl * TemplateDeclInstantiator 18547ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall ::VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D) { 18555149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor NestedNameSpecifierLoc QualifierLoc 1856a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(), 18575149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor TemplateArgs); 18585149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor if (!QualifierLoc) 18597ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall return 0; 18607ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall 18617ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall CXXScopeSpec SS; 18625149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor SS.Adopt(QualifierLoc); 18637ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall 1864ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara // Since NameInfo refers to a typename, it cannot be a C++ special name. 1865ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara // Hence, no tranformation is required for it. 1866ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara DeclarationNameInfo NameInfo(D->getDeclName(), D->getLocation()); 18677ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall NamedDecl *UD = 18687ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall SemaRef.BuildUsingDeclaration(/*Scope*/ 0, D->getAccess(), 1869ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara D->getUsingLoc(), SS, NameInfo, 0, 18707ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall /*instantiation*/ true, 18717ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall /*typename*/ true, D->getTypenameLoc()); 18724469e8a97cdca3725b4f8f366916143113c029acDouglas Gregor if (UD) 1873ed97649e9574b9d854fa4d6109c9333ae0993554John McCall SemaRef.Context.setInstantiatedFromUsingDecl(cast<UsingDecl>(UD), D); 1874ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 18757ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall return UD; 18767ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall} 18777ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall 18787ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallDecl * TemplateDeclInstantiator 18797ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall ::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) { 18805149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor NestedNameSpecifierLoc QualifierLoc 18815149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(), TemplateArgs); 18825149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor if (!QualifierLoc) 18830dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson return 0; 1884a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 18850dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson CXXScopeSpec SS; 18865149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor SS.Adopt(QualifierLoc); 18871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1888ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara DeclarationNameInfo NameInfo 1889ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara = SemaRef.SubstDeclarationNameInfo(D->getNameInfo(), TemplateArgs); 1890ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara 18911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *UD = 18929488ea120e093068021f944176c3d610dd540914John McCall SemaRef.BuildUsingDeclaration(/*Scope*/ 0, D->getAccess(), 1893ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara D->getUsingLoc(), SS, NameInfo, 0, 18947ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall /*instantiation*/ true, 18957ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall /*typename*/ false, SourceLocation()); 18964469e8a97cdca3725b4f8f366916143113c029acDouglas Gregor if (UD) 1897ed97649e9574b9d854fa4d6109c9333ae0993554John McCall SemaRef.Context.setInstantiatedFromUsingDecl(cast<UsingDecl>(UD), D); 1898ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 18990d8df780aef1acda5962347a32591efc629b6748Anders Carlsson return UD; 19000dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson} 19010dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson 1902af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 1903af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois PichetDecl *TemplateDeclInstantiator::VisitClassScopeFunctionSpecializationDecl( 1904af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet ClassScopeFunctionSpecializationDecl *Decl) { 1905af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet CXXMethodDecl *OldFD = Decl->getSpecialization(); 1906af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet CXXMethodDecl *NewFD = cast<CXXMethodDecl>(VisitCXXMethodDecl(OldFD, 0, true)); 1907af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 1908af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet LookupResult Previous(SemaRef, NewFD->getNameInfo(), Sema::LookupOrdinaryName, 1909af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet Sema::ForRedeclaration); 1910af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 1911af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet SemaRef.LookupQualifiedName(Previous, SemaRef.CurContext); 1912af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet if (SemaRef.CheckFunctionTemplateSpecialization(NewFD, 0, Previous)) { 1913af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet NewFD->setInvalidDecl(); 1914af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet return NewFD; 1915af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet } 1916af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 1917af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet // Associate the specialization with the pattern. 1918af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet FunctionDecl *Specialization = cast<FunctionDecl>(Previous.getFoundDecl()); 1919af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet assert(Specialization && "Class scope Specialization is null"); 1920af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet SemaRef.Context.setClassScopeSpecializationPattern(Specialization, OldFD); 1921af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 1922af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet return NewFD; 1923af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet} 1924af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 1925ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCallDecl *Sema::SubstDecl(Decl *D, DeclContext *Owner, 1926d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor const MultiLevelTemplateArgumentList &TemplateArgs) { 19277e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor TemplateDeclInstantiator Instantiator(*this, Owner, TemplateArgs); 19282fa98001f832836e3f652c211a9d2f80501d659aDouglas Gregor if (D->isInvalidDecl()) 19292fa98001f832836e3f652c211a9d2f80501d659aDouglas Gregor return 0; 19302fa98001f832836e3f652c211a9d2f80501d659aDouglas Gregor 19318dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Instantiator.Visit(D); 19328dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 19338dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1934e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall/// \brief Instantiates a nested template parameter list in the current 1935e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall/// instantiation context. 1936e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall/// 1937e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall/// \param L The parameter list to instantiate 1938e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall/// 1939e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall/// \returns NULL if there was an error 1940e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCallTemplateParameterList * 1941ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCallTemplateDeclInstantiator::SubstTemplateParams(TemplateParameterList *L) { 1942e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall // Get errors for all the parameters before bailing out. 1943e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall bool Invalid = false; 1944e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 1945e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall unsigned N = L->size(); 19465f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner typedef SmallVector<NamedDecl *, 8> ParamVector; 1947e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall ParamVector Params; 1948e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall Params.reserve(N); 1949e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall for (TemplateParameterList::iterator PI = L->begin(), PE = L->end(); 1950e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall PI != PE; ++PI) { 1951bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor NamedDecl *D = cast_or_null<NamedDecl>(Visit(*PI)); 1952e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall Params.push_back(D); 19539148c3f5829f4d031249faeb1043e7be914539e8Douglas Gregor Invalid = Invalid || !D || D->isInvalidDecl(); 1954e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall } 1955e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 1956e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall // Clean up if we had an error. 1957ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor if (Invalid) 1958e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall return NULL; 1959e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 1960e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall TemplateParameterList *InstL 1961e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall = TemplateParameterList::Create(SemaRef.Context, L->getTemplateLoc(), 1962e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall L->getLAngleLoc(), &Params.front(), N, 1963e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall L->getRAngleLoc()); 1964e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall return InstL; 19651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 1966e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 1967a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi/// \brief Instantiate the declaration of a class template partial 1968ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor/// specialization. 1969ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor/// 1970ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor/// \param ClassTemplate the (instantiated) class template that is partially 1971ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor// specialized by the instantiation of \p PartialSpec. 1972ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor/// 1973a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi/// \param PartialSpec the (uninstantiated) class template partial 1974ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor/// specialization that we are instantiating. 1975ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor/// 1976d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor/// \returns The instantiated partial specialization, if successful; otherwise, 1977d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor/// NULL to indicate an error. 1978d65587f7a6d38965fa37158d3f57990a7faf3836Douglas GregorClassTemplatePartialSpecializationDecl * 1979ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas GregorTemplateDeclInstantiator::InstantiateClassTemplatePartialSpecialization( 1980ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor ClassTemplateDecl *ClassTemplate, 1981ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor ClassTemplatePartialSpecializationDecl *PartialSpec) { 1982550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // Create a local instantiation scope for this class template partial 1983550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // specialization, which will contain the instantiations of the template 1984550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // parameters. 19852a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall LocalInstantiationScope Scope(SemaRef); 1986a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 1987ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Substitute into the template parameters of the class template partial 1988ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // specialization. 1989ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor TemplateParameterList *TempParams = PartialSpec->getTemplateParameters(); 1990ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor TemplateParameterList *InstParams = SubstTemplateParams(TempParams); 1991ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (!InstParams) 1992d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor return 0; 1993a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 1994ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Substitute into the template arguments of the class template partial 1995ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // specialization. 1996d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo InstTemplateArgs; // no angle locations 1997a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi if (SemaRef.Subst(PartialSpec->getTemplateArgsAsWritten(), 1998a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi PartialSpec->getNumTemplateArgsAsWritten(), 1999e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor InstTemplateArgs, TemplateArgs)) 2000e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor return 0; 2001a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2002ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Check that the template argument list is well-formed for this 2003ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // class template. 20045f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 4> Converted; 2005a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi if (SemaRef.CheckTemplateArgumentList(ClassTemplate, 2006ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor PartialSpec->getLocation(), 2007a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi InstTemplateArgs, 2008ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor false, 2009ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor Converted)) 2010d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor return 0; 2011ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 2012ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Figure out where to insert this class template partial specialization 2013ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // in the member template's set of class template partial specializations. 2014ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor void *InsertPos = 0; 2015ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor ClassTemplateSpecializationDecl *PrevDecl 2016910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = ClassTemplate->findPartialSpecialization(Converted.data(), 2017910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Converted.size(), InsertPos); 2018a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2019ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Build the canonical type that describes the converted template 2020ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // arguments of the class template partial specialization. 2021a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi QualType CanonType 2022ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = SemaRef.Context.getTemplateSpecializationType(TemplateName(ClassTemplate), 2023910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Converted.data(), 2024910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Converted.size()); 2025ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 2026ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Build the fully-sugared type for this class template 2027ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // specialization as the user wrote in the specialization 2028ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // itself. This means that we'll pretty-print the type retrieved 2029ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // from the specialization's declaration the way that the user 2030ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // actually wrote the specialization, rather than formatting the 2031ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // name based on the "canonical" representation used to store the 2032ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // template arguments in the specialization. 20333cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TypeSourceInfo *WrittenTy 20343cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall = SemaRef.Context.getTemplateSpecializationTypeInfo( 20353cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TemplateName(ClassTemplate), 20363cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall PartialSpec->getLocation(), 2037d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall InstTemplateArgs, 2038ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor CanonType); 2039a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2040ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (PrevDecl) { 2041ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // We've already seen a partial specialization with the same template 2042ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // parameters and template arguments. This can happen, for example, when 2043ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // substituting the outer template arguments ends up causing two 2044ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // class template partial specializations of a member class template 2045ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // to have identical forms, e.g., 2046ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // 2047ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // template<typename T, typename U> 2048ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // struct Outer { 2049ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // template<typename X, typename Y> struct Inner; 2050ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // template<typename Y> struct Inner<T, Y>; 2051ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // template<typename Y> struct Inner<U, Y>; 2052ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // }; 2053ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // 2054ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Outer<int, int> outer; // error: the partial specializations of Inner 2055ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // // have the same signature. 2056ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor SemaRef.Diag(PartialSpec->getLocation(), diag::err_partial_spec_redeclared) 2057d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor << WrittenTy->getType(); 2058ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor SemaRef.Diag(PrevDecl->getLocation(), diag::note_prev_partial_spec_here) 2059ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor << SemaRef.Context.getTypeDeclType(PrevDecl); 2060d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor return 0; 2061ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor } 2062a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2063a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2064ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Create the class template partial specialization declaration. 2065ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor ClassTemplatePartialSpecializationDecl *InstPartialSpec 2066a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi = ClassTemplatePartialSpecializationDecl::Create(SemaRef.Context, 206713c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor PartialSpec->getTagKind(), 2068a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Owner, 2069ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara PartialSpec->getLocStart(), 2070ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara PartialSpec->getLocation(), 2071ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor InstParams, 2072a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi ClassTemplate, 2073910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Converted.data(), 2074910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Converted.size(), 2075d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall InstTemplateArgs, 20763cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall CanonType, 2077dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor 0, 2078cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplate->getNextPartialSpecSequenceNumber()); 2079b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall // Substitute the nested name specifier, if any. 2080b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall if (SubstQualifier(PartialSpec, InstPartialSpec)) 2081b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall return 0; 2082b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 2083ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor InstPartialSpec->setInstantiatedFromMember(PartialSpec); 20844469e8a97cdca3725b4f8f366916143113c029acDouglas Gregor InstPartialSpec->setTypeAsWritten(WrittenTy); 2085a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2086ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Add this partial specialization to the set of class template partial 2087ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // specializations. 2088cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplate->AddPartialSpecialization(InstPartialSpec, InsertPos); 2089d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor return InstPartialSpec; 2090ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 2091ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 209221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTypeSourceInfo* 209321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTemplateDeclInstantiator::SubstFunctionType(FunctionDecl *D, 20945f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<ParmVarDecl *> &Params) { 209521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall TypeSourceInfo *OldTInfo = D->getTypeSourceInfo(); 209621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall assert(OldTInfo && "substituting function without type source info"); 209721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall assert(Params.empty() && "parameter vector is non-empty at start"); 20986cd3b9fb8a29bb70fff01719bdde238723d67c10John McCall TypeSourceInfo *NewTInfo 20996cd3b9fb8a29bb70fff01719bdde238723d67c10John McCall = SemaRef.SubstFunctionDeclType(OldTInfo, TemplateArgs, 21006cd3b9fb8a29bb70fff01719bdde238723d67c10John McCall D->getTypeSpecStartLoc(), 21016cd3b9fb8a29bb70fff01719bdde238723d67c10John McCall D->getDeclName()); 210221ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (!NewTInfo) 210321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return 0; 21045545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 2105cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor if (NewTInfo != OldTInfo) { 2106cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor // Get parameters from the new type info. 2107140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara TypeLoc OldTL = OldTInfo->getTypeLoc().IgnoreParens(); 21086920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor if (FunctionProtoTypeLoc *OldProtoLoc 21096920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor = dyn_cast<FunctionProtoTypeLoc>(&OldTL)) { 2110140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara TypeLoc NewTL = NewTInfo->getTypeLoc().IgnoreParens(); 21116920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor FunctionProtoTypeLoc *NewProtoLoc = cast<FunctionProtoTypeLoc>(&NewTL); 21126920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor assert(NewProtoLoc && "Missing prototype?"); 211312c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor unsigned NewIdx = 0, NumNewParams = NewProtoLoc->getNumArgs(); 211412c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor for (unsigned OldIdx = 0, NumOldParams = OldProtoLoc->getNumArgs(); 211512c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor OldIdx != NumOldParams; ++OldIdx) { 211612c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor ParmVarDecl *OldParam = OldProtoLoc->getArg(OldIdx); 211712c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor if (!OldParam->isParameterPack() || 211812c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor (NewIdx < NumNewParams && 211912c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor NewProtoLoc->getArg(NewIdx)->isParameterPack())) { 2120a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi // Simple case: normal parameter, or a parameter pack that's 212112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor // instantiated to a (still-dependent) parameter pack. 212212c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor ParmVarDecl *NewParam = NewProtoLoc->getArg(NewIdx++); 212312c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor Params.push_back(NewParam); 212412c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(OldParam, 212512c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor NewParam); 212612c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor continue; 212712c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor } 2128a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 212912c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor // Parameter pack: make the instantiation an argument pack. 213012c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor SemaRef.CurrentInstantiationScope->MakeInstantiatedLocalArgPack( 213112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor OldParam); 213221371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor unsigned NumArgumentsInExpansion 213321371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor = SemaRef.getNumArgumentsInExpansion(OldParam->getType(), 213421371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor TemplateArgs); 213521371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor while (NumArgumentsInExpansion--) { 213612c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor ParmVarDecl *NewParam = NewProtoLoc->getArg(NewIdx++); 213712c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor Params.push_back(NewParam); 213812c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocalPackArg(OldParam, 213912c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor NewParam); 214012c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor } 21416920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor } 2142895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor } 2143cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor } else { 2144cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor // The function type itself was not dependent and therefore no 2145cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor // substitution occurred. However, we still need to instantiate 2146cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor // the function parameters themselves. 2147140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara TypeLoc OldTL = OldTInfo->getTypeLoc().IgnoreParens(); 21486920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor if (FunctionProtoTypeLoc *OldProtoLoc 21496920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor = dyn_cast<FunctionProtoTypeLoc>(&OldTL)) { 21506920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor for (unsigned i = 0, i_end = OldProtoLoc->getNumArgs(); i != i_end; ++i) { 21516920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor ParmVarDecl *Parm = VisitParmVarDecl(OldProtoLoc->getArg(i)); 21526920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor if (!Parm) 21536920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor return 0; 21546920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor Params.push_back(Parm); 21556920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor } 2156cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor } 2157cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor } 215821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return NewTInfo; 21595545e166a956a20d7a6b58408e251a1119025485Douglas Gregor} 21605545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 21611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Initializes the common fields of an instantiation function 2162e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor/// declaration (New) from the corresponding fields of its template (Tmpl). 2163e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor/// 2164e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor/// \returns true if there was an error 21651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool 21661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateDeclInstantiator::InitFunctionInstantiation(FunctionDecl *New, 2167e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor FunctionDecl *Tmpl) { 216810620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt if (Tmpl->isDeletedAsWritten()) 216910620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt New->setDeletedAsWritten(); 21701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2171cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor // If we are performing substituting explicitly-specified template arguments 2172cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor // or deduced template arguments into a function template and we reach this 2173cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor // point, we are now past the point where SFINAE applies and have committed 21741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // to keeping the new function template specialization. We therefore 21751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // convert the active template instantiation for the function template 2176cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor // into a template instantiation for this specific function template 2177cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor // specialization, which is not a SFINAE context, so that we diagnose any 2178cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor // further errors in the declaration itself. 2179cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor typedef Sema::ActiveTemplateInstantiation ActiveInstType; 2180cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor ActiveInstType &ActiveInst = SemaRef.ActiveTemplateInstantiations.back(); 2181cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor if (ActiveInst.Kind == ActiveInstType::ExplicitTemplateArgumentSubstitution || 2182cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor ActiveInst.Kind == ActiveInstType::DeducedTemplateArgumentSubstitution) { 21831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (FunctionTemplateDecl *FunTmpl 2184cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor = dyn_cast<FunctionTemplateDecl>((Decl *)ActiveInst.Entity)) { 21851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(FunTmpl->getTemplatedDecl() == Tmpl && 2186cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor "Deduction from the wrong function template?"); 2187bcbb8bd3326a86aa70b7df386ae3c86c9ad255c5Daniel Dunbar (void) FunTmpl; 2188cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor ActiveInst.Kind = ActiveInstType::TemplateInstantiation; 2189cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor ActiveInst.Entity = reinterpret_cast<uintptr_t>(New); 2190f35f828f9883123772a9731af190a608f3236ef4Douglas Gregor --SemaRef.NonInstantiationEntries; 2191cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor } 2192cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor } 21931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21940ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor const FunctionProtoType *Proto = Tmpl->getType()->getAs<FunctionProtoType>(); 21950ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor assert(Proto && "Function template without prototype?"); 21960ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor 219760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (Proto->hasExceptionSpec() || Proto->getNoReturnAttr()) { 21980ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor // The function has an exception specification or a "noreturn" 21990ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor // attribute. Substitute into each of the exception types. 22005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 4> Exceptions; 22010ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor for (unsigned I = 0, N = Proto->getNumExceptions(); I != N; ++I) { 22020ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor // FIXME: Poor location information! 2203b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor if (const PackExpansionType *PackExpansion 2204b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor = Proto->getExceptionType(I)->getAs<PackExpansionType>()) { 2205b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor // We have a pack expansion. Instantiate it. 22065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<UnexpandedParameterPack, 2> Unexpanded; 2207b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 2208b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor Unexpanded); 2209a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi assert(!Unexpanded.empty() && 2210b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor "Pack expansion without parameter packs?"); 221160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl 2212b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor bool Expand = false; 2213d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool RetainExpansion = false; 2214cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions 2215cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor = PackExpansion->getNumExpansions(); 2216a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi if (SemaRef.CheckParameterPacksForExpansion(New->getLocation(), 2217b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor SourceRange(), 2218a71f9d0a5e1f8cafdd23a17e292de22fdc8e99ffDavid Blaikie Unexpanded, 2219b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor TemplateArgs, 2220a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Expand, 2221d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor RetainExpansion, 2222d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor NumExpansions)) 2223b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor break; 222460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl 2225b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor if (!Expand) { 2226b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor // We can't expand this pack expansion into separate arguments yet; 2227a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi // just substitute into the pattern and create a new pack expansion 2228cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor // type. 2229b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, -1); 2230a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi QualType T = SemaRef.SubstType(PackExpansion->getPattern(), 2231b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor TemplateArgs, 2232b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor New->getLocation(), New->getDeclName()); 2233b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor if (T.isNull()) 2234b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor break; 2235a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2236cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor T = SemaRef.Context.getPackExpansionType(T, NumExpansions); 2237b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor Exceptions.push_back(T); 2238b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor continue; 2239b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor } 224060618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl 2241b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor // Substitute into the pack expansion pattern for each template 2242b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor bool Invalid = false; 2243cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 2244b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, ArgIdx); 2245a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2246a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi QualType T = SemaRef.SubstType(PackExpansion->getPattern(), 2247b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor TemplateArgs, 2248b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor New->getLocation(), New->getDeclName()); 2249b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor if (T.isNull()) { 2250b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor Invalid = true; 2251b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor break; 2252b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor } 225360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl 2254b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor Exceptions.push_back(T); 2255b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor } 225660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl 2257b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor if (Invalid) 2258b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor break; 225960618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl 2260b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor continue; 2261b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor } 2262a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 22630ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor QualType T 22640ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor = SemaRef.SubstType(Proto->getExceptionType(I), TemplateArgs, 22650ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor New->getLocation(), New->getDeclName()); 2266a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi if (T.isNull() || 22670ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor SemaRef.CheckSpecifiedExceptionType(T, New->getLocation())) 22680ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor continue; 22690ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor 22700ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor Exceptions.push_back(T); 22710ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor } 227256fb926c93786739cfd0867e7ada31ace3bda946Sebastian Redl Expr *NoexceptExpr = 0; 227356fb926c93786739cfd0867e7ada31ace3bda946Sebastian Redl if (Expr *OldNoexceptExpr = Proto->getNoexceptExpr()) { 2274f6702a3927147655206ae729a84339c4fda4c651Richard Smith EnterExpressionEvaluationContext Unevaluated(SemaRef, 2275f6702a3927147655206ae729a84339c4fda4c651Richard Smith Sema::ConstantEvaluated); 227656fb926c93786739cfd0867e7ada31ace3bda946Sebastian Redl ExprResult E = SemaRef.SubstExpr(OldNoexceptExpr, TemplateArgs); 227756fb926c93786739cfd0867e7ada31ace3bda946Sebastian Redl if (E.isUsable()) 22785c340e803ed2e384ff47f3e560df253515c92e1eDouglas Gregor E = SemaRef.CheckBooleanCondition(E.get(), E.get()->getLocStart()); 2279f6702a3927147655206ae729a84339c4fda4c651Richard Smith 22805c340e803ed2e384ff47f3e560df253515c92e1eDouglas Gregor if (E.isUsable()) { 228156fb926c93786739cfd0867e7ada31ace3bda946Sebastian Redl NoexceptExpr = E.take(); 22825c340e803ed2e384ff47f3e560df253515c92e1eDouglas Gregor if (!NoexceptExpr->isTypeDependent() && 2283282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith !NoexceptExpr->isValueDependent()) 2284282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith NoexceptExpr = SemaRef.VerifyIntegerConstantExpression(NoexceptExpr, 2285282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith 0, SemaRef.PDiag(diag::err_noexcept_needs_constant_expression), 2286282e7e66748cc6dd14d6f7f2cb52e5373c531e61Richard Smith /*AllowFold*/ false).take(); 22875c340e803ed2e384ff47f3e560df253515c92e1eDouglas Gregor } 228856fb926c93786739cfd0867e7ada31ace3bda946Sebastian Redl } 22890ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor 2290a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi // Rebuild the function type 22910ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor 2292e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI = Proto->getExtProtoInfo(); 229360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl EPI.ExceptionSpecType = Proto->getExceptionSpecType(); 2294e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.NumExceptions = Exceptions.size(); 2295e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.Exceptions = Exceptions.data(); 229656fb926c93786739cfd0867e7ada31ace3bda946Sebastian Redl EPI.NoexceptExpr = NoexceptExpr; 2297e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.ExtInfo = Proto->getExtInfo(); 2298e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 22990ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor const FunctionProtoType *NewProto 23000ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor = New->getType()->getAs<FunctionProtoType>(); 23010ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor assert(NewProto && "Template instantiation without function prototype?"); 23020ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor New->setType(SemaRef.Context.getFunctionType(NewProto->getResultType(), 23030ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor NewProto->arg_type_begin(), 23040ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor NewProto->getNumArgs(), 2305e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI)); 23060ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor } 23070ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor 230819f74acdf8842ceece578b7307884f5ba22d7f59Rafael Espindola const FunctionDecl* Definition = Tmpl; 230919f74acdf8842ceece578b7307884f5ba22d7f59Rafael Espindola 231019f74acdf8842ceece578b7307884f5ba22d7f59Rafael Espindola // Get the definition. Leaves the variable unchanged if undefined. 231119f74acdf8842ceece578b7307884f5ba22d7f59Rafael Espindola Tmpl->isDefined(Definition); 231219f74acdf8842ceece578b7307884f5ba22d7f59Rafael Espindola 231323323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins SemaRef.InstantiateAttrs(TemplateArgs, Definition, New, 231423323e0253716ff03c95a00fb6903019daafe3aaDeLesley Hutchins LateAttrs, StartingScope); 23157cf84d66965a7706004d8590b5af5fe54b85f525Douglas Gregor 2316e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor return false; 2317e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor} 2318e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 23195545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \brief Initializes common fields of an instantiated method 23205545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// declaration (New) from the corresponding fields of its template 23215545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// (Tmpl). 23225545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// 23235545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \returns true if there was an error 23241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool 23251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateDeclInstantiator::InitMethodInstantiation(CXXMethodDecl *New, 23265545e166a956a20d7a6b58408e251a1119025485Douglas Gregor CXXMethodDecl *Tmpl) { 2327e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (InitFunctionInstantiation(New, Tmpl)) 2328e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor return true; 23291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23305545e166a956a20d7a6b58408e251a1119025485Douglas Gregor New->setAccess(Tmpl->getAccess()); 2331e7184df728bb339633d88c774b5097dd9318cc8aFariborz Jahanian if (Tmpl->isVirtualAsWritten()) 233285606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor New->setVirtualAsWritten(true); 23335545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 23345545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // FIXME: attributes 23355545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // FIXME: New needs a pointer to Tmpl 23365545e166a956a20d7a6b58408e251a1119025485Douglas Gregor return false; 23375545e166a956a20d7a6b58408e251a1119025485Douglas Gregor} 2338a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor 2339a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// \brief Instantiate the definition of the given function from its 2340a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// template. 2341a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// 2342b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// \param PointOfInstantiation the point at which the instantiation was 2343b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// required. Note that this is not precisely a "point of instantiation" 2344b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// for the function, but it's close. 2345b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// 2346a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// \param Function the already-instantiated declaration of a 2347b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// function template specialization or member function of a class template 2348b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// specialization. 2349b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// 2350b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// \param Recursive if true, recursively instantiates any functions that 2351b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// are required by this instantiation. 2352e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// 2353e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// \param DefinitionRequired if true, then we are performing an explicit 2354e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// instantiation where the body of the function is required. Complain if 2355e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// there is no such body. 2356f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregorvoid Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, 2357b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor FunctionDecl *Function, 2358e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor bool Recursive, 2359e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor bool DefinitionRequired) { 236010620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt if (Function->isInvalidDecl() || Function->isDefined()) 236154dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor return; 236254dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor 2363af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet // Never instantiate an explicit specialization except if it is a class scope 2364af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet // explicit specialization. 2365af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet if (Function->getTemplateSpecializationKind() == TSK_ExplicitSpecialization && 2366af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet !Function->getClassScopeSpecializationPattern()) 2367251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor return; 23686cfacfe54c75baa4d67f1fbdf4f80644b662818eDouglas Gregor 23691eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor // Find the function body that we'll be substituting. 23703b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor const FunctionDecl *PatternDecl = Function->getTemplateInstantiationPattern(); 2371f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt assert(PatternDecl && "instantiating a non-template"); 2372f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt 2373f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt Stmt *Pattern = PatternDecl->getBody(PatternDecl); 2374f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt assert(PatternDecl && "template definition is not a template"); 2375f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt if (!Pattern) { 2376f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt // Try to find a defaulted definition 2377f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt PatternDecl->isDefined(PatternDecl); 2378dfab854e6855dad076c0207b29859d452e398437Sean Hunt } 2379f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt assert(PatternDecl && "template definition is not a template"); 23801eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor 23818387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet // Postpone late parsed template instantiations. 2382f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt if (PatternDecl->isLateTemplateParsed() && 23838a29bc047a374df2464869b55581c24def68c2ecNick Lewycky !LateTemplateParser) { 23848387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet PendingInstantiations.push_back( 23858387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet std::make_pair(Function, PointOfInstantiation)); 23868387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet return; 23878387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet } 23888387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet 23898387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet // Call the LateTemplateParser callback if there a need to late parse 2390a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi // a templated function definition. 2391f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt if (!Pattern && PatternDecl->isLateTemplateParsed() && 23928387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet LateTemplateParser) { 23934a47e8d35dc1778ef7e428d9edd7676be67e725fFrancois Pichet LateTemplateParser(OpaqueParser, PatternDecl); 23948387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet Pattern = PatternDecl->getBody(PatternDecl); 23958387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet } 23968387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet 2397f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt if (!Pattern && !PatternDecl->isDefaulted()) { 2398e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor if (DefinitionRequired) { 2399e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor if (Function->getPrimaryTemplate()) 2400a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Diag(PointOfInstantiation, 2401e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor diag::err_explicit_instantiation_undefined_func_template) 2402e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor << Function->getPrimaryTemplate(); 2403e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor else 2404a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Diag(PointOfInstantiation, 2405e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor diag::err_explicit_instantiation_undefined_member) 2406e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor << 1 << Function->getDeclName() << Function->getDeclContext(); 2407a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2408e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor if (PatternDecl) 2409a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Diag(PatternDecl->getLocation(), 2410e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor diag::note_explicit_instantiation_here); 2411cfe833be882f600206f1587f157b025b368497d7Douglas Gregor Function->setInvalidDecl(); 241258e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth } else if (Function->getTemplateSpecializationKind() 241358e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth == TSK_ExplicitInstantiationDefinition) { 241462c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PendingInstantiations.push_back( 241558e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth std::make_pair(Function, PointOfInstantiation)); 2416e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor } 241758e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth 24181eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor return; 2419e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor } 24201eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor 2421d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor // C++0x [temp.explicit]p9: 2422d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor // Except for inline functions, other explicit instantiation declarations 24231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // have the effect of suppressing the implicit instantiation of the entity 2424d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor // to which they refer. 24251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Function->getTemplateSpecializationKind() 2426d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor == TSK_ExplicitInstantiationDeclaration && 24277ced9c8529b734e313f62a3b81189d6f402f6713Douglas Gregor !PatternDecl->isInlined()) 2428d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor return; 24291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2430f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor InstantiatingTemplate Inst(*this, PointOfInstantiation, Function); 2431f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor if (Inst) 2432a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi return; 2433a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2434e994624c001143ee2b8a7a4715aaad5efcd71f18Abramo Bagnara // Copy the inner loc start from the pattern. 2435e994624c001143ee2b8a7a4715aaad5efcd71f18Abramo Bagnara Function->setInnerLocStart(PatternDecl->getInnerLocStart()); 2436e994624c001143ee2b8a7a4715aaad5efcd71f18Abramo Bagnara 2437b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor // If we're performing recursive template instantiation, create our own 2438b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor // queue of pending implicit instantiations that we will instantiate later, 2439b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor // while we're still within our own instantiation context. 24405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<VTableUse, 16> SavedVTableUses; 244162c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth std::deque<PendingImplicitInstantiation> SavedPendingInstantiations; 24422a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky if (Recursive) { 24432a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky VTableUses.swap(SavedVTableUses); 244462c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PendingInstantiations.swap(SavedPendingInstantiations); 24452a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky } 24461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2447a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi EnterExpressionEvaluationContext EvalContext(*this, 2448f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::PotentiallyEvaluated); 2449d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall ActOnStartOfFunctionDef(0, Function); 2450e2c31ff0bc622e6fd7d47d7e08b53840f3be6c89Douglas Gregor 245154dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor // Introduce a new scope where local variable instantiations will be 245260406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor // recorded, unless we're actually a member function within a local 245360406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor // class, in which case we need to merge our results with the parent 245460406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor // scope (of the enclosing function). 245560406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor bool MergeWithParentScope = false; 245660406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor if (CXXRecordDecl *Rec = dyn_cast<CXXRecordDecl>(Function->getDeclContext())) 245760406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor MergeWithParentScope = Rec->isLocalClass(); 245860406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor 245960406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor LocalInstantiationScope Scope(*this, MergeWithParentScope); 24601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 246154dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor // Introduce the instantiated function parameters into the local 24628a6c0f1a48b8167ca1457c9f05288fa637033dc9Peter Collingbourne // instantiation scope, and set the parameter names to those used 24638a6c0f1a48b8167ca1457c9f05288fa637033dc9Peter Collingbourne // in the template. 246412c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor unsigned FParamIdx = 0; 24658a6c0f1a48b8167ca1457c9f05288fa637033dc9Peter Collingbourne for (unsigned I = 0, N = PatternDecl->getNumParams(); I != N; ++I) { 24668a6c0f1a48b8167ca1457c9f05288fa637033dc9Peter Collingbourne const ParmVarDecl *PatternParam = PatternDecl->getParamDecl(I); 246712c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor if (!PatternParam->isParameterPack()) { 246812c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor // Simple case: not a parameter pack. 246912c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor assert(FParamIdx < Function->getNumParams()); 247012c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor ParmVarDecl *FunctionParam = Function->getParamDecl(I); 247112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor FunctionParam->setDeclName(PatternParam->getDeclName()); 247212c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor Scope.InstantiatedLocal(PatternParam, FunctionParam); 247312c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor ++FParamIdx; 247412c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor continue; 247512c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor } 2476a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 247712c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor // Expand the parameter pack. 247812c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor Scope.MakeInstantiatedLocalArgPack(PatternParam); 2479a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi for (unsigned NumFParams = Function->getNumParams(); 2480a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi FParamIdx < NumFParams; 248112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor ++FParamIdx) { 248212c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx); 248312c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor FunctionParam->setDeclName(PatternParam->getDeclName()); 248412c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor Scope.InstantiatedLocalPackArg(PatternParam, FunctionParam); 248512c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor } 24868a6c0f1a48b8167ca1457c9f05288fa637033dc9Peter Collingbourne } 248754dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor 2488b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor // Enter the scope of this instantiation. We don't use 2489b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor // PushDeclContext because we don't have a scope. 2490eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall Sema::ContextRAII savedContext(*this, Function); 2491b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor 24921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MultiLevelTemplateArgumentList TemplateArgs = 2493e7089b0c6ffe8a8854150b60df00fb544099f77dDouglas Gregor getTemplateInstantiationArgs(Function, 0, false, PatternDecl); 2494090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson 2495cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt if (PatternDecl->isDefaulted()) { 2496cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt ActOnFinishFunctionBody(Function, 0, /*IsInstantiation=*/true); 24971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2498cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt SetDeclDefaulted(Function, PatternDecl->getLocation()); 2499cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt } else { 2500cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt // If this is a constructor, instantiate the member initializers. 2501cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt if (const CXXConstructorDecl *Ctor = 2502cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt dyn_cast<CXXConstructorDecl>(PatternDecl)) { 2503cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt InstantiateMemInitializers(cast<CXXConstructorDecl>(Function), Ctor, 2504cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt TemplateArgs); 2505cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt } 2506cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt 2507cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt // Instantiate the function body. 2508cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt StmtResult Body = SubstStmt(Pattern, TemplateArgs); 2509cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt 2510cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt if (Body.isInvalid()) 2511cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt Function->setInvalidDecl(); 2512a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2513cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt ActOnFinishFunctionBody(Function, Body.get(), 2514cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt /*IsInstantiation=*/true); 2515cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt } 2516b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor 25170c01d18094100db92d38daa923c95661512db203John McCall PerformDependentDiagnostics(PatternDecl, TemplateArgs); 25180c01d18094100db92d38daa923c95661512db203John McCall 2519eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall savedContext.pop(); 2520aba43bb13b3aa3e81990989375fba3a902bfe1c2Douglas Gregor 2521aba43bb13b3aa3e81990989375fba3a902bfe1c2Douglas Gregor DeclGroupRef DG(Function); 2522aba43bb13b3aa3e81990989375fba3a902bfe1c2Douglas Gregor Consumer.HandleTopLevelDecl(DG); 25231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 252460406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor // This class may have local implicit instantiations that need to be 252560406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor // instantiation within this scope. 252662c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PerformPendingInstantiations(/*LocalOnly=*/true); 252760406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor Scope.Exit(); 252860406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor 2529b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor if (Recursive) { 25302a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky // Define any pending vtables. 25312a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky DefineUsedVTables(); 25322a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky 2533b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor // Instantiate any pending implicit instantiations found during the 25341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // instantiation of this template. 253562c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PerformPendingInstantiations(); 25361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25372a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky // Restore the set of pending vtables. 25388155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky assert(VTableUses.empty() && 25398155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky "VTableUses should be empty before it is discarded."); 25402a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky VTableUses.swap(SavedVTableUses); 25412a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky 2542b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor // Restore the set of pending implicit instantiations. 25438155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky assert(PendingInstantiations.empty() && 25448155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky "PendingInstantiations should be empty before it is discarded."); 254562c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PendingInstantiations.swap(SavedPendingInstantiations); 2546b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor } 2547a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor} 2548a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor 2549a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// \brief Instantiate the definition of the given variable from its 2550a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// template. 2551a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// 25527caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// \param PointOfInstantiation the point at which the instantiation was 25537caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// required. Note that this is not precisely a "point of instantiation" 25547caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// for the function, but it's close. 25557caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// 25567caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// \param Var the already-instantiated declaration of a static member 25577caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// variable of a class template specialization. 25587caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// 25597caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// \param Recursive if true, recursively instantiates any functions that 25607caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// are required by this instantiation. 2561e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// 2562e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// \param DefinitionRequired if true, then we are performing an explicit 2563e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// instantiation where an out-of-line definition of the member variable 2564e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// is required. Complain if there is no such definition. 25657caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregorvoid Sema::InstantiateStaticDataMemberDefinition( 25667caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor SourceLocation PointOfInstantiation, 25677caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor VarDecl *Var, 2568e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor bool Recursive, 2569e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor bool DefinitionRequired) { 25707caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (Var->isInvalidDecl()) 25717caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return; 25721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25737caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // Find the out-of-line definition of this static data member. 25747caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor VarDecl *Def = Var->getInstantiatedFromStaticDataMember(); 25757caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Def && "This data member was not instantiated from a template?"); 2576a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi assert(Def->isStaticDataMember() && "Not a static data member?"); 25770d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor Def = Def->getOutOfLineDefinition(); 25781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25790d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor if (!Def) { 25807caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // We did not find an out-of-line definition of this static data member, 25817caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // so we won't perform any instantiation. Rather, we rely on the user to 25821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // instantiate this definition (or provide a specialization for it) in 25831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // another translation unit. 2584e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor if (DefinitionRequired) { 25850d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor Def = Var->getInstantiatedFromStaticDataMember(); 2586a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Diag(PointOfInstantiation, 2587e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor diag::err_explicit_instantiation_undefined_member) 2588e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor << 2 << Var->getDeclName() << Var->getDeclContext(); 2589e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor Diag(Def->getLocation(), diag::note_explicit_instantiation_here); 259058e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth } else if (Var->getTemplateSpecializationKind() 259158e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth == TSK_ExplicitInstantiationDefinition) { 259262c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PendingInstantiations.push_back( 259358e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth std::make_pair(Var, PointOfInstantiation)); 259458e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth } 259558e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth 25967caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return; 25977caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor } 25987caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor 2599234fe654a3dd2888be42ae5db34db96c5c2c4ba3Rafael Espindola TemplateSpecializationKind TSK = Var->getTemplateSpecializationKind(); 2600234fe654a3dd2888be42ae5db34db96c5c2c4ba3Rafael Espindola 2601251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor // Never instantiate an explicit specialization. 2602234fe654a3dd2888be42ae5db34db96c5c2c4ba3Rafael Espindola if (TSK == TSK_ExplicitSpecialization) 2603251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor return; 2604a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2605251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor // C++0x [temp.explicit]p9: 2606251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor // Except for inline functions, other explicit instantiation declarations 2607251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor // have the effect of suppressing the implicit instantiation of the entity 2608251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor // to which they refer. 2609234fe654a3dd2888be42ae5db34db96c5c2c4ba3Rafael Espindola if (TSK == TSK_ExplicitInstantiationDeclaration) 2610251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor return; 26111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2612025039377d7247620750205dbd61ca1ba336f7e0Rafael Espindola Consumer.HandleCXXStaticMemberVarInstantiation(Var); 2613025039377d7247620750205dbd61ca1ba336f7e0Rafael Espindola 2614f15748a28c8443eef2924ef83689c358c661e9c5Douglas Gregor // If we already have a definition, we're done. 2615025039377d7247620750205dbd61ca1ba336f7e0Rafael Espindola if (Var->getDefinition()) 2616f15748a28c8443eef2924ef83689c358c661e9c5Douglas Gregor return; 2617f15748a28c8443eef2924ef83689c358c661e9c5Douglas Gregor 26187caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor InstantiatingTemplate Inst(*this, PointOfInstantiation, Var); 26197caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (Inst) 26207caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return; 26211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26227caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // If we're performing recursive template instantiation, create our own 26237caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // queue of pending implicit instantiations that we will instantiate later, 26247caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // while we're still within our own instantiation context. 26255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<VTableUse, 16> SavedVTableUses; 262662c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth std::deque<PendingImplicitInstantiation> SavedPendingInstantiations; 26278155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky if (Recursive) { 26288155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky VTableUses.swap(SavedVTableUses); 262962c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PendingInstantiations.swap(SavedPendingInstantiations); 26308155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky } 26311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26327caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // Enter the scope of this instantiation. We don't use 26337caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // PushDeclContext because we don't have a scope. 2634f5ba7e089daadcd60b0f6e31d932be8bb6045281John McCall ContextRAII previousContext(*this, Var->getDeclContext()); 26357bdc15252ca2415f149ad812f0e5184d758e6105Douglas Gregor LocalInstantiationScope Local(*this); 26367bdc15252ca2415f149ad812f0e5184d758e6105Douglas Gregor 26371028c9f0afc1cc5f4951b39b7067fa57c1fea07bDouglas Gregor VarDecl *OldVar = Var; 2638ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCall Var = cast_or_null<VarDecl>(SubstDecl(Def, Var->getDeclContext(), 26396bb4dcb412d53d05a80017df81d41e447e2aa3eaNico Weber getTemplateInstantiationArgs(Var))); 2640f5ba7e089daadcd60b0f6e31d932be8bb6045281John McCall 2641f5ba7e089daadcd60b0f6e31d932be8bb6045281John McCall previousContext.pop(); 26427caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor 26437caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (Var) { 2644583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor MemberSpecializationInfo *MSInfo = OldVar->getMemberSpecializationInfo(); 2645583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor assert(MSInfo && "Missing member specialization information?"); 2646583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor Var->setTemplateSpecializationKind(MSInfo->getTemplateSpecializationKind(), 2647583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor MSInfo->getPointOfInstantiation()); 26487caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor DeclGroupRef DG(Var); 26497caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor Consumer.HandleTopLevelDecl(DG); 26507caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor } 26517bdc15252ca2415f149ad812f0e5184d758e6105Douglas Gregor Local.Exit(); 26527bdc15252ca2415f149ad812f0e5184d758e6105Douglas Gregor 26537caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (Recursive) { 26548155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // Define any newly required vtables. 26558155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky DefineUsedVTables(); 26568155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky 26577caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // Instantiate any pending implicit instantiations found during the 26581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // instantiation of this template. 265962c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PerformPendingInstantiations(); 26601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26618155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // Restore the set of pending vtables. 26628155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky assert(VTableUses.empty() && 26638155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky "VTableUses should be empty before it is discarded, " 26648155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky "while instantiating static data member."); 26658155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky VTableUses.swap(SavedVTableUses); 26668155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky 26677caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // Restore the set of pending implicit instantiations. 26688155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky assert(PendingInstantiations.empty() && 26698155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky "PendingInstantiations should be empty before it is discarded, " 26708155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky "while instantiating static data member."); 267162c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PendingInstantiations.swap(SavedPendingInstantiations); 26721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 2673a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor} 2674815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 2675090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlssonvoid 2676090253155017b7eec031bbd7bf07824a448e1d7aAnders CarlssonSema::InstantiateMemInitializers(CXXConstructorDecl *New, 2677090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson const CXXConstructorDecl *Tmpl, 2678090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson const MultiLevelTemplateArgumentList &TemplateArgs) { 26791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 268090ab75b5ad328d2b155ec83fd4e80cd0f7af5729Richard Trieu SmallVector<CXXCtorInitializer*, 4> NewInits; 26819db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor bool AnyErrors = false; 2682a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2683090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson // Instantiate all the initializers. 2684090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson for (CXXConstructorDecl::init_const_iterator Inits = Tmpl->init_begin(), 268572f6d678c8de9f3a770e8ae5fc4979abf3940668Douglas Gregor InitsEnd = Tmpl->init_end(); 268672f6d678c8de9f3a770e8ae5fc4979abf3940668Douglas Gregor Inits != InitsEnd; ++Inits) { 2687cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt CXXCtorInitializer *Init = *Inits; 2688090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson 2689030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth // Only instantiate written initializers, let Sema re-construct implicit 2690030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth // ones. 2691030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth if (!Init->isWritten()) 2692030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth continue; 2693030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth 26943fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor SourceLocation EllipsisLoc; 2695a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 26963fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor if (Init->isPackExpansion()) { 26973fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor // This is a pack expansion. We should expand it now. 269876852c218a207ef43583515cb835b6e855353a0fDouglas Gregor TypeLoc BaseTL = Init->getTypeSourceInfo()->getTypeLoc(); 26995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<UnexpandedParameterPack, 2> Unexpanded; 27003fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor collectUnexpandedParameterPacks(BaseTL, Unexpanded); 27013fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor bool ShouldExpand = false; 2702d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool RetainExpansion = false; 2703cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions; 2704a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi if (CheckParameterPacksForExpansion(Init->getEllipsisLoc(), 27053fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor BaseTL.getSourceRange(), 2706a71f9d0a5e1f8cafdd23a17e292de22fdc8e99ffDavid Blaikie Unexpanded, 2707a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi TemplateArgs, ShouldExpand, 2708d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor RetainExpansion, 27093fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor NumExpansions)) { 27103fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor AnyErrors = true; 27113fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor New->setInvalidDecl(); 27123fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor continue; 27133fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor } 27143fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor assert(ShouldExpand && "Partial instantiation of base initializer?"); 2715a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2716a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi // Loop over all of the arguments in the argument pack(s), 2717cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor for (unsigned I = 0; I != *NumExpansions; ++I) { 27183fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(*this, I); 27193fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 27203fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor // Instantiate the initializer. 27215b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl ExprResult TempInit = SubstInitializer(Init->getInit(), TemplateArgs, 27225b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl /*CXXDirectInit=*/true); 27235b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl if (TempInit.isInvalid()) { 27243fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor AnyErrors = true; 27253fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor break; 27263fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor } 27273fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 27283fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor // Instantiate the base type. 272976852c218a207ef43583515cb835b6e855353a0fDouglas Gregor TypeSourceInfo *BaseTInfo = SubstType(Init->getTypeSourceInfo(), 2730a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi TemplateArgs, 2731a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Init->getSourceLocation(), 27323fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor New->getDeclName()); 27333fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor if (!BaseTInfo) { 27343fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor AnyErrors = true; 27353fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor break; 27363fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor } 27373fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 27383fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor // Build the initializer. 27396df6548e44a61c444bd85dccd0398cba047c79b1Sebastian Redl MemInitResult NewInit = BuildBaseInitializer(BaseTInfo->getType(), 27405b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl BaseTInfo, TempInit.take(), 27413fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor New->getParent(), 27423fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor SourceLocation()); 27433fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor if (NewInit.isInvalid()) { 27443fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor AnyErrors = true; 27453fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor break; 27463fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor } 2747a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 27483fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor NewInits.push_back(NewInit.get()); 27493fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor } 2750a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 27513fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor continue; 27523fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor } 27533fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 27546b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor // Instantiate the initializer. 27555b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl ExprResult TempInit = SubstInitializer(Init->getInit(), TemplateArgs, 27565b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl /*CXXDirectInit=*/true); 27575b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl if (TempInit.isInvalid()) { 27586b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor AnyErrors = true; 27596b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor continue; 2760090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson } 2761a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2762090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson MemInitResult NewInit; 276376852c218a207ef43583515cb835b6e855353a0fDouglas Gregor if (Init->isDelegatingInitializer() || Init->isBaseInitializer()) { 276476852c218a207ef43583515cb835b6e855353a0fDouglas Gregor TypeSourceInfo *TInfo = SubstType(Init->getTypeSourceInfo(), 276576852c218a207ef43583515cb835b6e855353a0fDouglas Gregor TemplateArgs, 276676852c218a207ef43583515cb835b6e855353a0fDouglas Gregor Init->getSourceLocation(), 276776852c218a207ef43583515cb835b6e855353a0fDouglas Gregor New->getDeclName()); 276876852c218a207ef43583515cb835b6e855353a0fDouglas Gregor if (!TInfo) { 27699db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor AnyErrors = true; 2770802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor New->setInvalidDecl(); 2771802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor continue; 2772802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor } 27736df6548e44a61c444bd85dccd0398cba047c79b1Sebastian Redl 277476852c218a207ef43583515cb835b6e855353a0fDouglas Gregor if (Init->isBaseInitializer()) 27755b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl NewInit = BuildBaseInitializer(TInfo->getType(), TInfo, TempInit.take(), 277676852c218a207ef43583515cb835b6e855353a0fDouglas Gregor New->getParent(), EllipsisLoc); 277776852c218a207ef43583515cb835b6e855353a0fDouglas Gregor else 27785b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl NewInit = BuildDelegatingInitializer(TInfo, TempInit.take(), 277976852c218a207ef43583515cb835b6e855353a0fDouglas Gregor cast<CXXRecordDecl>(CurContext->getParent())); 2780090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson } else if (Init->isMemberInitializer()) { 2781b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor FieldDecl *Member = cast_or_null<FieldDecl>(FindInstantiatedDecl( 278200eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Init->getMemberLocation(), 278300eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Init->getMember(), 278400eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet TemplateArgs)); 2785b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor if (!Member) { 2786b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor AnyErrors = true; 2787b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor New->setInvalidDecl(); 2788b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor continue; 2789b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor } 27901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27915b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl NewInit = BuildMemberInitializer(Member, TempInit.take(), 27926df6548e44a61c444bd85dccd0398cba047c79b1Sebastian Redl Init->getSourceLocation()); 279300eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet } else if (Init->isIndirectMemberInitializer()) { 279400eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet IndirectFieldDecl *IndirectMember = 2795b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor cast_or_null<IndirectFieldDecl>(FindInstantiatedDecl( 279600eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Init->getMemberLocation(), 279700eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Init->getIndirectMember(), TemplateArgs)); 279800eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet 2799b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor if (!IndirectMember) { 2800b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor AnyErrors = true; 2801b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor New->setInvalidDecl(); 28026df6548e44a61c444bd85dccd0398cba047c79b1Sebastian Redl continue; 2803b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor } 28046df6548e44a61c444bd85dccd0398cba047c79b1Sebastian Redl 28055b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl NewInit = BuildMemberInitializer(IndirectMember, TempInit.take(), 28066df6548e44a61c444bd85dccd0398cba047c79b1Sebastian Redl Init->getSourceLocation()); 2807090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson } 2808090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson 28099db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (NewInit.isInvalid()) { 28109db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor AnyErrors = true; 2811090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson New->setInvalidDecl(); 28129db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 281390ab75b5ad328d2b155ec83fd4e80cd0f7af5729Richard Trieu NewInits.push_back(NewInit.get()); 2814090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson } 2815090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson } 28161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2817090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson // Assign all the initializers to the new constructor. 2818d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall ActOnMemInitializers(New, 2819090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson /*FIXME: ColonLoc */ 2820090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson SourceLocation(), 28219db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor NewInits.data(), NewInits.size(), 28229db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor AnyErrors); 2823090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson} 2824090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson 28255b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian RedlExprResult Sema::SubstInitializer(Expr *Init, 28265b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl const MultiLevelTemplateArgumentList &TemplateArgs, 28275b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl bool CXXDirectInit) { 28285b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl // Initializers are instantiated like expressions, except that various outer 28295b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl // layers are stripped. 28305b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl if (!Init) 28315b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl return Owned(Init); 28325b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl 28335b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init)) 28345b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl Init = ExprTemp->getSubExpr(); 28355b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl 28365b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 28375b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl Init = Binder->getSubExpr(); 28385b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl 28395b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 28405b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl Init = ICE->getSubExprAsWritten(); 28415b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl 28425b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl // If this is a direct-initializer, we take apart CXXConstructExprs. 28435b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl // Everything else is passed through. 28445b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl CXXConstructExpr *Construct; 28455b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl if (!CXXDirectInit || !(Construct = dyn_cast<CXXConstructExpr>(Init)) || 28465b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl isa<CXXTemporaryObjectExpr>(Construct)) 28475b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl return SubstExpr(Init, TemplateArgs); 28485b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl 28495b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl ASTOwningVector<Expr*> NewArgs(*this); 28505b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl if (SubstExprs(Construct->getArgs(), Construct->getNumArgs(), true, 28515b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl TemplateArgs, NewArgs)) 28525b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl return ExprError(); 28535b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl 28545b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl // Treat an empty initializer like none. 28555b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl if (NewArgs.empty()) 28565b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl return Owned((Expr*)0); 28575b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl 28585b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl // Build a ParenListExpr to represent anything else. 28595b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl // FIXME: Fake locations! 28605b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl SourceLocation Loc = PP.getLocForEndOfToken(Init->getLocStart()); 28615b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl return ActOnParenListExpr(Loc, Loc, move_arg(NewArgs)); 28625b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl} 28635b9cc5df25c2198f270dd1d5c438fdce70d4051dSebastian Redl 286452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall// TODO: this could be templated if the various decl types used the 286552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall// same method name. 286652a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCallstatic bool isInstantiationOf(ClassTemplateDecl *Pattern, 286752a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall ClassTemplateDecl *Instance) { 286852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Pattern = Pattern->getCanonicalDecl(); 286952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 287052a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall do { 287152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getCanonicalDecl(); 287252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (Pattern == Instance) return true; 287352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getInstantiatedFromMemberTemplate(); 287452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall } while (Instance); 287552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 287652a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return false; 287752a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall} 287852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 28790d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregorstatic bool isInstantiationOf(FunctionTemplateDecl *Pattern, 28800d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor FunctionTemplateDecl *Instance) { 28810d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor Pattern = Pattern->getCanonicalDecl(); 2882a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 28830d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor do { 28840d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor Instance = Instance->getCanonicalDecl(); 28850d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor if (Pattern == Instance) return true; 28860d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor Instance = Instance->getInstantiatedFromMemberTemplate(); 28870d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor } while (Instance); 2888a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 28890d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor return false; 28900d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor} 28910d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor 2892a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumistatic bool 2893ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas GregorisInstantiationOf(ClassTemplatePartialSpecializationDecl *Pattern, 2894ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor ClassTemplatePartialSpecializationDecl *Instance) { 2895a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi Pattern 2896ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = cast<ClassTemplatePartialSpecializationDecl>(Pattern->getCanonicalDecl()); 2897ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor do { 2898ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor Instance = cast<ClassTemplatePartialSpecializationDecl>( 2899ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor Instance->getCanonicalDecl()); 2900ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (Pattern == Instance) 2901ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return true; 2902ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor Instance = Instance->getInstantiatedFromMember(); 2903ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor } while (Instance); 2904a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 2905ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return false; 2906ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 2907ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 290852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCallstatic bool isInstantiationOf(CXXRecordDecl *Pattern, 290952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall CXXRecordDecl *Instance) { 291052a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Pattern = Pattern->getCanonicalDecl(); 291152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 291252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall do { 291352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getCanonicalDecl(); 291452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (Pattern == Instance) return true; 291552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getInstantiatedFromMemberClass(); 291652a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall } while (Instance); 291752a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 291852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return false; 291952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall} 292052a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 292152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCallstatic bool isInstantiationOf(FunctionDecl *Pattern, 292252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall FunctionDecl *Instance) { 292352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Pattern = Pattern->getCanonicalDecl(); 292452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 292552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall do { 292652a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getCanonicalDecl(); 292752a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (Pattern == Instance) return true; 292852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getInstantiatedFromMemberFunction(); 292952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall } while (Instance); 293052a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 293152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return false; 293252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall} 293352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 293452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCallstatic bool isInstantiationOf(EnumDecl *Pattern, 293552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall EnumDecl *Instance) { 293652a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Pattern = Pattern->getCanonicalDecl(); 293752a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 293852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall do { 293952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getCanonicalDecl(); 294052a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (Pattern == Instance) return true; 294152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getInstantiatedFromMemberEnum(); 294252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall } while (Instance); 294352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 294452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return false; 294552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall} 294652a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 2947ed97649e9574b9d854fa4d6109c9333ae0993554John McCallstatic bool isInstantiationOf(UsingShadowDecl *Pattern, 2948ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingShadowDecl *Instance, 2949ed97649e9574b9d854fa4d6109c9333ae0993554John McCall ASTContext &C) { 2950ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return C.getInstantiatedFromUsingShadowDecl(Instance) == Pattern; 2951ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 2952ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2953ed97649e9574b9d854fa4d6109c9333ae0993554John McCallstatic bool isInstantiationOf(UsingDecl *Pattern, 2954ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingDecl *Instance, 2955ed97649e9574b9d854fa4d6109c9333ae0993554John McCall ASTContext &C) { 2956ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return C.getInstantiatedFromUsingDecl(Instance) == Pattern; 2957ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 2958ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 29597ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallstatic bool isInstantiationOf(UnresolvedUsingValueDecl *Pattern, 29607ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall UsingDecl *Instance, 29617ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall ASTContext &C) { 2962ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return C.getInstantiatedFromUsingDecl(Instance) == Pattern; 29637ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall} 29647ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall 29657ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallstatic bool isInstantiationOf(UnresolvedUsingTypenameDecl *Pattern, 29660d8df780aef1acda5962347a32591efc629b6748Anders Carlsson UsingDecl *Instance, 29670d8df780aef1acda5962347a32591efc629b6748Anders Carlsson ASTContext &C) { 2968ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return C.getInstantiatedFromUsingDecl(Instance) == Pattern; 29690d8df780aef1acda5962347a32591efc629b6748Anders Carlsson} 29700d8df780aef1acda5962347a32591efc629b6748Anders Carlsson 297152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCallstatic bool isInstantiationOfStaticDataMember(VarDecl *Pattern, 297252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall VarDecl *Instance) { 297352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall assert(Instance->isStaticDataMember()); 297452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 297552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Pattern = Pattern->getCanonicalDecl(); 297652a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 297752a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall do { 297852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getCanonicalDecl(); 297952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (Pattern == Instance) return true; 298052a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getInstantiatedFromStaticDataMember(); 298152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall } while (Instance); 298252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 298352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return false; 298452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall} 298552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 2986ed97649e9574b9d854fa4d6109c9333ae0993554John McCall// Other is the prospective instantiation 2987ed97649e9574b9d854fa4d6109c9333ae0993554John McCall// D is the prospective pattern 2988815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregorstatic bool isInstantiationOf(ASTContext &Ctx, NamedDecl *D, Decl *Other) { 29890d8df780aef1acda5962347a32591efc629b6748Anders Carlsson if (D->getKind() != Other->getKind()) { 29907ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall if (UnresolvedUsingTypenameDecl *UUD 29917ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall = dyn_cast<UnresolvedUsingTypenameDecl>(D)) { 29927ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall if (UsingDecl *UD = dyn_cast<UsingDecl>(Other)) { 29937ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall return isInstantiationOf(UUD, UD, Ctx); 29947ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall } 29957ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall } 29967ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall 29977ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall if (UnresolvedUsingValueDecl *UUD 29987ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall = dyn_cast<UnresolvedUsingValueDecl>(D)) { 29990d8df780aef1acda5962347a32591efc629b6748Anders Carlsson if (UsingDecl *UD = dyn_cast<UsingDecl>(Other)) { 30000d8df780aef1acda5962347a32591efc629b6748Anders Carlsson return isInstantiationOf(UUD, UD, Ctx); 30010d8df780aef1acda5962347a32591efc629b6748Anders Carlsson } 30020d8df780aef1acda5962347a32591efc629b6748Anders Carlsson } 3003815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 30040d8df780aef1acda5962347a32591efc629b6748Anders Carlsson return false; 30050d8df780aef1acda5962347a32591efc629b6748Anders Carlsson } 30061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 300752a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(Other)) 300852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return isInstantiationOf(cast<CXXRecordDecl>(D), Record); 30091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 301052a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Other)) 301152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return isInstantiationOf(cast<FunctionDecl>(D), Function); 3012815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 301352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (EnumDecl *Enum = dyn_cast<EnumDecl>(Other)) 301452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return isInstantiationOf(cast<EnumDecl>(D), Enum); 3015815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 30167caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (VarDecl *Var = dyn_cast<VarDecl>(Other)) 301752a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (Var->isStaticDataMember()) 301852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return isInstantiationOfStaticDataMember(cast<VarDecl>(D), Var); 301952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 302052a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (ClassTemplateDecl *Temp = dyn_cast<ClassTemplateDecl>(Other)) 302152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return isInstantiationOf(cast<ClassTemplateDecl>(D), Temp); 3022a5bf7f13d7772b164750997f95ab18487bbc4114Douglas Gregor 30230d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor if (FunctionTemplateDecl *Temp = dyn_cast<FunctionTemplateDecl>(Other)) 30240d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor return isInstantiationOf(cast<FunctionTemplateDecl>(D), Temp); 30250d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor 3026ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (ClassTemplatePartialSpecializationDecl *PartialSpec 3027ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<ClassTemplatePartialSpecializationDecl>(Other)) 3028ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return isInstantiationOf(cast<ClassTemplatePartialSpecializationDecl>(D), 3029ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor PartialSpec); 3030ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 3031d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (FieldDecl *Field = dyn_cast<FieldDecl>(Other)) { 3032d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (!Field->getDeclName()) { 3033d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson // This is an unnamed field. 30341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Ctx.getInstantiatedFromUnnamedFieldDecl(Field) == 3035d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson cast<FieldDecl>(D); 3036d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 3037d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 30381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3039ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (UsingDecl *Using = dyn_cast<UsingDecl>(Other)) 3040ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return isInstantiationOf(cast<UsingDecl>(D), Using, Ctx); 3041ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 3042ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (UsingShadowDecl *Shadow = dyn_cast<UsingShadowDecl>(Other)) 3043ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return isInstantiationOf(cast<UsingShadowDecl>(D), Shadow, Ctx); 3044ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 3045815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return D->getDeclName() && isa<NamedDecl>(Other) && 3046815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor D->getDeclName() == cast<NamedDecl>(Other)->getDeclName(); 3047815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor} 3048815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 3049815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregortemplate<typename ForwardIterator> 30501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic NamedDecl *findInstantiationOf(ASTContext &Ctx, 3051815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor NamedDecl *D, 3052815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor ForwardIterator first, 3053815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor ForwardIterator last) { 3054815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor for (; first != last; ++first) 3055815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (isInstantiationOf(Ctx, D, *first)) 3056815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return cast<NamedDecl>(*first); 3057815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 3058815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return 0; 3059815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor} 3060815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 306102cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// \brief Finds the instantiation of the given declaration context 306202cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// within the current instantiation. 306302cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// 306402cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// \returns NULL if there was an error 30657c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas GregorDeclContext *Sema::FindInstantiatedContext(SourceLocation Loc, DeclContext* DC, 3066e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor const MultiLevelTemplateArgumentList &TemplateArgs) { 306702cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall if (NamedDecl *D = dyn_cast<NamedDecl>(DC)) { 30687c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor Decl* ID = FindInstantiatedDecl(Loc, D, TemplateArgs); 306902cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall return cast_or_null<DeclContext>(ID); 307002cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall } else return DC; 307102cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall} 307202cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall 3073ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// \brief Find the instantiation of the given declaration within the 3074ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// current instantiation. 3075815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 3076815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// This routine is intended to be used when \p D is a declaration 3077815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// referenced from within a template, that needs to mapped into the 3078815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// corresponding declaration within an instantiation. For example, 3079815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// given: 3080815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 3081815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// \code 3082815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// template<typename T> 3083815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// struct X { 3084815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// enum Kind { 3085815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// KnownValue = sizeof(T) 3086815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// }; 3087815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 3088815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// bool getKind() const { return KnownValue; } 3089815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// }; 3090815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 3091815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// template struct X<int>; 3092815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// \endcode 3093815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 3094815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// In the instantiation of X<int>::getKind(), we need to map the 3095815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// EnumConstantDecl for KnownValue (which refers to 3096815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// X<T>::<Kind>::KnownValue) to its instantiation 3097ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// (X<int>::<Kind>::KnownValue). InstantiateCurrentDeclRef() performs 3098ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// this mapping from within the instantiation of X<int>. 30997c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas GregorNamedDecl *Sema::FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, 3100e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor const MultiLevelTemplateArgumentList &TemplateArgs) { 3101815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor DeclContext *ParentDC = D->getDeclContext(); 3102550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor if (isa<ParmVarDecl>(D) || isa<NonTypeTemplateParmDecl>(D) || 31036d3e627dacdb2f749195635ab587fd067ef813e1Douglas Gregor isa<TemplateTypeParmDecl>(D) || isa<TemplateTemplateParmDecl>(D) || 31047bdc15252ca2415f149ad812f0e5184d758e6105Douglas Gregor (ParentDC->isFunctionOrMethod() && ParentDC->isDependentContext()) || 31057bdc15252ca2415f149ad812f0e5184d758e6105Douglas Gregor (isa<CXXRecordDecl>(D) && cast<CXXRecordDecl>(D)->isLambda())) { 31062bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor // D is a local of some kind. Look into the map of local 31072bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor // declarations to their instantiations. 3108d8e54990ade0dd5566f8e3aa2e62def08753d1e9Chris Lattner typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack; 3109d8e54990ade0dd5566f8e3aa2e62def08753d1e9Chris Lattner llvm::PointerUnion<Decl *, DeclArgumentPack *> *Found 3110d8e54990ade0dd5566f8e3aa2e62def08753d1e9Chris Lattner = CurrentInstantiationScope->findInstantiationOf(D); 3111a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 311257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner if (Found) { 311357ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner if (Decl *FD = Found->dyn_cast<Decl *>()) 311457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return cast<NamedDecl>(FD); 3115a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 311657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner unsigned PackIdx = ArgumentPackSubstitutionIndex; 311757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return cast<NamedDecl>((*Found->get<DeclArgumentPack *>())[PackIdx]); 311857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner } 311957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 312057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner // If we didn't find the decl, then we must have a label decl that hasn't 312157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner // been found yet. Lazily instantiate it and return it now. 312257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner assert(isa<LabelDecl>(D)); 3123a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 312457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Decl *Inst = SubstDecl(D, CurContext, TemplateArgs); 312557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner assert(Inst && "Failed to instantiate label??"); 3126a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 312757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner CurrentInstantiationScope->InstantiatedLocal(D, Inst); 312857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return cast<LabelDecl>(Inst); 31292bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor } 3130815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 3131e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(D)) { 3132e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor if (!Record->isDependentContext()) 3133e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor return D; 3134a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 31352c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor // Determine whether this record is the "templated" declaration describing 31362c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor // a class template or class template partial specialization. 3137e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor ClassTemplateDecl *ClassTemplate = Record->getDescribedClassTemplate(); 31382c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor if (ClassTemplate) 31392c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor ClassTemplate = ClassTemplate->getCanonicalDecl(); 31402c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor else if (ClassTemplatePartialSpecializationDecl *PartialSpec 31412c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor = dyn_cast<ClassTemplatePartialSpecializationDecl>(Record)) 31422c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor ClassTemplate = PartialSpec->getSpecializedTemplate()->getCanonicalDecl(); 31432c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor 31442c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor // Walk the current context to find either the record or an instantiation of 31452c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor // it. 31462c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor DeclContext *DC = CurContext; 31472c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor while (!DC->isFileContext()) { 31482c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor // If we're performing substitution while we're inside the template 31492c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor // definition, we'll find our own context. We're done. 31502c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor if (DC->Equals(Record)) 31512c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor return Record; 31522c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor 31532c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor if (CXXRecordDecl *InstRecord = dyn_cast<CXXRecordDecl>(DC)) { 31542c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor // Check whether we're in the process of instantiating a class template 31552c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor // specialization of the template we're mapping. 31562c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor if (ClassTemplateSpecializationDecl *InstSpec 31572c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor = dyn_cast<ClassTemplateSpecializationDecl>(InstRecord)){ 31582c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor ClassTemplateDecl *SpecTemplate = InstSpec->getSpecializedTemplate(); 31592c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor if (ClassTemplate && isInstantiationOf(ClassTemplate, SpecTemplate)) 31602c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor return InstRecord; 31612c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor } 31622c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor 31632c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor // Check whether we're in the process of instantiating a member class. 31642c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor if (isInstantiationOf(Record, InstRecord)) 31652c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor return InstRecord; 3166e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor } 31672c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor 31682c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor 31692c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor // Move to the outer template scope. 31702c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor if (FunctionDecl *FD = dyn_cast<FunctionDecl>(DC)) { 31712c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor if (FD->getFriendObjectKind() && FD->getDeclContext()->isFileContext()){ 31722c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor DC = FD->getLexicalDeclContext(); 31732c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor continue; 31742c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor } 317552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall } 31762c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor 31772c1227c4da661bdc0b1976740c3ff203ed7609b2Douglas Gregor DC = DC->getParent(); 317852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall } 31798b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor 3180e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor // Fall through to deal with other dependent record types (e.g., 3181e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor // anonymous unions in class templates). 3182e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor } 318352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 3184e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor if (!ParentDC->isDependentContext()) 3185e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor return D; 3186a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 31877c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor ParentDC = FindInstantiatedContext(Loc, ParentDC, TemplateArgs); 31881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!ParentDC) 318944c73848d5d5bd34c05582dc8398a20bea7cd971Douglas Gregor return 0; 31901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3191815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (ParentDC != D->getDeclContext()) { 3192815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // We performed some kind of instantiation in the parent context, 3193815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // so now we need to look into the instantiated parent context to 3194815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // find the instantiation of the declaration D. 31957c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor 31963cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall // If our context used to be dependent, we may need to instantiate 31973cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall // it before performing lookup into that context. 3198eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor bool IsBeingInstantiated = false; 31993cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (CXXRecordDecl *Spec = dyn_cast<CXXRecordDecl>(ParentDC)) { 32007c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor if (!Spec->isDependentContext()) { 32017c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor QualType T = Context.getTypeDeclType(Spec); 32023cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const RecordType *Tag = T->getAs<RecordType>(); 32033cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(Tag && "type of non-dependent record is not a RecordType"); 3204eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor if (Tag->isBeingDefined()) 3205eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor IsBeingInstantiated = true; 32063cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (!Tag->isBeingDefined() && 32073cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall RequireCompleteType(Loc, T, diag::err_incomplete_type)) 32083cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return 0; 3209a43064c7b721a51ab2c0d0ccdc4f84064aa7ceccDouglas Gregor 3210a43064c7b721a51ab2c0d0ccdc4f84064aa7ceccDouglas Gregor ParentDC = Tag->getDecl(); 32117c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor } 32127c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor } 32137c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor 3214815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor NamedDecl *Result = 0; 3215815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (D->getDeclName()) { 321617945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis DeclContext::lookup_result Found = ParentDC->lookup(D->getDeclName()); 3217815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor Result = findInstantiationOf(Context, D, Found.first, Found.second); 3218815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } else { 3219815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // Since we don't have a name for the entity we're looking for, 3220815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // our only option is to walk through all of the declarations to 3221815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // find that name. This will occur in a few cases: 3222815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // 3223815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // - anonymous struct/union within a template 3224815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // - unnamed class/struct/union/enum within a template 3225815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // 3226815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // FIXME: Find a better way to find these instantiations! 32271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result = findInstantiationOf(Context, D, 322817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis ParentDC->decls_begin(), 322917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis ParentDC->decls_end()); 3230815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } 32311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3232eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor if (!Result) { 3233eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor if (isa<UsingShadowDecl>(D)) { 3234eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // UsingShadowDecls can instantiate to nothing because of using hiding. 3235eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor } else if (Diags.hasErrorOccurred()) { 3236eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // We've already complained about something, so most likely this 3237eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // declaration failed to instantiate. There's no point in complaining 3238eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // further, since this is normal in invalid code. 3239eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor } else if (IsBeingInstantiated) { 3240a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi // The class in which this member exists is currently being 3241eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // instantiated, and we haven't gotten around to instantiating this 3242eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // member yet. This can happen when the code uses forward declarations 3243eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // of member classes, and introduces ordering dependencies via 3244eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // template instantiation. 3245eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor Diag(Loc, diag::err_member_not_yet_instantiated) 3246eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor << D->getDeclName() 3247eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor << Context.getTypeDeclType(cast<CXXRecordDecl>(ParentDC)); 3248eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor Diag(D->getLocation(), diag::note_non_instantiated_member_here); 3249eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor } else { 3250eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // We should have found something, but didn't. 3251eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor llvm_unreachable("Unable to find instantiation of declaration!"); 3252eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor } 3253eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor } 3254a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 3255815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor D = Result; 3256815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } 3257815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 3258815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return D; 3259815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor} 3260d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor 32611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Performs template instantiation for all implicit template 3262d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor/// instantiations we have seen until this point. 32638155910a192dafa423d6b932b7d127d48e4641e8Nick Lewyckyvoid Sema::PerformPendingInstantiations(bool LocalOnly) { 32646e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor // Load pending instantiations from the external source. 32656e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor if (!LocalOnly && ExternalSource) { 32666e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor SmallVector<std::pair<ValueDecl *, SourceLocation>, 4> Pending; 32676e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor ExternalSource->ReadPendingInstantiations(Pending); 32686e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor PendingInstantiations.insert(PendingInstantiations.begin(), 32696e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor Pending.begin(), Pending.end()); 32706e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor } 3271a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi 327260406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor while (!PendingLocalImplicitInstantiations.empty() || 327362c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth (!LocalOnly && !PendingInstantiations.empty())) { 327460406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor PendingImplicitInstantiation Inst; 327560406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor 327660406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor if (PendingLocalImplicitInstantiations.empty()) { 327762c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth Inst = PendingInstantiations.front(); 327862c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PendingInstantiations.pop_front(); 327960406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor } else { 328060406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor Inst = PendingLocalImplicitInstantiations.front(); 328160406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor PendingLocalImplicitInstantiations.pop_front(); 328260406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor } 32831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32847caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // Instantiate function definitions 32857caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Inst.first)) { 3286f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall PrettyDeclStackTraceEntry CrashInfo(*this, Function, SourceLocation(), 3287f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall "instantiating function definition"); 328858e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth bool DefinitionRequired = Function->getTemplateSpecializationKind() == 328958e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth TSK_ExplicitInstantiationDefinition; 329058e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth InstantiateFunctionDefinition(/*FIXME:*/Inst.second, Function, true, 329158e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth DefinitionRequired); 32927caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor continue; 32937caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor } 32941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32957caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // Instantiate static data member definitions. 32967caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor VarDecl *Var = cast<VarDecl>(Inst.first); 32977caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Var->isStaticDataMember() && "Not a static data member?"); 3298c17fb7bd9a06b027c792c7dfad7e9fa430277affAnders Carlsson 3299291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth // Don't try to instantiate declarations if the most recent redeclaration 3300291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth // is invalid. 3301ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor if (Var->getMostRecentDecl()->isInvalidDecl()) 3302291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth continue; 3303291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth 3304291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth // Check if the most recent declaration has changed the specialization kind 3305291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth // and removed the need for implicit instantiation. 3306ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor switch (Var->getMostRecentDecl()->getTemplateSpecializationKind()) { 3307291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth case TSK_Undeclared: 3308b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Cannot instantitiate an undeclared specialization."); 3309291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth case TSK_ExplicitInstantiationDeclaration: 3310291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth case TSK_ExplicitSpecialization: 331158e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth continue; // No longer need to instantiate this type. 331258e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth case TSK_ExplicitInstantiationDefinition: 331358e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth // We only need an instantiation if the pending instantiation *is* the 331458e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth // explicit instantiation. 3315ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor if (Var != Var->getMostRecentDecl()) continue; 3316291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth case TSK_ImplicitInstantiation: 3317291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth break; 3318291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth } 3319291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth 3320f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall PrettyDeclStackTraceEntry CrashInfo(*this, Var, Var->getLocation(), 3321f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall "instantiating static data member " 3322f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall "definition"); 33231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 332458e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth bool DefinitionRequired = Var->getTemplateSpecializationKind() == 332558e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth TSK_ExplicitInstantiationDefinition; 332658e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth InstantiateStaticDataMemberDefinition(/*FIXME:*/Inst.second, Var, true, 332758e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth DefinitionRequired); 3328d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor } 3329d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor} 33300c01d18094100db92d38daa923c95661512db203John McCall 33310c01d18094100db92d38daa923c95661512db203John McCallvoid Sema::PerformDependentDiagnostics(const DeclContext *Pattern, 33320c01d18094100db92d38daa923c95661512db203John McCall const MultiLevelTemplateArgumentList &TemplateArgs) { 33330c01d18094100db92d38daa923c95661512db203John McCall for (DeclContext::ddiag_iterator I = Pattern->ddiag_begin(), 33340c01d18094100db92d38daa923c95661512db203John McCall E = Pattern->ddiag_end(); I != E; ++I) { 33350c01d18094100db92d38daa923c95661512db203John McCall DependentDiagnostic *DD = *I; 33360c01d18094100db92d38daa923c95661512db203John McCall 33370c01d18094100db92d38daa923c95661512db203John McCall switch (DD->getKind()) { 33380c01d18094100db92d38daa923c95661512db203John McCall case DependentDiagnostic::Access: 33390c01d18094100db92d38daa923c95661512db203John McCall HandleDependentAccessCheck(*DD, TemplateArgs); 33400c01d18094100db92d38daa923c95661512db203John McCall break; 33410c01d18094100db92d38daa923c95661512db203John McCall } 33420c01d18094100db92d38daa923c95661512db203John McCall } 33430c01d18094100db92d38daa923c95661512db203John McCall} 3344