SemaTemplateInstantiateDecl.cpp revision 90ab75b5ad328d2b155ec83fd4e80cd0f7af5729
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; 32c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 33c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc NewQualifierLoc 34c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor = SemaRef.SubstNestedNameSpecifierLoc(OldDecl->getQualifierLoc(), 35c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TemplateArgs); 36c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 37c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (!NewQualifierLoc) 38b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall return true; 39c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 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; 48c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 49c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc NewQualifierLoc 50c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor = SemaRef.SubstNestedNameSpecifierLoc(OldDecl->getQualifierLoc(), 51c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TemplateArgs); 52c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 53c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (!NewQualifierLoc) 54b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall return true; 55c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor 56c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NewDecl->setQualifierInfo(NewQualifierLoc); 57b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall return false; 58b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall} 59b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 604ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth// FIXME: Is this still too simple? 611d8d1ccd36888f1120b3a1df9e76f35dc2edb81dJohn McCallvoid Sema::InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs, 6219f74acdf8842ceece578b7307884f5ba22d7f59Rafael Espindola const Decl *Tmpl, Decl *New) { 63cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt for (AttrVec::const_iterator i = Tmpl->attr_begin(), e = Tmpl->attr_end(); 64cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt i != e; ++i) { 65cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt const Attr *TmplAttr = *i; 664ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth // FIXME: This should be generalized to more than just the AlignedAttr. 674ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth if (const AlignedAttr *Aligned = dyn_cast<AlignedAttr>(TmplAttr)) { 68cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt if (Aligned->isAlignmentDependent()) { 694ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth // The alignment expression is not potentially evaluated. 701d8d1ccd36888f1120b3a1df9e76f35dc2edb81dJohn McCall EnterExpressionEvaluationContext Unevaluated(*this, 71f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::Unevaluated); 724ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth 73cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt if (Aligned->isAlignmentExpr()) { 7460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Result = SubstExpr(Aligned->getAlignmentExpr(), 757663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky TemplateArgs); 76cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt if (!Result.isInvalid()) 77cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt AddAlignedAttr(Aligned->getLocation(), New, Result.takeAs<Expr>()); 78cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt } 79cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt else { 80cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt TypeSourceInfo *Result = SubstType(Aligned->getAlignmentType(), 817663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky TemplateArgs, 827663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky Aligned->getLocation(), 837663f396651716c82280f8fdcf97ad8e27c1ce5aNick Lewycky DeclarationName()); 84cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt if (Result) 85cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt AddAlignedAttr(Aligned->getLocation(), New, Result); 86cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt } 874ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth continue; 884ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth } 894ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth } 904ced79f0971592e6e7122037de69ee9ae534ce72Chandler Carruth 91d8fe2d56fb5463c9d109e8c6dab2e98b06bee186Anders Carlsson // FIXME: Is cloning correct for all attributes? 921d8d1ccd36888f1120b3a1df9e76f35dc2edb81dJohn McCall Attr *NewAttr = TmplAttr->clone(Context); 93d8fe2d56fb5463c9d109e8c6dab2e98b06bee186Anders Carlsson New->addAttr(NewAttr); 94d8fe2d56fb5463c9d109e8c6dab2e98b06bee186Anders Carlsson } 95d8fe2d56fb5463c9d109e8c6dab2e98b06bee186Anders Carlsson} 96d8fe2d56fb5463c9d109e8c6dab2e98b06bee186Anders Carlsson 974f722be4587a7a0dece399fb5405dda158971ae1Douglas GregorDecl * 984f722be4587a7a0dece399fb5405dda158971ae1Douglas GregorTemplateDeclInstantiator::VisitTranslationUnitDecl(TranslationUnitDecl *D) { 994f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor assert(false && "Translation units cannot be instantiated"); 1004f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor return D; 1014f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor} 1024f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor 1034f722be4587a7a0dece399fb5405dda158971ae1Douglas GregorDecl * 10457ad37823e198f977cac605dbfbaefb4daf325e9Chris LattnerTemplateDeclInstantiator::VisitLabelDecl(LabelDecl *D) { 10557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner LabelDecl *Inst = LabelDecl::Create(SemaRef.Context, Owner, D->getLocation(), 10657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner D->getIdentifier()); 10757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Owner->addDecl(Inst); 10857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return Inst; 10957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner} 11057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 11157ad37823e198f977cac605dbfbaefb4daf325e9Chris LattnerDecl * 1124f722be4587a7a0dece399fb5405dda158971ae1Douglas GregorTemplateDeclInstantiator::VisitNamespaceDecl(NamespaceDecl *D) { 1134f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor assert(false && "Namespaces cannot be instantiated"); 1144f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor return D; 1154f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor} 1164f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor 1173dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCallDecl * 1183dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCallTemplateDeclInstantiator::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) { 1193dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall NamespaceAliasDecl *Inst 1203dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall = NamespaceAliasDecl::Create(SemaRef.Context, Owner, 1213dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall D->getNamespaceLoc(), 1223dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall D->getAliasLoc(), 1230cfaf6a270ecd0f5c7e541a8047c87948317548bDouglas Gregor D->getIdentifier(), 1240cfaf6a270ecd0f5c7e541a8047c87948317548bDouglas Gregor D->getQualifierLoc(), 1253dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall D->getTargetNameLoc(), 1263dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall D->getNamespace()); 1273dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall Owner->addDecl(Inst); 1283dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall return Inst; 1293dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall} 1303dbd3d5c04cd5abd7dfd83b15f51d7c610a3c512John McCall 1313e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithDecl *TemplateDeclInstantiator::InstantiateTypedefNameDecl(TypedefNameDecl *D, 1323e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith bool IsTypeAlias) { 1338dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor bool Invalid = false; 134a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = D->getTypeSourceInfo(); 135561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor if (DI->getType()->isInstantiationDependentType() || 136836adf6771d5170d936599dfcce21687e37e9bbfDouglas Gregor DI->getType()->isVariablyModifiedType()) { 137ba6a9bd384df475780be636ca45bcef5c5bbd19fJohn McCall DI = SemaRef.SubstType(DI, TemplateArgs, 138ba6a9bd384df475780be636ca45bcef5c5bbd19fJohn McCall D->getLocation(), D->getDeclName()); 139ba6a9bd384df475780be636ca45bcef5c5bbd19fJohn McCall if (!DI) { 1408dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Invalid = true; 141a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall DI = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.Context.IntTy); 1428dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 143b4eeaff1595b7d0a8fbc2b3c8bec7dc63f48b7fdDouglas Gregor } else { 144b4eeaff1595b7d0a8fbc2b3c8bec7dc63f48b7fdDouglas Gregor SemaRef.MarkDeclarationsReferencedInType(D->getLocation(), DI->getType()); 1458dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 1461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1478dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // Create the new typedef 148162e1c1b487352434552147967c3dd296ebee2f7Richard Smith TypedefNameDecl *Typedef; 149162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (IsTypeAlias) 150162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Typedef = TypeAliasDecl::Create(SemaRef.Context, Owner, D->getLocStart(), 151162e1c1b487352434552147967c3dd296ebee2f7Richard Smith D->getLocation(), D->getIdentifier(), DI); 152162e1c1b487352434552147967c3dd296ebee2f7Richard Smith else 153162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Typedef = TypedefDecl::Create(SemaRef.Context, Owner, D->getLocStart(), 154162e1c1b487352434552147967c3dd296ebee2f7Richard Smith D->getLocation(), D->getIdentifier(), DI); 1558dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Invalid) 1568dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Typedef->setInvalidDecl(); 1578dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 158cde5a400dbc9655eddf0f383585d3cf67c11c539John McCall // If the old typedef was the name for linkage purposes of an anonymous 159cde5a400dbc9655eddf0f383585d3cf67c11c539John McCall // tag decl, re-establish that relationship for the new typedef. 160cde5a400dbc9655eddf0f383585d3cf67c11c539John McCall if (const TagType *oldTagType = D->getUnderlyingType()->getAs<TagType>()) { 161cde5a400dbc9655eddf0f383585d3cf67c11c539John McCall TagDecl *oldTag = oldTagType->getDecl(); 162162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (oldTag->getTypedefNameForAnonDecl() == D) { 163cde5a400dbc9655eddf0f383585d3cf67c11c539John McCall TagDecl *newTag = DI->getType()->castAs<TagType>()->getDecl(); 164162e1c1b487352434552147967c3dd296ebee2f7Richard Smith assert(!newTag->getIdentifier() && !newTag->getTypedefNameForAnonDecl()); 165162e1c1b487352434552147967c3dd296ebee2f7Richard Smith newTag->setTypedefNameForAnonDecl(Typedef); 166cde5a400dbc9655eddf0f383585d3cf67c11c539John McCall } 167d57a38ee02c285d69d05fed6df0d7406b2517888Douglas Gregor } 168d57a38ee02c285d69d05fed6df0d7406b2517888Douglas Gregor 169162e1c1b487352434552147967c3dd296ebee2f7Richard Smith if (TypedefNameDecl *Prev = D->getPreviousDeclaration()) { 1707c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NamedDecl *InstPrev = SemaRef.FindInstantiatedDecl(D->getLocation(), Prev, 1717c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor TemplateArgs); 172b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor if (!InstPrev) 173b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor return 0; 174b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor 175162e1c1b487352434552147967c3dd296ebee2f7Richard Smith Typedef->setPreviousDeclaration(cast<TypedefNameDecl>(InstPrev)); 1765126fd0dd92c4ec211c837ee78d5ce59c68dcbd5John McCall } 1775126fd0dd92c4ec211c837ee78d5ce59c68dcbd5John McCall 1781d8d1ccd36888f1120b3a1df9e76f35dc2edb81dJohn McCall SemaRef.InstantiateAttrs(TemplateArgs, D, Typedef); 179d57a38ee02c285d69d05fed6df0d7406b2517888Douglas Gregor 18046460a68f6508775e98c19b4bb8454bb471aac24John McCall Typedef->setAccess(D->getAccess()); 1811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1828dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Typedef; 1838dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 1848dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 185162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *TemplateDeclInstantiator::VisitTypedefDecl(TypedefDecl *D) { 1863e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Decl *Typedef = InstantiateTypedefNameDecl(D, /*IsTypeAlias=*/false); 1873e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Owner->addDecl(Typedef); 1883e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return Typedef; 189162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 190162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 191162e1c1b487352434552147967c3dd296ebee2f7Richard SmithDecl *TemplateDeclInstantiator::VisitTypeAliasDecl(TypeAliasDecl *D) { 1923e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Decl *Typedef = InstantiateTypedefNameDecl(D, /*IsTypeAlias=*/true); 1933e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Owner->addDecl(Typedef); 1943e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return Typedef; 1953e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 1963e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 1973e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithDecl * 1983e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTemplateDeclInstantiator::VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { 1993e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith // Create a local instantiation scope for this type alias template, which 2003e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith // will contain the instantiations of the template parameters. 2013e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith LocalInstantiationScope Scope(SemaRef); 2023e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2033e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TemplateParameterList *TempParams = D->getTemplateParameters(); 2043e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TemplateParameterList *InstParams = SubstTemplateParams(TempParams); 2053e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (!InstParams) 2063e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return 0; 2073e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2083e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TypeAliasDecl *Pattern = D->getTemplatedDecl(); 2093e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2103e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TypeAliasTemplateDecl *PrevAliasTemplate = 0; 2113e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (Pattern->getPreviousDeclaration()) { 2123e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith DeclContext::lookup_result Found = Owner->lookup(Pattern->getDeclName()); 2133e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (Found.first != Found.second) { 2143e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith PrevAliasTemplate = dyn_cast<TypeAliasTemplateDecl>(*Found.first); 2153e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith } 2163e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith } 2173e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2183e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TypeAliasDecl *AliasInst = cast_or_null<TypeAliasDecl>( 2193e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith InstantiateTypedefNameDecl(Pattern, /*IsTypeAlias=*/true)); 2203e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (!AliasInst) 2213e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return 0; 2223e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2233e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TypeAliasTemplateDecl *Inst 2243e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith = TypeAliasTemplateDecl::Create(SemaRef.Context, Owner, D->getLocation(), 2253e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith D->getDeclName(), InstParams, AliasInst); 2263e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (PrevAliasTemplate) 2273e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Inst->setPreviousDeclaration(PrevAliasTemplate); 2283e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2293e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Inst->setAccess(D->getAccess()); 2303e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2313e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith if (!PrevAliasTemplate) 2323e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Inst->setInstantiatedFromMemberTemplate(D); 2333e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2343e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Owner->addDecl(Inst); 2353e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 2363e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return Inst; 237162e1c1b487352434552147967c3dd296ebee2f7Richard Smith} 238162e1c1b487352434552147967c3dd296ebee2f7Richard Smith 2396b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor/// \brief Instantiate an initializer, breaking it into separate 2406b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor/// initialization arguments. 2416b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor/// 2426b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor/// \param Init The initializer to instantiate. 2436b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor/// 2446b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor/// \param TemplateArgs Template arguments to be substituted into the 2456b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor/// initializer. 2466b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor/// 2476b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor/// \param NewArgs Will be filled in with the instantiation arguments. 2486b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor/// 2496b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor/// \returns true if an error occurred, false otherwise 2500ff6f8f038f32d85c32fd984673cea51ef737b22Richard Smithbool Sema::InstantiateInitializer(Expr *Init, 2516b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor const MultiLevelTemplateArgumentList &TemplateArgs, 2520ff6f8f038f32d85c32fd984673cea51ef737b22Richard Smith SourceLocation &LParenLoc, 2530ff6f8f038f32d85c32fd984673cea51ef737b22Richard Smith ASTOwningVector<Expr*> &NewArgs, 2540ff6f8f038f32d85c32fd984673cea51ef737b22Richard Smith SourceLocation &RParenLoc) { 2556b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor NewArgs.clear(); 2566b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor LParenLoc = SourceLocation(); 2576b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor RParenLoc = SourceLocation(); 2586b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor 2596b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor if (!Init) 2606b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor return false; 2616b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor 2624765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init)) 2636b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor Init = ExprTemp->getSubExpr(); 2646b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor 2656b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 2666b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor Init = Binder->getSubExpr(); 2676b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor 2686b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 2696b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor Init = ICE->getSubExprAsWritten(); 2706b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor 2716b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor if (ParenListExpr *ParenList = dyn_cast<ParenListExpr>(Init)) { 2726b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor LParenLoc = ParenList->getLParenLoc(); 2736b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor RParenLoc = ParenList->getRParenLoc(); 2740ff6f8f038f32d85c32fd984673cea51ef737b22Richard Smith return SubstExprs(ParenList->getExprs(), ParenList->getNumExprs(), 2750ff6f8f038f32d85c32fd984673cea51ef737b22Richard Smith true, TemplateArgs, NewArgs); 2766b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor } 2776b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor 2786b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor if (CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init)) { 27928329e511854fdd3b31561b2690f91f9e6a6402eDouglas Gregor if (!isa<CXXTemporaryObjectExpr>(Construct)) { 2800ff6f8f038f32d85c32fd984673cea51ef737b22Richard Smith if (SubstExprs(Construct->getArgs(), Construct->getNumArgs(), true, 2810ff6f8f038f32d85c32fd984673cea51ef737b22Richard Smith TemplateArgs, NewArgs)) 28228329e511854fdd3b31561b2690f91f9e6a6402eDouglas Gregor return true; 28328329e511854fdd3b31561b2690f91f9e6a6402eDouglas Gregor 28428329e511854fdd3b31561b2690f91f9e6a6402eDouglas Gregor // FIXME: Fake locations! 2850ff6f8f038f32d85c32fd984673cea51ef737b22Richard Smith LParenLoc = PP.getLocForEndOfToken(Init->getLocStart()); 286a1a04786cea2445759026edacd096abd1fbf4a05Douglas Gregor RParenLoc = LParenLoc; 28728329e511854fdd3b31561b2690f91f9e6a6402eDouglas Gregor return false; 28828329e511854fdd3b31561b2690f91f9e6a6402eDouglas Gregor } 2896b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor } 2906b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor 2910ff6f8f038f32d85c32fd984673cea51ef737b22Richard Smith ExprResult Result = SubstExpr(Init, TemplateArgs); 2926b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor if (Result.isInvalid()) 2936b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor return true; 2946b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor 2956b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor NewArgs.push_back(Result.takeAs<Expr>()); 2966b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor return false; 2976b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor} 2986b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor 2993d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas GregorDecl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D) { 3009901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor // If this is the variable for an anonymous struct or union, 3019901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor // instantiate the anonymous struct/union type first. 3029901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor if (const RecordType *RecordTy = D->getType()->getAs<RecordType>()) 3039901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor if (RecordTy->getDecl()->isAnonymousStructOrUnion()) 3049901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor if (!VisitCXXRecordDecl(cast<CXXRecordDecl>(RecordTy->getDecl()))) 3059901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor return 0; 3069901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor 307ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCall // Do substitution on the type of the declaration 308a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = SemaRef.SubstType(D->getTypeSourceInfo(), 3090a5fa06a688e1086ea553a24b42b9915996ed1f7John McCall TemplateArgs, 3100a5fa06a688e1086ea553a24b42b9915996ed1f7John McCall D->getTypeSpecStartLoc(), 3110a5fa06a688e1086ea553a24b42b9915996ed1f7John McCall D->getDeclName()); 3120a5fa06a688e1086ea553a24b42b9915996ed1f7John McCall if (!DI) 3133d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor return 0; 3143d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 315c6dbc3fa467e2355b678a6b717534928048efcb2Douglas Gregor if (DI->getType()->isFunctionType()) { 316c6dbc3fa467e2355b678a6b717534928048efcb2Douglas Gregor SemaRef.Diag(D->getLocation(), diag::err_variable_instantiates_to_function) 317c6dbc3fa467e2355b678a6b717534928048efcb2Douglas Gregor << D->isStaticDataMember() << DI->getType(); 318c6dbc3fa467e2355b678a6b717534928048efcb2Douglas Gregor return 0; 319c6dbc3fa467e2355b678a6b717534928048efcb2Douglas Gregor } 320c6dbc3fa467e2355b678a6b717534928048efcb2Douglas Gregor 321b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor // Build the instantiated declaration 3223d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor VarDecl *Var = VarDecl::Create(SemaRef.Context, Owner, 323ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 3243d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor D->getLocation(), D->getIdentifier(), 3250a5fa06a688e1086ea553a24b42b9915996ed1f7John McCall DI->getType(), DI, 32616573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor D->getStorageClass(), 32716573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor D->getStorageClassAsWritten()); 3283d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor Var->setThreadSpecified(D->isThreadSpecified()); 3293d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor Var->setCXXDirectInitializer(D->hasCXXDirectInitializer()); 330ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith Var->setCXXForRangeDecl(D->isCXXForRangeDecl()); 3311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 332b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall // Substitute the nested name specifier, if any. 333b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall if (SubstQualifier(D, Var)) 334b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall return 0; 335b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 3361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If we are instantiating a static data member defined 3377caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // out-of-line, the instantiation will have the same lexical 3387caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // context (which will be a namespace scope) as the template. 3397caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (D->isOutOfLine()) 3407caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor Var->setLexicalDeclContext(D->getLexicalDeclContext()); 3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34246460a68f6508775e98c19b4bb8454bb471aac24John McCall Var->setAccess(D->getAccess()); 343c070cc602d6eefea881f71a60de09e05b54c3fddDouglas Gregor 3446b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis if (!D->isStaticDataMember()) { 345c070cc602d6eefea881f71a60de09e05b54c3fddDouglas Gregor Var->setUsed(D->isUsed(false)); 3466b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis Var->setReferenced(D->isReferenced()); 3476b6b42aed07726178f61954ac6e51f47da00275cArgyrios Kyrtzidis } 3484469e8a97cdca3725b4f8f366916143113c029acDouglas Gregor 349390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // FIXME: In theory, we could have a previous declaration for variables that 350390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // are not static data members. 3513d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor bool Redeclaration = false; 3526826314938f8510cd1a6b03b5d032592456ae27bJohn McCall // FIXME: having to fake up a LookupResult is dumb. 3536826314938f8510cd1a6b03b5d032592456ae27bJohn McCall LookupResult Previous(SemaRef, Var->getDeclName(), Var->getLocation(), 354449d0a829007ea654912098e6a73134a2c529d61Douglas Gregor Sema::LookupOrdinaryName, Sema::ForRedeclaration); 35560c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor if (D->isStaticDataMember()) 35660c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor SemaRef.LookupQualifiedName(Previous, Owner, false); 3576826314938f8510cd1a6b03b5d032592456ae27bJohn McCall SemaRef.CheckVariableDeclaration(Var, Previous, Redeclaration); 3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3597caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (D->isOutOfLine()) { 360ea7b4880bc07cd99b3994c2a95d722a06ab56594Abramo Bagnara if (!D->isStaticDataMember()) 361ea7b4880bc07cd99b3994c2a95d722a06ab56594Abramo Bagnara D->getLexicalDeclContext()->addDecl(Var); 3627caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor Owner->makeDeclVisibleInContext(Var); 3637caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor } else { 3647caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor Owner->addDecl(Var); 365f7d72f5a4a3f0e610d77c6779ca3c21920a14bc7Douglas Gregor if (Owner->isFunctionOrMethod()) 366f7d72f5a4a3f0e610d77c6779ca3c21920a14bc7Douglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Var); 3677caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor } 3681d8d1ccd36888f1120b3a1df9e76f35dc2edb81dJohn McCall SemaRef.InstantiateAttrs(TemplateArgs, D, Var); 3698dd0c5626455cdf94280783e85e413eed6cbf3d9Fariborz Jahanian 370251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor // Link instantiations of static data members back to the template from 371251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor // which they were instantiated. 372251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor if (Var->isStaticDataMember()) 373251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor SemaRef.Context.setInstantiatedFromStaticDataMember(Var, D, 374cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor TSK_ImplicitInstantiation); 375251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor 37660c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor if (Var->getAnyInitializer()) { 37760c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor // We already have an initializer in the class. 37860c93c9981c467738369702e7aa23fd58c2b6aacDouglas Gregor } else if (D->getInit()) { 3791f5f3a4d58a1c7c50c331b33329fc14563533c04Douglas Gregor if (Var->isStaticDataMember() && !D->isOutOfLine()) 3801f5f3a4d58a1c7c50c331b33329fc14563533c04Douglas Gregor SemaRef.PushExpressionEvaluationContext(Sema::Unevaluated); 3811f5f3a4d58a1c7c50c331b33329fc14563533c04Douglas Gregor else 3821f5f3a4d58a1c7c50c331b33329fc14563533c04Douglas Gregor SemaRef.PushExpressionEvaluationContext(Sema::PotentiallyEvaluated); 3831f5f3a4d58a1c7c50c331b33329fc14563533c04Douglas Gregor 3846b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor // Instantiate the initializer. 3856b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor SourceLocation LParenLoc, RParenLoc; 386ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> InitArgs(SemaRef); 3870ff6f8f038f32d85c32fd984673cea51ef737b22Richard Smith if (!SemaRef.InstantiateInitializer(D->getInit(), TemplateArgs, LParenLoc, 3880ff6f8f038f32d85c32fd984673cea51ef737b22Richard Smith InitArgs, RParenLoc)) { 38934b41d939a1328f484511c6002ba2456db879a29Richard Smith bool TypeMayContainAuto = true; 39007a77b4b1d1fa95930129541eff8b79558f5d80dDouglas Gregor // Attach the initializer to the declaration, if we have one. 39107a77b4b1d1fa95930129541eff8b79558f5d80dDouglas Gregor if (InitArgs.size() == 0) 39234b41d939a1328f484511c6002ba2456db879a29Richard Smith SemaRef.ActOnUninitializedDecl(Var, TypeMayContainAuto); 39307a77b4b1d1fa95930129541eff8b79558f5d80dDouglas Gregor else if (D->hasCXXDirectInitializer()) { 3946eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor // Add the direct initializer to the declaration. 395d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall SemaRef.AddCXXDirectInitializerToDecl(Var, 3966b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor LParenLoc, 3976eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor move_arg(InitArgs), 39834b41d939a1328f484511c6002ba2456db879a29Richard Smith RParenLoc, 39934b41d939a1328f484511c6002ba2456db879a29Richard Smith TypeMayContainAuto); 40007a77b4b1d1fa95930129541eff8b79558f5d80dDouglas Gregor } else { 40107a77b4b1d1fa95930129541eff8b79558f5d80dDouglas Gregor assert(InitArgs.size() == 1); 4029ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Expr *Init = InitArgs.take()[0]; 40334b41d939a1328f484511c6002ba2456db879a29Richard Smith SemaRef.AddInitializerToDecl(Var, Init, false, TypeMayContainAuto); 40483ddad3ab513f5d73698cf9fbeb4ed3f011bc3b9Douglas Gregor } 4056eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor } else { 4066b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor // FIXME: Not too happy about invalidating the declaration 4076b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor // because of a bogus initializer. 4086b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor Var->setInvalidDecl(); 4096eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor } 4106eef519fc8a97bb7ca6066f23d35e10f06b2c1b5Douglas Gregor 4111f5f3a4d58a1c7c50c331b33329fc14563533c04Douglas Gregor SemaRef.PopExpressionEvaluationContext(); 412ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith } else if ((!Var->isStaticDataMember() || Var->isOutOfLine()) && 413ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith !Var->isCXXForRangeDecl()) 414d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall SemaRef.ActOnUninitializedDecl(Var, false); 4153d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 416e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith // Diagnose unused local variables with dependent types, where the diagnostic 417e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith // will have been deferred. 418e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith if (!Var->isInvalidDecl() && Owner->isFunctionOrMethod() && !Var->isUsed() && 419e3499cae8e5323ac553ad56977bf1cd42b9a5a35Richard Smith D->getType()->isDependentType()) 4205764f613e61cb3183f3d7ceeafd23396de96ed16Douglas Gregor SemaRef.DiagnoseUnusedDecl(Var); 421bbc6454bb98d6a6ecbaafa715222c5db834307f2Argyrios Kyrtzidis 4223d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor return Var; 4233d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor} 4243d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 4256206d53f67613958ae1b023aba337ebb46f11a8bAbramo BagnaraDecl *TemplateDeclInstantiator::VisitAccessSpecDecl(AccessSpecDecl *D) { 4266206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara AccessSpecDecl* AD 4276206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara = AccessSpecDecl::Create(SemaRef.Context, D->getAccess(), Owner, 4286206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara D->getAccessSpecifierLoc(), D->getColonLoc()); 4296206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara Owner->addHiddenDecl(AD); 4306206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara return AD; 4316206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara} 4326206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara 4338dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *TemplateDeclInstantiator::VisitFieldDecl(FieldDecl *D) { 4348dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor bool Invalid = false; 435a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *DI = D->getTypeSourceInfo(); 436561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor if (DI->getType()->isInstantiationDependentType() || 437836adf6771d5170d936599dfcce21687e37e9bbfDouglas Gregor DI->getType()->isVariablyModifiedType()) { 43807fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall DI = SemaRef.SubstType(DI, TemplateArgs, 43907fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall D->getLocation(), D->getDeclName()); 44007fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall if (!DI) { 441a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall DI = D->getTypeSourceInfo(); 44207fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall Invalid = true; 44307fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall } else if (DI->getType()->isFunctionType()) { 4448dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // C++ [temp.arg.type]p3: 4458dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // If a declaration acquires a function type through a type 4468dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // dependent on a template-parameter and this causes a 4478dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // declaration that does not use the syntactic form of a 4488dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // function declarator to have function type, the program is 4498dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // ill-formed. 4508dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor SemaRef.Diag(D->getLocation(), diag::err_field_instantiates_to_function) 45107fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall << DI->getType(); 4528dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Invalid = true; 4538dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 454b4eeaff1595b7d0a8fbc2b3c8bec7dc63f48b7fdDouglas Gregor } else { 455b4eeaff1595b7d0a8fbc2b3c8bec7dc63f48b7fdDouglas Gregor SemaRef.MarkDeclarationsReferencedInType(D->getLocation(), DI->getType()); 4568dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 4578dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 4588dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Expr *BitWidth = D->getBitWidth(); 4598dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Invalid) 4608dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor BitWidth = 0; 4618dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor else if (BitWidth) { 462ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor // The bit-width expression is not potentially evaluated. 463f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 4641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46560d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult InstantiatedBitWidth 466ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCall = SemaRef.SubstExpr(BitWidth, TemplateArgs); 4678dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (InstantiatedBitWidth.isInvalid()) { 4688dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Invalid = true; 4698dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor BitWidth = 0; 4708dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } else 471e9146f2e9f1c4e281544e8c080934c72d41012caAnders Carlsson BitWidth = InstantiatedBitWidth.takeAs<Expr>(); 4728dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 4738dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 47407fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall FieldDecl *Field = SemaRef.CheckFieldDecl(D->getDeclName(), 47507fb6bef6242c0f2ab47f059583edbdef924823eJohn McCall DI->getType(), DI, 4761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump cast<RecordDecl>(Owner), 4778dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getLocation(), 4788dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->isMutable(), 4798dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor BitWidth, 4807a614d8380297fcd2bc23986241905d97222948cRichard Smith D->hasInClassInitializer(), 481ea218b8e8f9ba82d1c76bcb7e86d121a5f65ebedSteve Naroff D->getTypeSpecStartLoc(), 4828dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getAccess(), 4838dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 0); 484663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas Gregor if (!Field) { 485663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas Gregor cast<Decl>(Owner)->setInvalidDecl(); 486f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson return 0; 487663b5a0be7261c29bc4c526a71cffcfa02d4153eDouglas Gregor } 4881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4891d8d1ccd36888f1120b3a1df9e76f35dc2edb81dJohn McCall SemaRef.InstantiateAttrs(TemplateArgs, D, Field); 490d8fe2d56fb5463c9d109e8c6dab2e98b06bee186Anders Carlsson 491f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson if (Invalid) 492f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson Field->setInvalidDecl(); 4931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 494f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson if (!Field->getDeclName()) { 495f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson // Keep track of where this decl came from. 496f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson SemaRef.Context.setInstantiatedFromUnnamedFieldDecl(Field, D); 4979901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor } 4989901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor if (CXXRecordDecl *Parent= dyn_cast<CXXRecordDecl>(Field->getDeclContext())) { 4999901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor if (Parent->isAnonymousStructOrUnion() && 5007a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl Parent->getRedeclContext()->isFunctionOrMethod()) 5019901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Field); 5028dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 5031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 504f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson Field->setImplicit(D->isImplicit()); 50546460a68f6508775e98c19b4bb8454bb471aac24John McCall Field->setAccess(D->getAccess()); 506f4b5f5c6a1487317aab9aa30d97bccfd57c82c98Anders Carlsson Owner->addDecl(Field); 5078dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 5088dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Field; 5098dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 5108dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 51187c2e121cf0522fc266efe2922b58091cd2e0182Francois PichetDecl *TemplateDeclInstantiator::VisitIndirectFieldDecl(IndirectFieldDecl *D) { 51287c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet NamedDecl **NamedChain = 51387c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet new (SemaRef.Context)NamedDecl*[D->getChainingSize()]; 51487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 51587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet int i = 0; 51687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet for (IndirectFieldDecl::chain_iterator PI = 51787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet D->chain_begin(), PE = D->chain_end(); 518b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor PI != PE; ++PI) { 519b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor NamedDecl *Next = SemaRef.FindInstantiatedDecl(D->getLocation(), *PI, 520b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor TemplateArgs); 521b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor if (!Next) 522b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor return 0; 523b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor 524b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor NamedChain[i++] = Next; 525b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor } 52687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 52740e17752086c2c497951d64f5ac6ab5039466113Francois Pichet QualType T = cast<FieldDecl>(NamedChain[i-1])->getType(); 52887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet IndirectFieldDecl* IndirectField 52987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet = IndirectFieldDecl::Create(SemaRef.Context, Owner, D->getLocation(), 53040e17752086c2c497951d64f5ac6ab5039466113Francois Pichet D->getIdentifier(), T, 53187c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet NamedChain, D->getChainingSize()); 53287c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 53387c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 53487c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet IndirectField->setImplicit(D->isImplicit()); 53587c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet IndirectField->setAccess(D->getAccess()); 53687c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet Owner->addDecl(IndirectField); 53787c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet return IndirectField; 53887c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet} 53987c2e121cf0522fc266efe2922b58091cd2e0182Francois Pichet 54002cace78cf48cc26686bd5b07c78606abca13bcdJohn McCallDecl *TemplateDeclInstantiator::VisitFriendDecl(FriendDecl *D) { 54102cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall // Handle friend type expressions by simply substituting template 54206245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor // parameters into the pattern type and checking the result. 54332f2fb53d9d7c28c94d8569fd0fcf06cccee0c3dJohn McCall if (TypeSourceInfo *Ty = D->getFriendType()) { 5444fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TypeSourceInfo *InstTy; 5454fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth // If this is an unsupported friend, don't bother substituting template 5464fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth // arguments into it. The actual type referred to won't be used by any 5474fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth // parts of Clang, and may not be valid for instantiating. Just use the 5484fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth // same info for the instantiated friend. 5494fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth if (D->isUnsupportedFriend()) { 5504fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth InstTy = Ty; 5514fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth } else { 5524fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth InstTy = SemaRef.SubstType(Ty, TemplateArgs, 5534fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth D->getLocation(), DeclarationName()); 5544fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth } 5554fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth if (!InstTy) 55606245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor return 0; 557fd810b1386ed29b250e7d522ea826a65c815e49dJohn McCall 55806245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor FriendDecl *FD = SemaRef.CheckFriendTypeDecl(D->getFriendLoc(), InstTy); 55906245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor if (!FD) 56006245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor return 0; 56106245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor 56206245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor FD->setAccess(AS_public); 5639a34edb710917798aa30263374f624f13b594605John McCall FD->setUnsupportedFriend(D->isUnsupportedFriend()); 56406245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor Owner->addDecl(FD); 56506245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor return FD; 56606245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor } 56706245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor 56806245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor NamedDecl *ND = D->getFriendDecl(); 56906245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor assert(ND && "friend decl must be a decl or a type!"); 57032f2fb53d9d7c28c94d8569fd0fcf06cccee0c3dJohn McCall 571af2094e7cecadf36667deb61a83587ffdd979bd3John McCall // All of the Visit implementations for the various potential friend 572af2094e7cecadf36667deb61a83587ffdd979bd3John McCall // declarations have to be carefully written to work for friend 573af2094e7cecadf36667deb61a83587ffdd979bd3John McCall // objects, with the most important detail being that the target 574af2094e7cecadf36667deb61a83587ffdd979bd3John McCall // decl should almost certainly not be placed in Owner. 575af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Decl *NewND = Visit(ND); 57606245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor if (!NewND) return 0; 5771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57802cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall FriendDecl *FD = 57906245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor FriendDecl::Create(SemaRef.Context, Owner, D->getLocation(), 58006245bfb3ae40bb24a8bfb17eafeb266a4daf5caDouglas Gregor cast<NamedDecl>(NewND), D->getFriendLoc()); 5815fee110ac106370f75592df024001de73edced2aJohn McCall FD->setAccess(AS_public); 5829a34edb710917798aa30263374f624f13b594605John McCall FD->setUnsupportedFriend(D->isUnsupportedFriend()); 58302cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall Owner->addDecl(FD); 58402cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall return FD; 585fd810b1386ed29b250e7d522ea826a65c815e49dJohn McCall} 586fd810b1386ed29b250e7d522ea826a65c815e49dJohn McCall 5878dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *TemplateDeclInstantiator::VisitStaticAssertDecl(StaticAssertDecl *D) { 5888dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Expr *AssertExpr = D->getAssertExpr(); 5891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 590ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor // The expression in a static assertion is not potentially evaluated. 591f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 5921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 59360d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult InstantiatedAssertExpr 594ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCall = SemaRef.SubstExpr(AssertExpr, TemplateArgs); 5958dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (InstantiatedAssertExpr.isInvalid()) 5968dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return 0; 5978dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 59860d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Message(D->getMessage()); 5993fa5cae9b3812cab9fab6c042c3329bb70a3d046John McCall D->getMessage(); 600d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall return SemaRef.ActOnStaticAssertDeclaration(D->getLocation(), 6019ae2f076ca5ab1feb3ba95629099ec2319833701John McCall InstantiatedAssertExpr.get(), 602a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara Message.get(), 603a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara D->getRParenLoc()); 6048dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 6058dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 6068dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *TemplateDeclInstantiator::VisitEnumDecl(EnumDecl *D) { 607ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara EnumDecl *Enum = EnumDecl::Create(SemaRef.Context, Owner, D->getLocStart(), 6088dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getLocation(), D->getIdentifier(), 609a88cefd266c428be33cc06f7e8b00ff8fc97c1ffAbramo Bagnara /*PrevDecl=*/0, D->isScoped(), 610a88cefd266c428be33cc06f7e8b00ff8fc97c1ffAbramo Bagnara D->isScopedUsingClassTag(), D->isFixed()); 6111274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor if (D->isFixed()) { 6121274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor if (TypeSourceInfo* TI = D->getIntegerTypeSourceInfo()) { 6131274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor // If we have type source information for the underlying type, it means it 6141274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor // has been explicitly set by the user. Perform substitution on it before 6151274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor // moving on. 6161274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc(); 6171274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor Enum->setIntegerTypeSourceInfo(SemaRef.SubstType(TI, 6181274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor TemplateArgs, 6191274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor UnderlyingLoc, 6201274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor DeclarationName())); 6211274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor 6221274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor if (!Enum->getIntegerTypeSourceInfo()) 6231274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor Enum->setIntegerType(SemaRef.Context.IntTy); 6241274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor } 6251274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor else { 6261274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor assert(!D->getIntegerType()->isDependentType() 6271274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor && "Dependent type without type source info"); 6281274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor Enum->setIntegerType(D->getIntegerType()); 6291274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor } 6301274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor } 6311274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor 6325b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall SemaRef.InstantiateAttrs(TemplateArgs, D, Enum); 6335b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall 6348dbc3c64965f99e48830885835b7d2fc26ec3cf5Douglas Gregor Enum->setInstantiationOfMemberEnum(D); 63506c0fecd197fef21e265a41bca8dc5022de1f864Douglas Gregor Enum->setAccess(D->getAccess()); 636b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall if (SubstQualifier(D, Enum)) return 0; 63717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Owner->addDecl(Enum); 6388dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Enum->startDefinition(); 6398dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 64096084f171f4824397dc48453146f0a9719cb9247Douglas Gregor if (D->getDeclContext()->isFunctionOrMethod()) 64196084f171f4824397dc48453146f0a9719cb9247Douglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Enum); 64296084f171f4824397dc48453146f0a9719cb9247Douglas Gregor 6435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Decl*, 4> Enumerators; 6448dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 6458dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EnumConstantDecl *LastEnumConst = 0; 64617945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis for (EnumDecl::enumerator_iterator EC = D->enumerator_begin(), 64717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis ECEnd = D->enumerator_end(); 6488dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EC != ECEnd; ++EC) { 6498dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // The specified value for the enumerator. 65060d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Value = SemaRef.Owned((Expr *)0); 651ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor if (Expr *UninstValue = EC->getInitExpr()) { 652ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor // The enumerator's value expression is not potentially evaluated. 6531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(SemaRef, 654f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::Unevaluated); 6551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 656ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCall Value = SemaRef.SubstExpr(UninstValue, TemplateArgs); 657ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor } 6588dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 6598dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // Drop the initial value and continue. 6608dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor bool isInvalid = false; 6618dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Value.isInvalid()) { 6628dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Value = SemaRef.Owned((Expr *)0); 6638dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor isInvalid = true; 6648dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 6658dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 6661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnumConstantDecl *EnumConst 6678dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor = SemaRef.CheckEnumConstant(Enum, LastEnumConst, 6688dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EC->getLocation(), EC->getIdentifier(), 6699ae2f076ca5ab1feb3ba95629099ec2319833701John McCall Value.get()); 6708dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 6718dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (isInvalid) { 6728dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (EnumConst) 6738dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EnumConst->setInvalidDecl(); 6748dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Enum->setInvalidDecl(); 6758dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 6768dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 6778dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (EnumConst) { 6785b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall SemaRef.InstantiateAttrs(TemplateArgs, *EC, EnumConst); 6795b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall 6803b85ecf2049c8670eba30d0c06f28f64168af9b8John McCall EnumConst->setAccess(Enum->getAccess()); 68117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Enum->addDecl(EnumConst); 682d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall Enumerators.push_back(EnumConst); 6838dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor LastEnumConst = EnumConst; 68496084f171f4824397dc48453146f0a9719cb9247Douglas Gregor 68596084f171f4824397dc48453146f0a9719cb9247Douglas Gregor if (D->getDeclContext()->isFunctionOrMethod()) { 68696084f171f4824397dc48453146f0a9719cb9247Douglas Gregor // If the enumeration is within a function or method, record the enum 68796084f171f4824397dc48453146f0a9719cb9247Douglas Gregor // constant as a local. 68896084f171f4824397dc48453146f0a9719cb9247Douglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(*EC, EnumConst); 68996084f171f4824397dc48453146f0a9719cb9247Douglas Gregor } 6908dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 6918dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 6921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 693c6e35aae23bc3cea7daf5ee075fa695c01c0f66fMike Stump // FIXME: Fixup LBraceLoc and RBraceLoc 694fee13819693c8492f0c364bc704645e844ef737aEdward O'Callaghan // FIXME: Empty Scope and AttributeList (required to handle attribute packed). 695c6e35aae23bc3cea7daf5ee075fa695c01c0f66fMike Stump SemaRef.ActOnEnumBody(Enum->getLocation(), SourceLocation(), SourceLocation(), 696d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall Enum, 697de7a0fcdf9f30cb5a97aab614f3975d93cd9926fEli Friedman Enumerators.data(), Enumerators.size(), 698fee13819693c8492f0c364bc704645e844ef737aEdward O'Callaghan 0, 0); 6998dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 7008dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Enum; 7018dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 7028dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 7036477b69cc93e0a0ff15036d60d604f3544da0f29Douglas GregorDecl *TemplateDeclInstantiator::VisitEnumConstantDecl(EnumConstantDecl *D) { 7046477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor assert(false && "EnumConstantDecls can only occur within EnumDecls."); 7056477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor return 0; 7066477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor} 7076477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor 708e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCallDecl *TemplateDeclInstantiator::VisitClassTemplateDecl(ClassTemplateDecl *D) { 70993ba8579c341d5329175f1413cdc3b35a36592d2John McCall bool isFriend = (D->getFriendObjectKind() != Decl::FOK_None); 71093ba8579c341d5329175f1413cdc3b35a36592d2John McCall 711550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // Create a local instantiation scope for this class template, which 712550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // will contain the instantiations of the template parameters. 7132a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall LocalInstantiationScope Scope(SemaRef); 714e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall TemplateParameterList *TempParams = D->getTemplateParameters(); 715ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCall TemplateParameterList *InstParams = SubstTemplateParams(TempParams); 7161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!InstParams) 717d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor return NULL; 718e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 719e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall CXXRecordDecl *Pattern = D->getTemplatedDecl(); 72093ba8579c341d5329175f1413cdc3b35a36592d2John McCall 72193ba8579c341d5329175f1413cdc3b35a36592d2John McCall // Instantiate the qualifier. We have to do this first in case 72293ba8579c341d5329175f1413cdc3b35a36592d2John McCall // we're a friend declaration, because if we are then we need to put 72393ba8579c341d5329175f1413cdc3b35a36592d2John McCall // the new declaration in the appropriate context. 724c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc = Pattern->getQualifierLoc(); 725c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) { 726c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc, 727c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TemplateArgs); 728c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (!QualifierLoc) 729c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return 0; 73093ba8579c341d5329175f1413cdc3b35a36592d2John McCall } 73193ba8579c341d5329175f1413cdc3b35a36592d2John McCall 73293ba8579c341d5329175f1413cdc3b35a36592d2John McCall CXXRecordDecl *PrevDecl = 0; 73393ba8579c341d5329175f1413cdc3b35a36592d2John McCall ClassTemplateDecl *PrevClassTemplate = 0; 73493ba8579c341d5329175f1413cdc3b35a36592d2John McCall 73537574f55cd637340f651330f5cfda69742880d36Nick Lewycky if (!isFriend && Pattern->getPreviousDeclaration()) { 73637574f55cd637340f651330f5cfda69742880d36Nick Lewycky DeclContext::lookup_result Found = Owner->lookup(Pattern->getDeclName()); 73737574f55cd637340f651330f5cfda69742880d36Nick Lewycky if (Found.first != Found.second) { 73837574f55cd637340f651330f5cfda69742880d36Nick Lewycky PrevClassTemplate = dyn_cast<ClassTemplateDecl>(*Found.first); 73937574f55cd637340f651330f5cfda69742880d36Nick Lewycky if (PrevClassTemplate) 74037574f55cd637340f651330f5cfda69742880d36Nick Lewycky PrevDecl = PrevClassTemplate->getTemplatedDecl(); 74137574f55cd637340f651330f5cfda69742880d36Nick Lewycky } 74237574f55cd637340f651330f5cfda69742880d36Nick Lewycky } 74337574f55cd637340f651330f5cfda69742880d36Nick Lewycky 74493ba8579c341d5329175f1413cdc3b35a36592d2John McCall // If this isn't a friend, then it's a member template, in which 74593ba8579c341d5329175f1413cdc3b35a36592d2John McCall // case we just want to build the instantiation in the 74693ba8579c341d5329175f1413cdc3b35a36592d2John McCall // specialization. If it is a friend, we want to build it in 74793ba8579c341d5329175f1413cdc3b35a36592d2John McCall // the appropriate context. 74893ba8579c341d5329175f1413cdc3b35a36592d2John McCall DeclContext *DC = Owner; 74993ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (isFriend) { 750c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) { 75193ba8579c341d5329175f1413cdc3b35a36592d2John McCall CXXScopeSpec SS; 752c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SS.Adopt(QualifierLoc); 75393ba8579c341d5329175f1413cdc3b35a36592d2John McCall DC = SemaRef.computeDeclContext(SS); 75493ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (!DC) return 0; 75593ba8579c341d5329175f1413cdc3b35a36592d2John McCall } else { 75693ba8579c341d5329175f1413cdc3b35a36592d2John McCall DC = SemaRef.FindInstantiatedContext(Pattern->getLocation(), 75793ba8579c341d5329175f1413cdc3b35a36592d2John McCall Pattern->getDeclContext(), 75893ba8579c341d5329175f1413cdc3b35a36592d2John McCall TemplateArgs); 75993ba8579c341d5329175f1413cdc3b35a36592d2John McCall } 76093ba8579c341d5329175f1413cdc3b35a36592d2John McCall 76193ba8579c341d5329175f1413cdc3b35a36592d2John McCall // Look for a previous declaration of the template in the owning 76293ba8579c341d5329175f1413cdc3b35a36592d2John McCall // context. 76393ba8579c341d5329175f1413cdc3b35a36592d2John McCall LookupResult R(SemaRef, Pattern->getDeclName(), Pattern->getLocation(), 76493ba8579c341d5329175f1413cdc3b35a36592d2John McCall Sema::LookupOrdinaryName, Sema::ForRedeclaration); 76593ba8579c341d5329175f1413cdc3b35a36592d2John McCall SemaRef.LookupQualifiedName(R, DC); 76693ba8579c341d5329175f1413cdc3b35a36592d2John McCall 76793ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (R.isSingleResult()) { 76893ba8579c341d5329175f1413cdc3b35a36592d2John McCall PrevClassTemplate = R.getAsSingle<ClassTemplateDecl>(); 76993ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (PrevClassTemplate) 77093ba8579c341d5329175f1413cdc3b35a36592d2John McCall PrevDecl = PrevClassTemplate->getTemplatedDecl(); 77193ba8579c341d5329175f1413cdc3b35a36592d2John McCall } 77293ba8579c341d5329175f1413cdc3b35a36592d2John McCall 773c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (!PrevClassTemplate && QualifierLoc) { 77493ba8579c341d5329175f1413cdc3b35a36592d2John McCall SemaRef.Diag(Pattern->getLocation(), diag::err_not_tag_in_scope) 7751eabb7d0c30f6a876b0fd03ad4656c096c26b8d0Douglas Gregor << D->getTemplatedDecl()->getTagKind() << Pattern->getDeclName() << DC 776c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor << QualifierLoc.getSourceRange(); 77793ba8579c341d5329175f1413cdc3b35a36592d2John McCall return 0; 77893ba8579c341d5329175f1413cdc3b35a36592d2John McCall } 77993ba8579c341d5329175f1413cdc3b35a36592d2John McCall 780c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor bool AdoptedPreviousTemplateParams = false; 78193ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (PrevClassTemplate) { 782c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor bool Complain = true; 783c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor 784c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor // HACK: libstdc++ 4.2.1 contains an ill-formed friend class 785c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor // template for struct std::tr1::__detail::_Map_base, where the 786c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor // template parameters of the friend declaration don't match the 787c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor // template parameters of the original declaration. In this one 788c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor // case, we don't complain about the ill-formed friend 789c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor // declaration. 790c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor if (isFriend && Pattern->getIdentifier() && 791c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor Pattern->getIdentifier()->isStr("_Map_base") && 792c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor DC->isNamespace() && 793c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor cast<NamespaceDecl>(DC)->getIdentifier() && 794c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__detail")) { 795c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor DeclContext *DCParent = DC->getParent(); 796c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor if (DCParent->isNamespace() && 797c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor cast<NamespaceDecl>(DCParent)->getIdentifier() && 798c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor cast<NamespaceDecl>(DCParent)->getIdentifier()->isStr("tr1")) { 799c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor DeclContext *DCParent2 = DCParent->getParent(); 800c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor if (DCParent2->isNamespace() && 801c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor cast<NamespaceDecl>(DCParent2)->getIdentifier() && 802c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor cast<NamespaceDecl>(DCParent2)->getIdentifier()->isStr("std") && 803c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor DCParent2->getParent()->isTranslationUnit()) 804c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor Complain = false; 805c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor } 806c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor } 807c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor 80893ba8579c341d5329175f1413cdc3b35a36592d2John McCall TemplateParameterList *PrevParams 80993ba8579c341d5329175f1413cdc3b35a36592d2John McCall = PrevClassTemplate->getTemplateParameters(); 81093ba8579c341d5329175f1413cdc3b35a36592d2John McCall 81193ba8579c341d5329175f1413cdc3b35a36592d2John McCall // Make sure the parameter lists match. 81293ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (!SemaRef.TemplateParameterListsAreEqual(InstParams, PrevParams, 813c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor Complain, 814c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor Sema::TPL_TemplateMatch)) { 815c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor if (Complain) 816c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor return 0; 817c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor 818c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor AdoptedPreviousTemplateParams = true; 819c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor InstParams = PrevParams; 820c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor } 82193ba8579c341d5329175f1413cdc3b35a36592d2John McCall 82293ba8579c341d5329175f1413cdc3b35a36592d2John McCall // Do some additional validation, then merge default arguments 82393ba8579c341d5329175f1413cdc3b35a36592d2John McCall // from the existing declarations. 824c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor if (!AdoptedPreviousTemplateParams && 825c53d0d762010217d02da5aa14be171817d63e3feDouglas Gregor SemaRef.CheckTemplateParameterList(InstParams, PrevParams, 82693ba8579c341d5329175f1413cdc3b35a36592d2John McCall Sema::TPC_ClassTemplate)) 82793ba8579c341d5329175f1413cdc3b35a36592d2John McCall return 0; 82893ba8579c341d5329175f1413cdc3b35a36592d2John McCall } 82993ba8579c341d5329175f1413cdc3b35a36592d2John McCall } 83093ba8579c341d5329175f1413cdc3b35a36592d2John McCall 831e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall CXXRecordDecl *RecordInst 83293ba8579c341d5329175f1413cdc3b35a36592d2John McCall = CXXRecordDecl::Create(SemaRef.Context, Pattern->getTagKind(), DC, 833ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Pattern->getLocStart(), Pattern->getLocation(), 834ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Pattern->getIdentifier(), PrevDecl, 835f0510d49a6985e9284d30cfc36a0df2a6292a638Douglas Gregor /*DelayTypeCreation=*/true); 836e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 837c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) 838c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor RecordInst->setQualifierInfo(QualifierLoc); 839b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 840e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall ClassTemplateDecl *Inst 84193ba8579c341d5329175f1413cdc3b35a36592d2John McCall = ClassTemplateDecl::Create(SemaRef.Context, DC, D->getLocation(), 84293ba8579c341d5329175f1413cdc3b35a36592d2John McCall D->getIdentifier(), InstParams, RecordInst, 84393ba8579c341d5329175f1413cdc3b35a36592d2John McCall PrevClassTemplate); 844e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall RecordInst->setDescribedClassTemplate(Inst); 845ea7390c7b384ce607bfc8fc13c01f37cfc3776f0John McCall 84693ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (isFriend) { 847ea7390c7b384ce607bfc8fc13c01f37cfc3776f0John McCall if (PrevClassTemplate) 848ea7390c7b384ce607bfc8fc13c01f37cfc3776f0John McCall Inst->setAccess(PrevClassTemplate->getAccess()); 849ea7390c7b384ce607bfc8fc13c01f37cfc3776f0John McCall else 850ea7390c7b384ce607bfc8fc13c01f37cfc3776f0John McCall Inst->setAccess(D->getAccess()); 851ea7390c7b384ce607bfc8fc13c01f37cfc3776f0John McCall 85293ba8579c341d5329175f1413cdc3b35a36592d2John McCall Inst->setObjectOfFriendDecl(PrevClassTemplate != 0); 85393ba8579c341d5329175f1413cdc3b35a36592d2John McCall // TODO: do we want to track the instantiation progeny of this 85493ba8579c341d5329175f1413cdc3b35a36592d2John McCall // friend target decl? 85593ba8579c341d5329175f1413cdc3b35a36592d2John McCall } else { 856e8c01bdb56549adcecd71ce39160eea54b2c51c8Douglas Gregor Inst->setAccess(D->getAccess()); 85737574f55cd637340f651330f5cfda69742880d36Nick Lewycky if (!PrevClassTemplate) 85837574f55cd637340f651330f5cfda69742880d36Nick Lewycky Inst->setInstantiatedFromMemberTemplate(D); 85993ba8579c341d5329175f1413cdc3b35a36592d2John McCall } 860f0510d49a6985e9284d30cfc36a0df2a6292a638Douglas Gregor 861f0510d49a6985e9284d30cfc36a0df2a6292a638Douglas Gregor // Trigger creation of the type for the instantiation. 8623cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall SemaRef.Context.getInjectedClassNameType(RecordInst, 86324bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor Inst->getInjectedClassNameSpecialization()); 864ea7390c7b384ce607bfc8fc13c01f37cfc3776f0John McCall 865259571e27e513cfaf691cc7447e09b31a47d5438Douglas Gregor // Finish handling of friends. 86693ba8579c341d5329175f1413cdc3b35a36592d2John McCall if (isFriend) { 86793ba8579c341d5329175f1413cdc3b35a36592d2John McCall DC->makeDeclVisibleInContext(Inst, /*Recoverable*/ false); 868e8c01bdb56549adcecd71ce39160eea54b2c51c8Douglas Gregor return Inst; 869259571e27e513cfaf691cc7447e09b31a47d5438Douglas Gregor } 870e8c01bdb56549adcecd71ce39160eea54b2c51c8Douglas Gregor 871e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall Owner->addDecl(Inst); 872d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor 873d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor if (!PrevClassTemplate) { 874d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor // Queue up any out-of-line partial specializations of this member 875d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor // class template; the client will force their instantiation once 876d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor // the enclosing class has been instantiated. 8775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ClassTemplatePartialSpecializationDecl *, 4> PartialSpecs; 878d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor D->getPartialSpecializations(PartialSpecs); 879d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor for (unsigned I = 0, N = PartialSpecs.size(); I != N; ++I) 880d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor if (PartialSpecs[I]->isOutOfLine()) 881d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor OutOfLinePartialSpecs.push_back(std::make_pair(Inst, PartialSpecs[I])); 882d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor } 883d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor 884e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall return Inst; 885e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall} 886e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 887d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas GregorDecl * 8887974c3b7062f85bb7c0ada34526cdefe1d30f89bDouglas GregorTemplateDeclInstantiator::VisitClassTemplatePartialSpecializationDecl( 8897974c3b7062f85bb7c0ada34526cdefe1d30f89bDouglas Gregor ClassTemplatePartialSpecializationDecl *D) { 890ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor ClassTemplateDecl *ClassTemplate = D->getSpecializedTemplate(); 891ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 892ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Lookup the already-instantiated declaration in the instantiation 893ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // of the class template and return that. 894ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor DeclContext::lookup_result Found 895ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = Owner->lookup(ClassTemplate->getDeclName()); 896ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (Found.first == Found.second) 897ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return 0; 898ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 899ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor ClassTemplateDecl *InstClassTemplate 900ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<ClassTemplateDecl>(*Found.first); 901ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (!InstClassTemplate) 902ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return 0; 903ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 904d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor if (ClassTemplatePartialSpecializationDecl *Result 905d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor = InstClassTemplate->findPartialSpecInstantiatedFromMember(D)) 906d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor return Result; 907d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor 908d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor return InstantiateClassTemplatePartialSpecialization(InstClassTemplate, D); 9097974c3b7062f85bb7c0ada34526cdefe1d30f89bDouglas Gregor} 9107974c3b7062f85bb7c0ada34526cdefe1d30f89bDouglas Gregor 9117974c3b7062f85bb7c0ada34526cdefe1d30f89bDouglas GregorDecl * 912d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas GregorTemplateDeclInstantiator::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { 913550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // Create a local instantiation scope for this function template, which 914550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // will contain the instantiations of the template parameters and then get 915550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // merged with the local instantiation scope for the function template 916550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // itself. 9172a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall LocalInstantiationScope Scope(SemaRef); 918895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor 919d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor TemplateParameterList *TempParams = D->getTemplateParameters(); 920d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor TemplateParameterList *InstParams = SubstTemplateParams(TempParams); 9211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!InstParams) 922d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor return NULL; 923ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 924a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor FunctionDecl *Instantiated = 0; 925a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor if (CXXMethodDecl *DMethod = dyn_cast<CXXMethodDecl>(D->getTemplatedDecl())) 926a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor Instantiated = cast_or_null<FunctionDecl>(VisitCXXMethodDecl(DMethod, 927a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor InstParams)); 928a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor else 929a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor Instantiated = cast_or_null<FunctionDecl>(VisitFunctionDecl( 930a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor D->getTemplatedDecl(), 931a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor InstParams)); 932a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor 933a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor if (!Instantiated) 934d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor return 0; 935d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor 93646460a68f6508775e98c19b4bb8454bb471aac24John McCall Instantiated->setAccess(D->getAccess()); 93746460a68f6508775e98c19b4bb8454bb471aac24John McCall 9381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Link the instantiated function template declaration to the function 939d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // template from which it was instantiated. 94037d68185088947322a97eabdc1c0714b0debd929Douglas Gregor FunctionTemplateDecl *InstTemplate 941a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor = Instantiated->getDescribedFunctionTemplate(); 94237d68185088947322a97eabdc1c0714b0debd929Douglas Gregor InstTemplate->setAccess(D->getAccess()); 943a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor assert(InstTemplate && 944a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor "VisitFunctionDecl/CXXMethodDecl didn't create a template!"); 945e976ffe18ee60b81641423f42ff6feec2f5e3cb7John McCall 946b1a56e767cfb645fcb25027ab728dd5824d92615John McCall bool isFriend = (InstTemplate->getFriendObjectKind() != Decl::FOK_None); 947b1a56e767cfb645fcb25027ab728dd5824d92615John McCall 948e976ffe18ee60b81641423f42ff6feec2f5e3cb7John McCall // Link the instantiation back to the pattern *unless* this is a 949e976ffe18ee60b81641423f42ff6feec2f5e3cb7John McCall // non-definition friend declaration. 950e976ffe18ee60b81641423f42ff6feec2f5e3cb7John McCall if (!InstTemplate->getInstantiatedFromMemberTemplate() && 951b1a56e767cfb645fcb25027ab728dd5824d92615John McCall !(isFriend && !D->getTemplatedDecl()->isThisDeclarationADefinition())) 952a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor InstTemplate->setInstantiatedFromMemberTemplate(D); 953a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor 954b1a56e767cfb645fcb25027ab728dd5824d92615John McCall // Make declarations visible in the appropriate context. 955b1a56e767cfb645fcb25027ab728dd5824d92615John McCall if (!isFriend) 956a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor Owner->addDecl(InstTemplate); 957b1a56e767cfb645fcb25027ab728dd5824d92615John McCall 958d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor return InstTemplate; 959d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor} 960d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor 961d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas GregorDecl *TemplateDeclInstantiator::VisitCXXRecordDecl(CXXRecordDecl *D) { 962d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor CXXRecordDecl *PrevDecl = 0; 963d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor if (D->isInjectedClassName()) 964d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor PrevDecl = cast<CXXRecordDecl>(Owner); 9656c1c1b8c6ca743a5b6b4c81f9ac56392c12c7457John McCall else if (D->getPreviousDeclaration()) { 9667c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->getLocation(), 9677c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor D->getPreviousDeclaration(), 9686c1c1b8c6ca743a5b6b4c81f9ac56392c12c7457John McCall TemplateArgs); 9696c1c1b8c6ca743a5b6b4c81f9ac56392c12c7457John McCall if (!Prev) return 0; 9706c1c1b8c6ca743a5b6b4c81f9ac56392c12c7457John McCall PrevDecl = cast<CXXRecordDecl>(Prev); 9716c1c1b8c6ca743a5b6b4c81f9ac56392c12c7457John McCall } 972d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor 973d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor CXXRecordDecl *Record 9741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = CXXRecordDecl::Create(SemaRef.Context, D->getTagKind(), Owner, 975ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara D->getLocStart(), D->getLocation(), 976ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara D->getIdentifier(), PrevDecl); 977b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 978b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall // Substitute the nested name specifier, if any. 979b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall if (SubstQualifier(D, Record)) 980b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall return 0; 981b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 982d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor Record->setImplicit(D->isImplicit()); 983eaba1af8529c381d7bfd4dd0a8b48d2c01647972Eli Friedman // FIXME: Check against AS_none is an ugly hack to work around the issue that 984eaba1af8529c381d7bfd4dd0a8b48d2c01647972Eli Friedman // the tag decls introduced by friend class declarations don't have an access 985eaba1af8529c381d7bfd4dd0a8b48d2c01647972Eli Friedman // specifier. Remove once this area of the code gets sorted out. 986eaba1af8529c381d7bfd4dd0a8b48d2c01647972Eli Friedman if (D->getAccess() != AS_none) 987eaba1af8529c381d7bfd4dd0a8b48d2c01647972Eli Friedman Record->setAccess(D->getAccess()); 988d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor if (!D->isInjectedClassName()) 989f6b1185f0a8a209c06dfc1efdb6a59cc851e970cDouglas Gregor Record->setInstantiationOfMemberClass(D, TSK_ImplicitInstantiation); 990d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor 99102cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall // If the original function was part of a friend declaration, 99202cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall // inherit its namespace state. 99302cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall if (Decl::FriendObjectKind FOK = D->getFriendObjectKind()) 99402cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall Record->setObjectOfFriendDecl(FOK == Decl::FOK_Declared); 99502cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall 9969901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor // Make sure that anonymous structs and unions are recorded. 9979901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor if (D->isAnonymousStructOrUnion()) { 9989901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor Record->setAnonymousStructOrUnion(true); 9997a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl if (Record->getDeclContext()->getRedeclContext()->isFunctionOrMethod()) 10009901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Record); 10019901c57806f7e36736ed1616e6ab3eebcc99b78cDouglas Gregor } 1002d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson 100317945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis Owner->addDecl(Record); 1004d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor return Record; 1005d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor} 1006d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor 100702cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// Normal class members are of more specific types and therefore 100802cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// don't make it here. This function serves two purposes: 100902cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// 1) instantiating function templates 101002cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// 2) substituting friend declarations 101102cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// FIXME: preserve function definitions in case #2 10127557a1348d2821dce126a778aa7acd7a00b814fdDouglas GregorDecl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D, 1013a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor TemplateParameterList *TemplateParams) { 1014127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // Check whether there is already a function template specialization for 1015127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // this declaration. 1016127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor FunctionTemplateDecl *FunctionTemplate = D->getDescribedFunctionTemplate(); 1017127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor void *InsertPos = 0; 1018b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (FunctionTemplate && !TemplateParams) { 101924bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor std::pair<const TemplateArgument *, unsigned> Innermost 102024bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor = TemplateArgs.getInnermost(); 10211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10222c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis FunctionDecl *SpecFunc 10232c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis = FunctionTemplate->findSpecialization(Innermost.first, Innermost.second, 10242c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis InsertPos); 10251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1026127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // If we already have a function template specialization, return it. 10272c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis if (SpecFunc) 10282c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis return SpecFunc; 1029127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor } 10301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1031b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall bool isFriend; 1032b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (FunctionTemplate) 1033b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall isFriend = (FunctionTemplate->getFriendObjectKind() != Decl::FOK_None); 1034b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall else 1035b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall isFriend = (D->getFriendObjectKind() != Decl::FOK_None); 1036b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall 103779c2278a66d8fc0943774d1b7c71a32f7764e1e2Douglas Gregor bool MergeWithParentScope = (TemplateParams != 0) || 1038b212d9a8e10308cde5b7a1ce07bd59d8df14fa06Douglas Gregor Owner->isFunctionOrMethod() || 103979c2278a66d8fc0943774d1b7c71a32f7764e1e2Douglas Gregor !(isa<Decl>(Owner) && 104079c2278a66d8fc0943774d1b7c71a32f7764e1e2Douglas Gregor cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod()); 10412a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall LocalInstantiationScope Scope(SemaRef, MergeWithParentScope); 10421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ParmVarDecl *, 4> Params; 104421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall TypeSourceInfo *TInfo = D->getTypeSourceInfo(); 104521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall TInfo = SubstFunctionType(D, Params); 104621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (!TInfo) 10472dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return 0; 104821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall QualType T = TInfo->getType(); 1049fd810b1386ed29b250e7d522ea826a65c815e49dJohn McCall 1050c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc(); 1051c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) { 1052c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc, 1053c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor TemplateArgs); 1054c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (!QualifierLoc) 1055c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return 0; 1056d325daa506338ab86f9dd468b48fd010673f49a6John McCall } 1057d325daa506338ab86f9dd468b48fd010673f49a6John McCall 105868b6b87b6beb7922fc2c8ab923ba2ce125490363John McCall // If we're instantiating a local function declaration, put the result 105968b6b87b6beb7922fc2c8ab923ba2ce125490363John McCall // in the owner; otherwise we need to find the instantiated context. 106068b6b87b6beb7922fc2c8ab923ba2ce125490363John McCall DeclContext *DC; 106168b6b87b6beb7922fc2c8ab923ba2ce125490363John McCall if (D->getDeclContext()->isFunctionOrMethod()) 106268b6b87b6beb7922fc2c8ab923ba2ce125490363John McCall DC = Owner; 1063c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor else if (isFriend && QualifierLoc) { 1064d325daa506338ab86f9dd468b48fd010673f49a6John McCall CXXScopeSpec SS; 1065c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SS.Adopt(QualifierLoc); 1066d325daa506338ab86f9dd468b48fd010673f49a6John McCall DC = SemaRef.computeDeclContext(SS); 1067d325daa506338ab86f9dd468b48fd010673f49a6John McCall if (!DC) return 0; 1068d325daa506338ab86f9dd468b48fd010673f49a6John McCall } else { 10697c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor DC = SemaRef.FindInstantiatedContext(D->getLocation(), D->getDeclContext(), 10707c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor TemplateArgs); 1071d325daa506338ab86f9dd468b48fd010673f49a6John McCall } 107268b6b87b6beb7922fc2c8ab923ba2ce125490363John McCall 1073af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith bool isConstexpr = D->isConstexpr(); 1074af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith // FIXME: check whether the instantiation produces a constexpr function. 1075af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith 107602cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall FunctionDecl *Function = 1077ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara FunctionDecl::Create(SemaRef.Context, DC, D->getInnerLocStart(), 1078ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getLocation(), D->getDeclName(), T, TInfo, 107916573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor D->getStorageClass(), D->getStorageClassAsWritten(), 1080af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith D->isInlineSpecified(), D->hasWrittenPrototype(), 1081af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith isConstexpr); 1082b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 1083c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) 1084c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Function->setQualifierInfo(QualifierLoc); 1085b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 1086b1a56e767cfb645fcb25027ab728dd5824d92615John McCall DeclContext *LexicalDC = Owner; 1087b1a56e767cfb645fcb25027ab728dd5824d92615John McCall if (!isFriend && D->isOutOfLine()) { 1088b1a56e767cfb645fcb25027ab728dd5824d92615John McCall assert(D->getDeclContext()->isFileContext()); 1089b1a56e767cfb645fcb25027ab728dd5824d92615John McCall LexicalDC = D->getDeclContext(); 1090b1a56e767cfb645fcb25027ab728dd5824d92615John McCall } 1091b1a56e767cfb645fcb25027ab728dd5824d92615John McCall 1092b1a56e767cfb645fcb25027ab728dd5824d92615John McCall Function->setLexicalDeclContext(LexicalDC); 10931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1094e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // Attach the parameters 10955cbe101b502e06d16bc77df45a27ce8bc13f33c8Douglas Gregor if (isa<FunctionProtoType>(Function->getType().IgnoreParens())) { 10961d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor // Adopt the already-instantiated parameters into our own context. 10971d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor for (unsigned P = 0; P < Params.size(); ++P) 10981d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor if (Params[P]) 10991d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor Params[P]->setOwningFunction(Function); 11001d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor } else { 11011d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor // Since we were instantiated via a typedef of a function type, create 11021d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor // new parameters. 11031d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor const FunctionProtoType *Proto 11041d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor = Function->getType()->getAs<FunctionProtoType>(); 11051d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor assert(Proto && "No function prototype in template instantiation?"); 11061d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor for (FunctionProtoType::arg_type_iterator AI = Proto->arg_type_begin(), 11071d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor AE = Proto->arg_type_end(); AI != AE; ++AI) { 11081d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor ParmVarDecl *Param 11091d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor = SemaRef.BuildParmVarDeclForTypedef(Function, Function->getLocation(), 11101d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor *AI); 11111d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor Param->setScopeInfo(0, Params.size()); 11121d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor Params.push_back(Param); 11131d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor } 11141d441ee69aaf3b3afa4521d05df934c5c7ea5f62Douglas Gregor } 1115838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor Function->setParams(Params.data(), Params.size()); 111602cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall 1117ac7c2c8a9d47df7d652364af3043c41816a18fa4Douglas Gregor SourceLocation InstantiateAtPOI; 1118a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor if (TemplateParams) { 1119a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // Our resulting instantiation is actually a function template, since we 1120a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // are substituting only the outer template parameters. For example, given 1121a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // 1122a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // template<typename T> 1123a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // struct X { 1124a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // template<typename U> friend void f(T, U); 1125a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // }; 1126a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // 1127a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // X<int> x; 1128a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // 1129a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // We are instantiating the friend function template "f" within X<int>, 1130a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // which means substituting int for T, but leaving "f" as a friend function 1131a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // template. 1132a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // Build the function template itself. 1133d325daa506338ab86f9dd468b48fd010673f49a6John McCall FunctionTemplate = FunctionTemplateDecl::Create(SemaRef.Context, DC, 1134a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor Function->getLocation(), 1135a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor Function->getDeclName(), 1136a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor TemplateParams, Function); 1137a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor Function->setDescribedFunctionTemplate(FunctionTemplate); 1138b1a56e767cfb645fcb25027ab728dd5824d92615John McCall 1139b1a56e767cfb645fcb25027ab728dd5824d92615John McCall FunctionTemplate->setLexicalDeclContext(LexicalDC); 1140d325daa506338ab86f9dd468b48fd010673f49a6John McCall 1141d325daa506338ab86f9dd468b48fd010673f49a6John McCall if (isFriend && D->isThisDeclarationADefinition()) { 1142d325daa506338ab86f9dd468b48fd010673f49a6John McCall // TODO: should we remember this connection regardless of whether 1143d325daa506338ab86f9dd468b48fd010673f49a6John McCall // the friend declaration provided a body? 1144d325daa506338ab86f9dd468b48fd010673f49a6John McCall FunctionTemplate->setInstantiatedFromMemberTemplate( 1145d325daa506338ab86f9dd468b48fd010673f49a6John McCall D->getDescribedFunctionTemplate()); 1146d325daa506338ab86f9dd468b48fd010673f49a6John McCall } 114766724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor } else if (FunctionTemplate) { 114866724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor // Record this function template specialization. 114924bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor std::pair<const TemplateArgument *, unsigned> Innermost 115024bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor = TemplateArgs.getInnermost(); 1151838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor Function->setFunctionTemplateSpecialization(FunctionTemplate, 1152910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgumentList::CreateCopy(SemaRef.Context, 115324bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor Innermost.first, 115424bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor Innermost.second), 115566724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor InsertPos); 115680f5b16efb658dabbcf971f42ed8b789aaaa6baaChandler Carruth } else if (isFriend) { 115780f5b16efb658dabbcf971f42ed8b789aaaa6baaChandler Carruth // Note, we need this connection even if the friend doesn't have a body. 115880f5b16efb658dabbcf971f42ed8b789aaaa6baaChandler Carruth // Its body may exist but not have been attached yet due to deferred 115980f5b16efb658dabbcf971f42ed8b789aaaa6baaChandler Carruth // parsing. 116080f5b16efb658dabbcf971f42ed8b789aaaa6baaChandler Carruth // FIXME: It might be cleaner to set this when attaching the body to the 116180f5b16efb658dabbcf971f42ed8b789aaaa6baaChandler Carruth // friend function declaration, however that would require finding all the 116280f5b16efb658dabbcf971f42ed8b789aaaa6baaChandler Carruth // instantiations and modifying them. 1163d325daa506338ab86f9dd468b48fd010673f49a6John McCall Function->setInstantiationOfMemberFunction(D, TSK_ImplicitInstantiation); 116402cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall } 1165a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor 1166e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (InitFunctionInstantiation(Function, D)) 1167e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor Function->setInvalidDecl(); 11681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1169e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor bool Redeclaration = false; 1170af2094e7cecadf36667deb61a83587ffdd979bd3John McCall bool isExplicitSpecialization = false; 1171a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor 11726826314938f8510cd1a6b03b5d032592456ae27bJohn McCall LookupResult Previous(SemaRef, Function->getDeclName(), SourceLocation(), 11736826314938f8510cd1a6b03b5d032592456ae27bJohn McCall Sema::LookupOrdinaryName, Sema::ForRedeclaration); 11746826314938f8510cd1a6b03b5d032592456ae27bJohn McCall 1175af2094e7cecadf36667deb61a83587ffdd979bd3John McCall if (DependentFunctionTemplateSpecializationInfo *Info 1176af2094e7cecadf36667deb61a83587ffdd979bd3John McCall = D->getDependentSpecializationInfo()) { 1177af2094e7cecadf36667deb61a83587ffdd979bd3John McCall assert(isFriend && "non-friend has dependent specialization info?"); 1178af2094e7cecadf36667deb61a83587ffdd979bd3John McCall 1179af2094e7cecadf36667deb61a83587ffdd979bd3John McCall // This needs to be set now for future sanity. 1180af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Function->setObjectOfFriendDecl(/*HasPrevious*/ true); 1181af2094e7cecadf36667deb61a83587ffdd979bd3John McCall 1182af2094e7cecadf36667deb61a83587ffdd979bd3John McCall // Instantiate the explicit template arguments. 1183af2094e7cecadf36667deb61a83587ffdd979bd3John McCall TemplateArgumentListInfo ExplicitArgs(Info->getLAngleLoc(), 1184af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Info->getRAngleLoc()); 1185e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor if (SemaRef.Subst(Info->getTemplateArgs(), Info->getNumTemplateArgs(), 1186e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor ExplicitArgs, TemplateArgs)) 1187e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor return 0; 1188af2094e7cecadf36667deb61a83587ffdd979bd3John McCall 1189af2094e7cecadf36667deb61a83587ffdd979bd3John McCall // Map the candidate templates to their instantiations. 1190af2094e7cecadf36667deb61a83587ffdd979bd3John McCall for (unsigned I = 0, E = Info->getNumTemplates(); I != E; ++I) { 1191af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Decl *Temp = SemaRef.FindInstantiatedDecl(D->getLocation(), 1192af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Info->getTemplate(I), 1193af2094e7cecadf36667deb61a83587ffdd979bd3John McCall TemplateArgs); 1194af2094e7cecadf36667deb61a83587ffdd979bd3John McCall if (!Temp) return 0; 1195af2094e7cecadf36667deb61a83587ffdd979bd3John McCall 1196af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Previous.addDecl(cast<FunctionTemplateDecl>(Temp)); 1197af2094e7cecadf36667deb61a83587ffdd979bd3John McCall } 1198af2094e7cecadf36667deb61a83587ffdd979bd3John McCall 1199af2094e7cecadf36667deb61a83587ffdd979bd3John McCall if (SemaRef.CheckFunctionTemplateSpecialization(Function, 1200af2094e7cecadf36667deb61a83587ffdd979bd3John McCall &ExplicitArgs, 1201af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Previous)) 1202af2094e7cecadf36667deb61a83587ffdd979bd3John McCall Function->setInvalidDecl(); 1203af2094e7cecadf36667deb61a83587ffdd979bd3John McCall 1204af2094e7cecadf36667deb61a83587ffdd979bd3John McCall isExplicitSpecialization = true; 1205af2094e7cecadf36667deb61a83587ffdd979bd3John McCall 1206af2094e7cecadf36667deb61a83587ffdd979bd3John McCall } else if (TemplateParams || !FunctionTemplate) { 1207a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // Look only into the namespace where the friend would be declared to 1208a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // find a previous declaration. This is the innermost enclosing namespace, 1209a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // as described in ActOnFriendFunctionDecl. 12106826314938f8510cd1a6b03b5d032592456ae27bJohn McCall SemaRef.LookupQualifiedName(Previous, DC); 1211a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor 1212a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // In C++, the previous declaration we find might be a tag type 1213a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // (class or enum). In this case, the new declaration will hide the 1214a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // tag type. Note that this does does not apply if we're declaring a 1215a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // typedef (C++ [dcl.typedef]p4). 12166826314938f8510cd1a6b03b5d032592456ae27bJohn McCall if (Previous.isSingleTagDecl()) 12176826314938f8510cd1a6b03b5d032592456ae27bJohn McCall Previous.clear(); 1218a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor } 1219a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor 12209f54ad4381370c6b771424b53d219e661d6d6706John McCall SemaRef.CheckFunctionDeclaration(/*Scope*/ 0, Function, Previous, 1221c80e8115278ba1537c8b517a083ecbd0a018b579Peter Collingbourne isExplicitSpecialization, Redeclaration); 1222e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 122376d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall NamedDecl *PrincipalDecl = (TemplateParams 122476d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall ? cast<NamedDecl>(FunctionTemplate) 122576d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall : Function); 122676d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall 1227a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // If the original function was part of a friend declaration, 1228a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor // inherit its namespace state and add it to the owner. 1229d325daa506338ab86f9dd468b48fd010673f49a6John McCall if (isFriend) { 12306826314938f8510cd1a6b03b5d032592456ae27bJohn McCall NamedDecl *PrevDecl; 123176d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall if (TemplateParams) 1232a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor PrevDecl = FunctionTemplate->getPreviousDeclaration(); 123376d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall else 1234a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor PrevDecl = Function->getPreviousDeclaration(); 123576d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall 123676d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall PrincipalDecl->setObjectOfFriendDecl(PrevDecl != 0); 123776d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall DC->makeDeclVisibleInContext(PrincipalDecl, /*Recoverable=*/ false); 1238ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif 123977535dfde258765c056ef4c6786ef56cc48f0c76Gabor Greif bool queuedInstantiation = false; 1240ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif 1241238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor if (!SemaRef.getLangOptions().CPlusPlus0x && 1242238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor D->isThisDeclarationADefinition()) { 1243238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor // Check for a function body. 1244238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor const FunctionDecl *Definition = 0; 124510620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt if (Function->isDefined(Definition) && 1246238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor Definition->getTemplateSpecializationKind() == TSK_Undeclared) { 1247238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor SemaRef.Diag(Function->getLocation(), diag::err_redefinition) 1248238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor << Function->getDeclName(); 1249238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor SemaRef.Diag(Definition->getLocation(), diag::note_previous_definition); 1250238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor Function->setInvalidDecl(); 1251238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor } 1252238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor // Check for redefinitions due to other instantiations of this or 1253238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor // a similar friend function. 1254238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor else for (FunctionDecl::redecl_iterator R = Function->redecls_begin(), 1255238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor REnd = Function->redecls_end(); 1256238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor R != REnd; ++R) { 125713a8affbb87cdb869adabe2a6e5998559f2598c4Gabor Greif if (*R == Function) 125813a8affbb87cdb869adabe2a6e5998559f2598c4Gabor Greif continue; 1259ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif switch (R->getFriendObjectKind()) { 1260ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif case Decl::FOK_None: 1261ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif if (!queuedInstantiation && R->isUsed(false)) { 1262ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif if (MemberSpecializationInfo *MSInfo 1263ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif = Function->getMemberSpecializationInfo()) { 1264ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif if (MSInfo->getPointOfInstantiation().isInvalid()) { 1265ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif SourceLocation Loc = R->getLocation(); // FIXME 1266ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif MSInfo->setPointOfInstantiation(Loc); 1267ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif SemaRef.PendingLocalImplicitInstantiations.push_back( 1268ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif std::make_pair(Function, Loc)); 1269ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif queuedInstantiation = true; 1270ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif } 1271ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif } 1272ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif } 1273ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif break; 1274ab297ac4d3f7c078a34c75493b840ef6b5801be3Gabor Greif default: 1275238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor if (const FunctionDecl *RPattern 12766a557d8f6b3d7a747a0b57960d4b86f05ba2e53cGabor Greif = R->getTemplateInstantiationPattern()) 127710620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt if (RPattern->isDefined(RPattern)) { 1278238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor SemaRef.Diag(Function->getLocation(), diag::err_redefinition) 1279238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor << Function->getDeclName(); 12806a557d8f6b3d7a747a0b57960d4b86f05ba2e53cGabor Greif SemaRef.Diag(R->getLocation(), diag::note_previous_definition); 1281238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor Function->setInvalidDecl(); 1282238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor break; 1283238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor } 1284238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor } 1285238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor } 1286238058c372cfb7bdaf489f51171eb1380ebfd6a6Douglas Gregor } 1287a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor } 1288a735b206fdb5c15767a45289e1ffb3b568f70f2bDouglas Gregor 128976d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall if (Function->isOverloadedOperator() && !DC->isRecord() && 129076d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall PrincipalDecl->isInIdentifierNamespace(Decl::IDNS_Ordinary)) 129176d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall PrincipalDecl->setNonMemberOperator(); 129276d326448d7e4c10b2896edc2ee855d1e68d1b88John McCall 1293eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt assert(!D->isDefaulted() && "only methods should be defaulted"); 1294e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor return Function; 1295e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor} 12962dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 1297d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas GregorDecl * 1298d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas GregorTemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D, 1299af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet TemplateParameterList *TemplateParams, 1300af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet bool IsClassScopeSpecialization) { 13016b906869527be40b0d38d755e9ef51b331b88162Douglas Gregor FunctionTemplateDecl *FunctionTemplate = D->getDescribedFunctionTemplate(); 13026b906869527be40b0d38d755e9ef51b331b88162Douglas Gregor void *InsertPos = 0; 1303d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor if (FunctionTemplate && !TemplateParams) { 13041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // We are creating a function template specialization from a function 13051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // template. Check whether there is already a function template 1306d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // specialization for this particular set of template arguments. 130724bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor std::pair<const TemplateArgument *, unsigned> Innermost 130824bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor = TemplateArgs.getInnermost(); 13091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13102c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis FunctionDecl *SpecFunc 13112c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis = FunctionTemplate->findSpecialization(Innermost.first, Innermost.second, 13122c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis InsertPos); 13131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13146b906869527be40b0d38d755e9ef51b331b88162Douglas Gregor // If we already have a function template specialization, return it. 13152c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis if (SpecFunc) 13162c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis return SpecFunc; 13176b906869527be40b0d38d755e9ef51b331b88162Douglas Gregor } 13186b906869527be40b0d38d755e9ef51b331b88162Douglas Gregor 1319b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall bool isFriend; 1320b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (FunctionTemplate) 1321b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall isFriend = (FunctionTemplate->getFriendObjectKind() != Decl::FOK_None); 1322b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall else 1323b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall isFriend = (D->getFriendObjectKind() != Decl::FOK_None); 1324b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall 132579c2278a66d8fc0943774d1b7c71a32f7764e1e2Douglas Gregor bool MergeWithParentScope = (TemplateParams != 0) || 132679c2278a66d8fc0943774d1b7c71a32f7764e1e2Douglas Gregor !(isa<Decl>(Owner) && 132779c2278a66d8fc0943774d1b7c71a32f7764e1e2Douglas Gregor cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod()); 13282a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall LocalInstantiationScope Scope(SemaRef, MergeWithParentScope); 132948dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor 13304eab39f0745fb1949dbb40c4145771b927888242John McCall // Instantiate enclosing template arguments for friends. 13315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateParameterList *, 4> TempParamLists; 13324eab39f0745fb1949dbb40c4145771b927888242John McCall unsigned NumTempParamLists = 0; 13334eab39f0745fb1949dbb40c4145771b927888242John McCall if (isFriend && (NumTempParamLists = D->getNumTemplateParameterLists())) { 13344eab39f0745fb1949dbb40c4145771b927888242John McCall TempParamLists.set_size(NumTempParamLists); 13354eab39f0745fb1949dbb40c4145771b927888242John McCall for (unsigned I = 0; I != NumTempParamLists; ++I) { 13364eab39f0745fb1949dbb40c4145771b927888242John McCall TemplateParameterList *TempParams = D->getTemplateParameterList(I); 13374eab39f0745fb1949dbb40c4145771b927888242John McCall TemplateParameterList *InstParams = SubstTemplateParams(TempParams); 13384eab39f0745fb1949dbb40c4145771b927888242John McCall if (!InstParams) 13394eab39f0745fb1949dbb40c4145771b927888242John McCall return NULL; 13404eab39f0745fb1949dbb40c4145771b927888242John McCall TempParamLists[I] = InstParams; 13414eab39f0745fb1949dbb40c4145771b927888242John McCall } 13424eab39f0745fb1949dbb40c4145771b927888242John McCall } 13434eab39f0745fb1949dbb40c4145771b927888242John McCall 13445f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<ParmVarDecl *, 4> Params; 134521ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall TypeSourceInfo *TInfo = D->getTypeSourceInfo(); 134621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall TInfo = SubstFunctionType(D, Params); 134721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (!TInfo) 13482dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return 0; 134921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall QualType T = TInfo->getType(); 13502dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 1351723df245307a530da5433dfb43accf187dc3e243Abramo Bagnara // \brief If the type of this function, after ignoring parentheses, 1352723df245307a530da5433dfb43accf187dc3e243Abramo Bagnara // is not *directly* a function type, then we're instantiating a function 1353723df245307a530da5433dfb43accf187dc3e243Abramo Bagnara // that was declared via a typedef, e.g., 13545f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor // 13555f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor // typedef int functype(int, int); 13565f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor // functype func; 13575f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor // 13585f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor // In this case, we'll just go instantiate the ParmVarDecls that we 13595f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor // synthesized in the method declaration. 1360723df245307a530da5433dfb43accf187dc3e243Abramo Bagnara if (!isa<FunctionProtoType>(T.IgnoreParens())) { 13615f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor assert(!Params.size() && "Instantiating type could not yield parameters"); 13625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 4> ParamTypes; 136312c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor if (SemaRef.SubstParmTypes(D->getLocation(), D->param_begin(), 136412c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor D->getNumParams(), TemplateArgs, ParamTypes, 136512c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor &Params)) 136612c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor return 0; 13675f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor } 13685f970eee81372dfc6a1457c3d6d052af04e32a38Douglas Gregor 1369c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor NestedNameSpecifierLoc QualifierLoc = D->getQualifierLoc(); 1370c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) { 1371c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc, 1372b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall TemplateArgs); 1373c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (!QualifierLoc) 1374c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor return 0; 1375b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } 1376b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall 1377b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall DeclContext *DC = Owner; 1378b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (isFriend) { 1379c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) { 1380b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall CXXScopeSpec SS; 1381c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor SS.Adopt(QualifierLoc); 1382b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall DC = SemaRef.computeDeclContext(SS); 1383c54d688c604d28dcb9ab8f92047837c10c8f9c61John McCall 1384c54d688c604d28dcb9ab8f92047837c10c8f9c61John McCall if (DC && SemaRef.RequireCompleteDeclContext(SS, DC)) 1385c54d688c604d28dcb9ab8f92047837c10c8f9c61John McCall return 0; 1386b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } else { 1387b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall DC = SemaRef.FindInstantiatedContext(D->getLocation(), 1388b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall D->getDeclContext(), 1389b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall TemplateArgs); 1390b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } 1391b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (!DC) return 0; 1392b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } 1393b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall 1394af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith bool isConstexpr = D->isConstexpr(); 1395af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith // FIXME: check whether the instantiation produces a constexpr function. 1396af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith 13972dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // Build the instantiated method declaration. 1398b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall CXXRecordDecl *Record = cast<CXXRecordDecl>(DC); 1399dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor CXXMethodDecl *Method = 0; 14001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1401ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc = D->getInnerLocStart(); 14022577743c5650c646fb705df01403707e94f2df04Abramo Bagnara DeclarationNameInfo NameInfo 14032577743c5650c646fb705df01403707e94f2df04Abramo Bagnara = SemaRef.SubstDeclarationNameInfo(D->getNameInfo(), TemplateArgs); 140417e32f30e2d1eaf6639d3d4e2196a8d7c709fbacDouglas Gregor if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) { 14051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Method = CXXConstructorDecl::Create(SemaRef.Context, Record, 1406ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara StartLoc, NameInfo, T, TInfo, 14071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Constructor->isExplicit(), 140816573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor Constructor->isInlineSpecified(), 1409af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith false, isConstexpr); 141017e32f30e2d1eaf6639d3d4e2196a8d7c709fbacDouglas Gregor } else if (CXXDestructorDecl *Destructor = dyn_cast<CXXDestructorDecl>(D)) { 141117e32f30e2d1eaf6639d3d4e2196a8d7c709fbacDouglas Gregor Method = CXXDestructorDecl::Create(SemaRef.Context, Record, 1412ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara StartLoc, NameInfo, T, TInfo, 14132577743c5650c646fb705df01403707e94f2df04Abramo Bagnara Destructor->isInlineSpecified(), 141416573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor false); 141565ec1fda479688d143fe2403242cd9c730c800a1Douglas Gregor } else if (CXXConversionDecl *Conversion = dyn_cast<CXXConversionDecl>(D)) { 141665ec1fda479688d143fe2403242cd9c730c800a1Douglas Gregor Method = CXXConversionDecl::Create(SemaRef.Context, Record, 1417ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara StartLoc, NameInfo, T, TInfo, 14180130f3cc4ccd5f46361c48d5fe94133d74619424Douglas Gregor Conversion->isInlineSpecified(), 1419f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor Conversion->isExplicit(), 1420af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith isConstexpr, Conversion->getLocEnd()); 1421dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor } else { 14222577743c5650c646fb705df01403707e94f2df04Abramo Bagnara Method = CXXMethodDecl::Create(SemaRef.Context, Record, 1423ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara StartLoc, NameInfo, T, TInfo, 142416573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor D->isStatic(), 142516573fa9705b546b7597c273b25b85d6321e2b33Douglas Gregor D->getStorageClassAsWritten(), 1426f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor D->isInlineSpecified(), 1427af1fc7af351758b0ea0d285bdfe5640128109a4eRichard Smith isConstexpr, D->getLocEnd()); 1428dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor } 14296b906869527be40b0d38d755e9ef51b331b88162Douglas Gregor 1430c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor if (QualifierLoc) 1431c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas Gregor Method->setQualifierInfo(QualifierLoc); 1432b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 1433d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor if (TemplateParams) { 1434d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // Our resulting instantiation is actually a function template, since we 1435d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // are substituting only the outer template parameters. For example, given 14361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // 1437d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // template<typename T> 1438d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // struct X { 1439d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // template<typename U> void f(T, U); 1440d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // }; 1441d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // 1442d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // X<int> x; 1443d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // 1444d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // We are instantiating the member template "f" within X<int>, which means 1445d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // substituting int for T, but leaving "f" as a member function template. 1446d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor // Build the function template itself. 1447d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor FunctionTemplate = FunctionTemplateDecl::Create(SemaRef.Context, Record, 1448d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor Method->getLocation(), 14491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Method->getDeclName(), 1450d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor TemplateParams, Method); 1451b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (isFriend) { 1452b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall FunctionTemplate->setLexicalDeclContext(Owner); 1453b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall FunctionTemplate->setObjectOfFriendDecl(true); 1454b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } else if (D->isOutOfLine()) 14551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FunctionTemplate->setLexicalDeclContext(D->getLexicalDeclContext()); 1456d60e105e6d1624da647ef7dd35a9cf6fad1b763eDouglas Gregor Method->setDescribedFunctionTemplate(FunctionTemplate); 145766724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor } else if (FunctionTemplate) { 145866724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor // Record this function template specialization. 145924bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor std::pair<const TemplateArgument *, unsigned> Innermost 146024bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor = TemplateArgs.getInnermost(); 1461838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor Method->setFunctionTemplateSpecialization(FunctionTemplate, 1462910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgumentList::CreateCopy(SemaRef.Context, 1463910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Innermost.first, 1464910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Innermost.second), 146566724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor InsertPos); 1466b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } else if (!isFriend) { 146766724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor // Record that this is an instantiation of a member function. 14682db323294ac02296125e1e0beb4c3595992e75bbDouglas Gregor Method->setInstantiationOfMemberFunction(D, TSK_ImplicitInstantiation); 146966724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor } 147066724ea67d7d598b937d86fa66f03f09a1c758f3Douglas Gregor 14711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // If we are instantiating a member function defined 14727caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // out-of-line, the instantiation will have the same lexical 14737caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // context (which will be a namespace scope) as the template. 1474b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (isFriend) { 14754eab39f0745fb1949dbb40c4145771b927888242John McCall if (NumTempParamLists) 14764eab39f0745fb1949dbb40c4145771b927888242John McCall Method->setTemplateParameterListsInfo(SemaRef.Context, 14774eab39f0745fb1949dbb40c4145771b927888242John McCall NumTempParamLists, 14784eab39f0745fb1949dbb40c4145771b927888242John McCall TempParamLists.data()); 14794eab39f0745fb1949dbb40c4145771b927888242John McCall 1480b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall Method->setLexicalDeclContext(Owner); 1481b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall Method->setObjectOfFriendDecl(true); 1482b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } else if (D->isOutOfLine()) 14837caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor Method->setLexicalDeclContext(D->getLexicalDeclContext()); 14841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14855545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // Attach the parameters 14865545e166a956a20d7a6b58408e251a1119025485Douglas Gregor for (unsigned P = 0; P < Params.size(); ++P) 14875545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Params[P]->setOwningFunction(Method); 1488838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor Method->setParams(Params.data(), Params.size()); 14895545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 14905545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (InitMethodInstantiation(Method, D)) 14915545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Method->setInvalidDecl(); 14922dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 14932577743c5650c646fb705df01403707e94f2df04Abramo Bagnara LookupResult Previous(SemaRef, NameInfo, Sema::LookupOrdinaryName, 14942577743c5650c646fb705df01403707e94f2df04Abramo Bagnara Sema::ForRedeclaration); 14951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1496b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (!FunctionTemplate || TemplateParams || isFriend) { 1497b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall SemaRef.LookupQualifiedName(Previous, Record); 14981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1499dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor // In C++, the previous declaration we find might be a tag type 1500dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor // (class or enum). In this case, the new declaration will hide the 1501dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor // tag type. Note that this does does not apply if we're declaring a 1502dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor // typedef (C++ [dcl.typedef]p4). 15036826314938f8510cd1a6b03b5d032592456ae27bJohn McCall if (Previous.isSingleTagDecl()) 15046826314938f8510cd1a6b03b5d032592456ae27bJohn McCall Previous.clear(); 1505dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor } 15062dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 150765ec1fda479688d143fe2403242cd9c730c800a1Douglas Gregor bool Redeclaration = false; 1508af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet if (!IsClassScopeSpecialization) 1509af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet SemaRef.CheckFunctionDeclaration(0, Method, Previous, false, Redeclaration); 151065ec1fda479688d143fe2403242cd9c730c800a1Douglas Gregor 15114ba3136b3eb9740a07bd61d0ab23ce9a8d894deeDouglas Gregor if (D->isPure()) 15124ba3136b3eb9740a07bd61d0ab23ce9a8d894deeDouglas Gregor SemaRef.CheckPureMethod(Method, SourceRange()); 15134ba3136b3eb9740a07bd61d0ab23ce9a8d894deeDouglas Gregor 151446460a68f6508775e98c19b4bb8454bb471aac24John McCall Method->setAccess(D->getAccess()); 151546460a68f6508775e98c19b4bb8454bb471aac24John McCall 15169eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlsson SemaRef.CheckOverrideControl(Method); 15179eefa229dfb71400a6bbee326420a7f0e2e91f1fAnders Carlsson 1518b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (FunctionTemplate) { 1519b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall // If there's a function template, let our caller handle it. 1520b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } else if (Method->isInvalidDecl() && !Previous.empty()) { 1521b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall // Don't hide a (potentially) valid declaration with an invalid one. 1522b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } else { 1523b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall NamedDecl *DeclToAdd = (TemplateParams 1524b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall ? cast<NamedDecl>(FunctionTemplate) 1525b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall : Method); 1526b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall if (isFriend) 1527b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall Record->makeDeclVisibleInContext(DeclToAdd); 1528af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet else if (!IsClassScopeSpecialization) 1529b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall Owner->addDecl(DeclToAdd); 1530b0cb022daec8671406ab25f4b5d5a6d48d823bc4John McCall } 1531eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt 1532eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt if (D->isExplicitlyDefaulted()) { 1533eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt SemaRef.SetDeclDefaulted(Method, Method->getLocation()); 1534eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt } else { 1535eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt assert(!D->isDefaulted() && 1536eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt "should not implicitly default uninstantiated function"); 1537eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt } 1538eb88ae5f9acdd17ec76fb83e151a77e25e4e8f31Sean Hunt 15392dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return Method; 15402dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor} 15412dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 1542615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 1543dec06664a1c4d8984251083db2215875aea1c80dDouglas Gregor return VisitCXXMethodDecl(D); 1544615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor} 1545615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 154603b2b07aaef3a585aec13048a33356c7f635de72Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 154717e32f30e2d1eaf6639d3d4e2196a8d7c709fbacDouglas Gregor return VisitCXXMethodDecl(D); 154803b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor} 154903b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor 1550bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXConversionDecl(CXXConversionDecl *D) { 155165ec1fda479688d143fe2403242cd9c730c800a1Douglas Gregor return VisitCXXMethodDecl(D); 1552bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor} 1553bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor 15546477b69cc93e0a0ff15036d60d604f3544da0f29Douglas GregorParmVarDecl *TemplateDeclInstantiator::VisitParmVarDecl(ParmVarDecl *D) { 1555fb44de956f27875def889482b5393475060392afJohn McCall return SemaRef.SubstParmVarDecl(D, TemplateArgs, /*indexAdjustment*/ 0, 1556fb44de956f27875def889482b5393475060392afJohn McCall llvm::Optional<unsigned>()); 15572dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor} 15582dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 1559e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCallDecl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl( 1560e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall TemplateTypeParmDecl *D) { 1561e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall // TODO: don't always clone when decls are refcounted. 15624fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth assert(D->getTypeForDecl()->isTemplateTypeParmType()); 15631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1564e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall TemplateTypeParmDecl *Inst = 1565344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara TemplateTypeParmDecl::Create(SemaRef.Context, Owner, 1566344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara D->getLocStart(), D->getLocation(), 15674fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth D->getDepth() - TemplateArgs.getNumLevels(), 15684fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth D->getIndex(), D->getIdentifier(), 1569e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall D->wasDeclaredWithTypename(), 1570e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall D->isParameterPack()); 15719a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor Inst->setAccess(AS_public); 15729a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 15730f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor if (D->hasDefaultArgument()) 15740f8716b7bb25d61a82f699b3975167451f7b5a68Douglas Gregor Inst->setDefaultArgument(D->getDefaultArgumentInfo(), false); 1575e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 1576550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // Introduce this template parameter's instantiation into the instantiation 1577550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // scope. 1578550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Inst); 1579550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor 1580e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall return Inst; 1581e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall} 1582e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 158333642df30088f2ddb0b22c609523ab8df9dff595Douglas GregorDecl *TemplateDeclInstantiator::VisitNonTypeTemplateParmDecl( 158433642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor NonTypeTemplateParmDecl *D) { 158533642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor // Substitute into the type of the non-type template parameter. 15866952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeLoc TL = D->getTypeSourceInfo()->getTypeLoc(); 15875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TypeSourceInfo *, 4> ExpandedParameterPackTypesAsWritten; 15885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 4> ExpandedParameterPackTypes; 15896952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor bool IsExpandedParameterPack = false; 15906952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *DI; 159133642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor QualType T; 159233642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor bool Invalid = false; 15936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 15946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (D->isExpandedParameterPack()) { 15956952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // The non-type template parameter pack is an already-expanded pack 15966952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // expansion of types. Substitute into each of the expanded types. 15976952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypes.reserve(D->getNumExpansionTypes()); 15986952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypesAsWritten.reserve(D->getNumExpansionTypes()); 15996952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0, N = D->getNumExpansionTypes(); I != N; ++I) { 16006952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *NewDI =SemaRef.SubstType(D->getExpansionTypeSourceInfo(I), 16016952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TemplateArgs, 16026952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getLocation(), 16036952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getDeclName()); 16046952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (!NewDI) 16056952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 16066952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 16076952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypesAsWritten.push_back(NewDI); 16086952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor QualType NewT =SemaRef.CheckNonTypeTemplateParameterType(NewDI->getType(), 16096952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getLocation()); 16106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NewT.isNull()) 16116952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 16126952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypes.push_back(NewT); 16136952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 16146952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 16156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor IsExpandedParameterPack = true; 16166952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor DI = D->getTypeSourceInfo(); 16176952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T = DI->getType(); 16186952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else if (isa<PackExpansionTypeLoc>(TL)) { 16196952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // The non-type template parameter pack's type is a pack expansion of types. 16206952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // Determine whether we need to expand this parameter pack into separate 16216952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // types. 16226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor PackExpansionTypeLoc Expansion = cast<PackExpansionTypeLoc>(TL); 16236952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeLoc Pattern = Expansion.getPatternLoc(); 16245f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<UnexpandedParameterPack, 2> Unexpanded; 16256952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 16266952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 16276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // Determine whether the set of unexpanded parameter packs can and should 16286952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // be expanded. 16296952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor bool Expand = true; 16306952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor bool RetainExpansion = false; 16316952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor llvm::Optional<unsigned> OrigNumExpansions 16326952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor = Expansion.getTypePtr()->getNumExpansions(); 16336952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor llvm::Optional<unsigned> NumExpansions = OrigNumExpansions; 16346952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (SemaRef.CheckParameterPacksForExpansion(Expansion.getEllipsisLoc(), 16356952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Pattern.getSourceRange(), 16366952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Unexpanded.data(), 16376952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Unexpanded.size(), 16386952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TemplateArgs, 16396952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Expand, RetainExpansion, 16406952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumExpansions)) 16416952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 16426952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 16436952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (Expand) { 16446952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0; I != *NumExpansions; ++I) { 16456952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 16466952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *NewDI = SemaRef.SubstType(Pattern, TemplateArgs, 16476952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getLocation(), 16486952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getDeclName()); 16496952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (!NewDI) 16506952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 16516952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 16526952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypesAsWritten.push_back(NewDI); 16536952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor QualType NewT = SemaRef.CheckNonTypeTemplateParameterType( 16546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NewDI->getType(), 16556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getLocation()); 16566952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NewT.isNull()) 16576952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 16586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypes.push_back(NewT); 16596952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 16606952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 16616952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // Note that we have an expanded parameter pack. The "type" of this 16626952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // expanded parameter pack is the original expansion type, but callers 16636952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // will end up using the expanded parameter pack types for type-checking. 16646952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor IsExpandedParameterPack = true; 16656952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor DI = D->getTypeSourceInfo(); 16666952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T = DI->getType(); 16676952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else { 16686952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // We cannot fully expand the pack expansion now, so substitute into the 16696952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // pattern and create a new pack expansion type. 16706952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, -1); 16716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *NewPattern = SemaRef.SubstType(Pattern, TemplateArgs, 16726952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getLocation(), 16736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getDeclName()); 16746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (!NewPattern) 16756952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 16766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 16776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor DI = SemaRef.CheckPackExpansion(NewPattern, Expansion.getEllipsisLoc(), 16786952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumExpansions); 16796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (!DI) 16806952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 16816952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 16826952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T = DI->getType(); 16836952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 16846952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else { 16856952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // Simple case: substitution into a parameter that is not a parameter pack. 16866952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor DI = SemaRef.SubstType(D->getTypeSourceInfo(), TemplateArgs, 16876952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getLocation(), D->getDeclName()); 16886952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (!DI) 16896952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return 0; 16906952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 16916952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor // Check that this type is acceptable for a non-type template parameter. 16926952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T = SemaRef.CheckNonTypeTemplateParameterType(DI->getType(), 16936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getLocation()); 16946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (T.isNull()) { 16956952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor T = SemaRef.Context.IntTy; 16966952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Invalid = true; 16976952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 169833642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor } 169933642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor 17006952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NonTypeTemplateParmDecl *Param; 17016952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (IsExpandedParameterPack) 17026952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Param = NonTypeTemplateParmDecl::Create(SemaRef.Context, Owner, 1703ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 1704ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getLocation(), 170571b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregor D->getDepth() - TemplateArgs.getNumLevels(), 17066952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getPosition(), 17076952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getIdentifier(), T, 17086952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor DI, 17096952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypes.data(), 17106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypes.size(), 17116952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedParameterPackTypesAsWritten.data()); 17126952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor else 17136952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor Param = NonTypeTemplateParmDecl::Create(SemaRef.Context, Owner, 1714ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D->getInnerLocStart(), 17156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getLocation(), 17166952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getDepth() - TemplateArgs.getNumLevels(), 17176952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getPosition(), 17186952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->getIdentifier(), T, 17196952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor D->isParameterPack(), DI); 17206952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 17219a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor Param->setAccess(AS_public); 172233642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor if (Invalid) 172333642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor Param->setInvalidDecl(); 172433642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor 1725d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara Param->setDefaultArgument(D->getDefaultArgument(), false); 1726550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor 1727550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // Introduce this template parameter's instantiation into the instantiation 1728550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // scope. 1729550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param); 173033642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor return Param; 173133642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor} 173233642df30088f2ddb0b22c609523ab8df9dff595Douglas Gregor 17330dde18e5a713bc186062ca1ebc9967500b07faeeAnders CarlssonDecl * 17349106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas GregorTemplateDeclInstantiator::VisitTemplateTemplateParmDecl( 17359106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor TemplateTemplateParmDecl *D) { 17369106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor // Instantiate the template parameter list of the template template parameter. 17379106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor TemplateParameterList *TempParams = D->getTemplateParameters(); 17389106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor TemplateParameterList *InstParams; 17399106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor { 17409106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor // Perform the actual substitution of template parameters within a new, 17419106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor // local instantiation scope. 17422a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall LocalInstantiationScope Scope(SemaRef); 17439106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor InstParams = SubstTemplateParams(TempParams); 17449106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor if (!InstParams) 17459106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor return NULL; 17469106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor } 17479106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor 17489106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor // Build the template template parameter. 17499106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor TemplateTemplateParmDecl *Param 17509106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor = TemplateTemplateParmDecl::Create(SemaRef.Context, Owner, D->getLocation(), 175171b87e4fa6bfb47107b099135864f9024004a4c9Douglas Gregor D->getDepth() - TemplateArgs.getNumLevels(), 175261c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor D->getPosition(), D->isParameterPack(), 175361c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor D->getIdentifier(), InstParams); 1754d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara Param->setDefaultArgument(D->getDefaultArgument(), false); 17559a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor Param->setAccess(AS_public); 17564469e8a97cdca3725b4f8f366916143113c029acDouglas Gregor 17579106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor // Introduce this template parameter's instantiation into the instantiation 17589106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor // scope. 17599106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param); 17609106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor 17619106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor return Param; 17629106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor} 17639106ef78f8fcc9df1a60c7a5b64c7d967194207eDouglas Gregor 176448c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas GregorDecl *TemplateDeclInstantiator::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) { 1765db9924191092b4d426cc066637d81698211846aaDouglas Gregor // Using directives are never dependent (and never contain any types or 1766db9924191092b4d426cc066637d81698211846aaDouglas Gregor // expressions), so they require no explicit instantiation work. 176748c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor 176848c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor UsingDirectiveDecl *Inst 176948c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor = UsingDirectiveDecl::Create(SemaRef.Context, Owner, D->getLocation(), 177048c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor D->getNamespaceKeyLocation(), 1771db9924191092b4d426cc066637d81698211846aaDouglas Gregor D->getQualifierLoc(), 177248c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor D->getIdentLocation(), 177348c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor D->getNominatedNamespace(), 177448c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor D->getCommonAncestor()); 177548c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor Owner->addDecl(Inst); 177648c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor return Inst; 177748c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor} 177848c32a7e7c977f317dc1dc19524c2f54d29c7270Douglas Gregor 1779ed97649e9574b9d854fa4d6109c9333ae0993554John McCallDecl *TemplateDeclInstantiator::VisitUsingDecl(UsingDecl *D) { 17801b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor 17811b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // The nested name specifier may be dependent, for example 17821b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // template <typename T> struct t { 17831b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // struct s1 { T f1(); }; 17841b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // struct s2 : s1 { using s1::f1; }; 17851b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // }; 17861b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // template struct t<int>; 17871b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // Here, in using s1::f1, s1 refers to t<T>::s1; 17881b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // we need to substitute for t<int>::s1. 17895149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor NestedNameSpecifierLoc QualifierLoc 17905149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(), 17915149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor TemplateArgs); 17925149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor if (!QualifierLoc) 1793dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor return 0; 17941b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor 17951b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // The name info is non-dependent, so no transformation 17961b398205267ea69f35230eea50e0225db22ebb7eDouglas Gregor // is required. 1797ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara DeclarationNameInfo NameInfo = D->getNameInfo(); 1798ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 17999f54ad4381370c6b771424b53d219e661d6d6706John McCall // We only need to do redeclaration lookups if we're in a class 18009f54ad4381370c6b771424b53d219e661d6d6706John McCall // scope (in fact, it's not really even possible in non-class 18019f54ad4381370c6b771424b53d219e661d6d6706John McCall // scopes). 18029f54ad4381370c6b771424b53d219e661d6d6706John McCall bool CheckRedeclaration = Owner->isRecord(); 18039f54ad4381370c6b771424b53d219e661d6d6706John McCall 1804ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara LookupResult Prev(SemaRef, NameInfo, Sema::LookupUsingDeclName, 1805ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara Sema::ForRedeclaration); 18069f54ad4381370c6b771424b53d219e661d6d6706John McCall 1807ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingDecl *NewUD = UsingDecl::Create(SemaRef.Context, Owner, 1808ed97649e9574b9d854fa4d6109c9333ae0993554John McCall D->getUsingLocation(), 18095149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor QualifierLoc, 1810ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara NameInfo, 1811ed97649e9574b9d854fa4d6109c9333ae0993554John McCall D->isTypeName()); 1812ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 18135149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor CXXScopeSpec SS; 18145149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor SS.Adopt(QualifierLoc); 18159f54ad4381370c6b771424b53d219e661d6d6706John McCall if (CheckRedeclaration) { 18169f54ad4381370c6b771424b53d219e661d6d6706John McCall Prev.setHideTags(false); 18179f54ad4381370c6b771424b53d219e661d6d6706John McCall SemaRef.LookupQualifiedName(Prev, Owner); 18189f54ad4381370c6b771424b53d219e661d6d6706John McCall 18199f54ad4381370c6b771424b53d219e661d6d6706John McCall // Check for invalid redeclarations. 18209f54ad4381370c6b771424b53d219e661d6d6706John McCall if (SemaRef.CheckUsingDeclRedeclaration(D->getUsingLocation(), 18219f54ad4381370c6b771424b53d219e661d6d6706John McCall D->isTypeName(), SS, 18229f54ad4381370c6b771424b53d219e661d6d6706John McCall D->getLocation(), Prev)) 18239f54ad4381370c6b771424b53d219e661d6d6706John McCall NewUD->setInvalidDecl(); 18249f54ad4381370c6b771424b53d219e661d6d6706John McCall 18259f54ad4381370c6b771424b53d219e661d6d6706John McCall } 18269f54ad4381370c6b771424b53d219e661d6d6706John McCall 18279f54ad4381370c6b771424b53d219e661d6d6706John McCall if (!NewUD->isInvalidDecl() && 18289f54ad4381370c6b771424b53d219e661d6d6706John McCall SemaRef.CheckUsingDeclQualifier(D->getUsingLocation(), SS, 1829ed97649e9574b9d854fa4d6109c9333ae0993554John McCall D->getLocation())) 1830ed97649e9574b9d854fa4d6109c9333ae0993554John McCall NewUD->setInvalidDecl(); 18319f54ad4381370c6b771424b53d219e661d6d6706John McCall 1832ed97649e9574b9d854fa4d6109c9333ae0993554John McCall SemaRef.Context.setInstantiatedFromUsingDecl(NewUD, D); 1833ed97649e9574b9d854fa4d6109c9333ae0993554John McCall NewUD->setAccess(D->getAccess()); 1834ed97649e9574b9d854fa4d6109c9333ae0993554John McCall Owner->addDecl(NewUD); 1835ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 18369f54ad4381370c6b771424b53d219e661d6d6706John McCall // Don't process the shadow decls for an invalid decl. 18379f54ad4381370c6b771424b53d219e661d6d6706John McCall if (NewUD->isInvalidDecl()) 18389f54ad4381370c6b771424b53d219e661d6d6706John McCall return NewUD; 18399f54ad4381370c6b771424b53d219e661d6d6706John McCall 1840323c310efa0abd7a786b0303501186b5f33eb8d7John McCall bool isFunctionScope = Owner->isFunctionOrMethod(); 1841323c310efa0abd7a786b0303501186b5f33eb8d7John McCall 18429f54ad4381370c6b771424b53d219e661d6d6706John McCall // Process the shadow decls. 18439f54ad4381370c6b771424b53d219e661d6d6706John McCall for (UsingDecl::shadow_iterator I = D->shadow_begin(), E = D->shadow_end(); 18449f54ad4381370c6b771424b53d219e661d6d6706John McCall I != E; ++I) { 18459f54ad4381370c6b771424b53d219e661d6d6706John McCall UsingShadowDecl *Shadow = *I; 18469f54ad4381370c6b771424b53d219e661d6d6706John McCall NamedDecl *InstTarget = 1847b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor cast_or_null<NamedDecl>(SemaRef.FindInstantiatedDecl( 1848b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor Shadow->getLocation(), 1849b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor Shadow->getTargetDecl(), 1850b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor TemplateArgs)); 1851b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor if (!InstTarget) 1852b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor return 0; 18539f54ad4381370c6b771424b53d219e661d6d6706John McCall 18549f54ad4381370c6b771424b53d219e661d6d6706John McCall if (CheckRedeclaration && 18559f54ad4381370c6b771424b53d219e661d6d6706John McCall SemaRef.CheckUsingShadowDecl(NewUD, InstTarget, Prev)) 18569f54ad4381370c6b771424b53d219e661d6d6706John McCall continue; 18579f54ad4381370c6b771424b53d219e661d6d6706John McCall 18589f54ad4381370c6b771424b53d219e661d6d6706John McCall UsingShadowDecl *InstShadow 18599f54ad4381370c6b771424b53d219e661d6d6706John McCall = SemaRef.BuildUsingShadowDecl(/*Scope*/ 0, NewUD, InstTarget); 18609f54ad4381370c6b771424b53d219e661d6d6706John McCall SemaRef.Context.setInstantiatedFromUsingShadowDecl(InstShadow, Shadow); 1861323c310efa0abd7a786b0303501186b5f33eb8d7John McCall 1862323c310efa0abd7a786b0303501186b5f33eb8d7John McCall if (isFunctionScope) 1863323c310efa0abd7a786b0303501186b5f33eb8d7John McCall SemaRef.CurrentInstantiationScope->InstantiatedLocal(Shadow, InstShadow); 18649f54ad4381370c6b771424b53d219e661d6d6706John McCall } 1865ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 1866ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return NewUD; 1867ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 1868ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 1869ed97649e9574b9d854fa4d6109c9333ae0993554John McCallDecl *TemplateDeclInstantiator::VisitUsingShadowDecl(UsingShadowDecl *D) { 18709f54ad4381370c6b771424b53d219e661d6d6706John McCall // Ignore these; we handle them in bulk when processing the UsingDecl. 18719f54ad4381370c6b771424b53d219e661d6d6706John McCall return 0; 1872ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 1873ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 18747ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallDecl * TemplateDeclInstantiator 18757ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall ::VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D) { 18765149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor NestedNameSpecifierLoc QualifierLoc 18775149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(), 18785149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor TemplateArgs); 18795149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor if (!QualifierLoc) 18807ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall return 0; 18817ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall 18827ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall CXXScopeSpec SS; 18835149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor SS.Adopt(QualifierLoc); 18847ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall 1885ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara // Since NameInfo refers to a typename, it cannot be a C++ special name. 1886ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara // Hence, no tranformation is required for it. 1887ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara DeclarationNameInfo NameInfo(D->getDeclName(), D->getLocation()); 18887ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall NamedDecl *UD = 18897ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall SemaRef.BuildUsingDeclaration(/*Scope*/ 0, D->getAccess(), 1890ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara D->getUsingLoc(), SS, NameInfo, 0, 18917ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall /*instantiation*/ true, 18927ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall /*typename*/ true, D->getTypenameLoc()); 18934469e8a97cdca3725b4f8f366916143113c029acDouglas Gregor if (UD) 1894ed97649e9574b9d854fa4d6109c9333ae0993554John McCall SemaRef.Context.setInstantiatedFromUsingDecl(cast<UsingDecl>(UD), D); 1895ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 18967ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall return UD; 18977ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall} 18987ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall 18997ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallDecl * TemplateDeclInstantiator 19007ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall ::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) { 19015149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor NestedNameSpecifierLoc QualifierLoc 19025149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(), TemplateArgs); 19035149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor if (!QualifierLoc) 19040dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson return 0; 19055149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor 19060dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson CXXScopeSpec SS; 19075149f37cfc736d03233bf92b5ba7c6e866c6647bDouglas Gregor SS.Adopt(QualifierLoc); 19081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1909ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara DeclarationNameInfo NameInfo 1910ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara = SemaRef.SubstDeclarationNameInfo(D->getNameInfo(), TemplateArgs); 1911ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara 19121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *UD = 19139488ea120e093068021f944176c3d610dd540914John McCall SemaRef.BuildUsingDeclaration(/*Scope*/ 0, D->getAccess(), 1914ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara D->getUsingLoc(), SS, NameInfo, 0, 19157ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall /*instantiation*/ true, 19167ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall /*typename*/ false, SourceLocation()); 19174469e8a97cdca3725b4f8f366916143113c029acDouglas Gregor if (UD) 1918ed97649e9574b9d854fa4d6109c9333ae0993554John McCall SemaRef.Context.setInstantiatedFromUsingDecl(cast<UsingDecl>(UD), D); 1919ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 19200d8df780aef1acda5962347a32591efc629b6748Anders Carlsson return UD; 19210dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson} 19220dde18e5a713bc186062ca1ebc9967500b07faeeAnders Carlsson 1923af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 1924af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois PichetDecl *TemplateDeclInstantiator::VisitClassScopeFunctionSpecializationDecl( 1925af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet ClassScopeFunctionSpecializationDecl *Decl) { 1926af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet CXXMethodDecl *OldFD = Decl->getSpecialization(); 1927af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet CXXMethodDecl *NewFD = cast<CXXMethodDecl>(VisitCXXMethodDecl(OldFD, 0, true)); 1928af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 1929af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet LookupResult Previous(SemaRef, NewFD->getNameInfo(), Sema::LookupOrdinaryName, 1930af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet Sema::ForRedeclaration); 1931af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 1932af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet SemaRef.LookupQualifiedName(Previous, SemaRef.CurContext); 1933af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet if (SemaRef.CheckFunctionTemplateSpecialization(NewFD, 0, Previous)) { 1934af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet NewFD->setInvalidDecl(); 1935af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet return NewFD; 1936af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet } 1937af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 1938af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet // Associate the specialization with the pattern. 1939af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet FunctionDecl *Specialization = cast<FunctionDecl>(Previous.getFoundDecl()); 1940af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet assert(Specialization && "Class scope Specialization is null"); 1941af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet SemaRef.Context.setClassScopeSpecializationPattern(Specialization, OldFD); 1942af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 1943af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet return NewFD; 1944af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet} 1945af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet 1946ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCallDecl *Sema::SubstDecl(Decl *D, DeclContext *Owner, 1947d6350aefb1396b299e199c7f1fe51bb40c12e75eDouglas Gregor const MultiLevelTemplateArgumentList &TemplateArgs) { 19487e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor TemplateDeclInstantiator Instantiator(*this, Owner, TemplateArgs); 19492fa98001f832836e3f652c211a9d2f80501d659aDouglas Gregor if (D->isInvalidDecl()) 19502fa98001f832836e3f652c211a9d2f80501d659aDouglas Gregor return 0; 19512fa98001f832836e3f652c211a9d2f80501d659aDouglas Gregor 19528dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Instantiator.Visit(D); 19538dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 19548dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1955e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall/// \brief Instantiates a nested template parameter list in the current 1956e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall/// instantiation context. 1957e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall/// 1958e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall/// \param L The parameter list to instantiate 1959e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall/// 1960e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall/// \returns NULL if there was an error 1961e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCallTemplateParameterList * 1962ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCallTemplateDeclInstantiator::SubstTemplateParams(TemplateParameterList *L) { 1963e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall // Get errors for all the parameters before bailing out. 1964e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall bool Invalid = false; 1965e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 1966e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall unsigned N = L->size(); 19675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner typedef SmallVector<NamedDecl *, 8> ParamVector; 1968e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall ParamVector Params; 1969e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall Params.reserve(N); 1970e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall for (TemplateParameterList::iterator PI = L->begin(), PE = L->end(); 1971e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall PI != PE; ++PI) { 1972bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor NamedDecl *D = cast_or_null<NamedDecl>(Visit(*PI)); 1973e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall Params.push_back(D); 19749148c3f5829f4d031249faeb1043e7be914539e8Douglas Gregor Invalid = Invalid || !D || D->isInvalidDecl(); 1975e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall } 1976e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 1977e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall // Clean up if we had an error. 1978ff331c15729f7d4439d253c97f4d60f2a7ffd0c6Douglas Gregor if (Invalid) 1979e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall return NULL; 1980e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 1981e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall TemplateParameterList *InstL 1982e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall = TemplateParameterList::Create(SemaRef.Context, L->getTemplateLoc(), 1983e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall L->getLAngleLoc(), &Params.front(), N, 1984e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall L->getRAngleLoc()); 1985e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall return InstL; 19861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 1987e29ba20148e9b7835ad463b39cd4ee9223eafbbfJohn McCall 1988ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor/// \brief Instantiate the declaration of a class template partial 1989ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor/// specialization. 1990ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor/// 1991ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor/// \param ClassTemplate the (instantiated) class template that is partially 1992ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor// specialized by the instantiation of \p PartialSpec. 1993ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor/// 1994ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor/// \param PartialSpec the (uninstantiated) class template partial 1995ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor/// specialization that we are instantiating. 1996ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor/// 1997d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor/// \returns The instantiated partial specialization, if successful; otherwise, 1998d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor/// NULL to indicate an error. 1999d65587f7a6d38965fa37158d3f57990a7faf3836Douglas GregorClassTemplatePartialSpecializationDecl * 2000ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas GregorTemplateDeclInstantiator::InstantiateClassTemplatePartialSpecialization( 2001ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor ClassTemplateDecl *ClassTemplate, 2002ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor ClassTemplatePartialSpecializationDecl *PartialSpec) { 2003550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // Create a local instantiation scope for this class template partial 2004550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // specialization, which will contain the instantiations of the template 2005550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor // parameters. 20062a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall LocalInstantiationScope Scope(SemaRef); 2007550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor 2008ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Substitute into the template parameters of the class template partial 2009ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // specialization. 2010ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor TemplateParameterList *TempParams = PartialSpec->getTemplateParameters(); 2011ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor TemplateParameterList *InstParams = SubstTemplateParams(TempParams); 2012ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (!InstParams) 2013d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor return 0; 2014ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 2015ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Substitute into the template arguments of the class template partial 2016ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // specialization. 2017d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall TemplateArgumentListInfo InstTemplateArgs; // no angle locations 2018e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor if (SemaRef.Subst(PartialSpec->getTemplateArgsAsWritten(), 2019e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor PartialSpec->getNumTemplateArgsAsWritten(), 2020e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor InstTemplateArgs, TemplateArgs)) 2021e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor return 0; 2022ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 2023ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Check that the template argument list is well-formed for this 2024ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // class template. 20255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 4> Converted; 2026ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (SemaRef.CheckTemplateArgumentList(ClassTemplate, 2027ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor PartialSpec->getLocation(), 2028d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall InstTemplateArgs, 2029ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor false, 2030ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor Converted)) 2031d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor return 0; 2032ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 2033ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Figure out where to insert this class template partial specialization 2034ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // in the member template's set of class template partial specializations. 2035ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor void *InsertPos = 0; 2036ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor ClassTemplateSpecializationDecl *PrevDecl 2037910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = ClassTemplate->findPartialSpecialization(Converted.data(), 2038910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Converted.size(), InsertPos); 2039ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 2040ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Build the canonical type that describes the converted template 2041ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // arguments of the class template partial specialization. 2042ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor QualType CanonType 2043ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = SemaRef.Context.getTemplateSpecializationType(TemplateName(ClassTemplate), 2044910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Converted.data(), 2045910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Converted.size()); 2046ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 2047ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Build the fully-sugared type for this class template 2048ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // specialization as the user wrote in the specialization 2049ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // itself. This means that we'll pretty-print the type retrieved 2050ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // from the specialization's declaration the way that the user 2051ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // actually wrote the specialization, rather than formatting the 2052ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // name based on the "canonical" representation used to store the 2053ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // template arguments in the specialization. 20543cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TypeSourceInfo *WrittenTy 20553cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall = SemaRef.Context.getTemplateSpecializationTypeInfo( 20563cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TemplateName(ClassTemplate), 20573cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall PartialSpec->getLocation(), 2058d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall InstTemplateArgs, 2059ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor CanonType); 2060ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 2061ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (PrevDecl) { 2062ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // We've already seen a partial specialization with the same template 2063ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // parameters and template arguments. This can happen, for example, when 2064ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // substituting the outer template arguments ends up causing two 2065ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // class template partial specializations of a member class template 2066ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // to have identical forms, e.g., 2067ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // 2068ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // template<typename T, typename U> 2069ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // struct Outer { 2070ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // template<typename X, typename Y> struct Inner; 2071ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // template<typename Y> struct Inner<T, Y>; 2072ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // template<typename Y> struct Inner<U, Y>; 2073ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // }; 2074ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // 2075ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Outer<int, int> outer; // error: the partial specializations of Inner 2076ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // // have the same signature. 2077ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor SemaRef.Diag(PartialSpec->getLocation(), diag::err_partial_spec_redeclared) 2078d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor << WrittenTy->getType(); 2079ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor SemaRef.Diag(PrevDecl->getLocation(), diag::note_prev_partial_spec_here) 2080ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor << SemaRef.Context.getTypeDeclType(PrevDecl); 2081d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor return 0; 2082ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor } 2083ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 2084ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 2085ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Create the class template partial specialization declaration. 2086ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor ClassTemplatePartialSpecializationDecl *InstPartialSpec 208713c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor = ClassTemplatePartialSpecializationDecl::Create(SemaRef.Context, 208813c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor PartialSpec->getTagKind(), 208913c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor Owner, 2090ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara PartialSpec->getLocStart(), 2091ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara PartialSpec->getLocation(), 2092ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor InstParams, 2093ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor ClassTemplate, 2094910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Converted.data(), 2095910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Converted.size(), 2096d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall InstTemplateArgs, 20973cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall CanonType, 2098dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor 0, 2099cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplate->getNextPartialSpecSequenceNumber()); 2100b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall // Substitute the nested name specifier, if any. 2101b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall if (SubstQualifier(PartialSpec, InstPartialSpec)) 2102b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall return 0; 2103b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall 2104ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor InstPartialSpec->setInstantiatedFromMember(PartialSpec); 21054469e8a97cdca3725b4f8f366916143113c029acDouglas Gregor InstPartialSpec->setTypeAsWritten(WrittenTy); 21064469e8a97cdca3725b4f8f366916143113c029acDouglas Gregor 2107ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // Add this partial specialization to the set of class template partial 2108ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor // specializations. 2109cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplate->AddPartialSpecialization(InstPartialSpec, InsertPos); 2110d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor return InstPartialSpec; 2111ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 2112ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 211321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTypeSourceInfo* 211421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCallTemplateDeclInstantiator::SubstFunctionType(FunctionDecl *D, 21155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<ParmVarDecl *> &Params) { 211621ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall TypeSourceInfo *OldTInfo = D->getTypeSourceInfo(); 211721ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall assert(OldTInfo && "substituting function without type source info"); 211821ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall assert(Params.empty() && "parameter vector is non-empty at start"); 21196cd3b9fb8a29bb70fff01719bdde238723d67c10John McCall TypeSourceInfo *NewTInfo 21206cd3b9fb8a29bb70fff01719bdde238723d67c10John McCall = SemaRef.SubstFunctionDeclType(OldTInfo, TemplateArgs, 21216cd3b9fb8a29bb70fff01719bdde238723d67c10John McCall D->getTypeSpecStartLoc(), 21226cd3b9fb8a29bb70fff01719bdde238723d67c10John McCall D->getDeclName()); 212321ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall if (!NewTInfo) 212421ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return 0; 21255545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 2126cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor if (NewTInfo != OldTInfo) { 2127cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor // Get parameters from the new type info. 2128140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara TypeLoc OldTL = OldTInfo->getTypeLoc().IgnoreParens(); 21296920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor if (FunctionProtoTypeLoc *OldProtoLoc 21306920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor = dyn_cast<FunctionProtoTypeLoc>(&OldTL)) { 2131140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara TypeLoc NewTL = NewTInfo->getTypeLoc().IgnoreParens(); 21326920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor FunctionProtoTypeLoc *NewProtoLoc = cast<FunctionProtoTypeLoc>(&NewTL); 21336920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor assert(NewProtoLoc && "Missing prototype?"); 213412c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor unsigned NewIdx = 0, NumNewParams = NewProtoLoc->getNumArgs(); 213512c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor for (unsigned OldIdx = 0, NumOldParams = OldProtoLoc->getNumArgs(); 213612c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor OldIdx != NumOldParams; ++OldIdx) { 213712c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor ParmVarDecl *OldParam = OldProtoLoc->getArg(OldIdx); 213812c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor if (!OldParam->isParameterPack() || 213912c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor (NewIdx < NumNewParams && 214012c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor NewProtoLoc->getArg(NewIdx)->isParameterPack())) { 214112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor // Simple case: normal parameter, or a parameter pack that's 214212c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor // instantiated to a (still-dependent) parameter pack. 214312c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor ParmVarDecl *NewParam = NewProtoLoc->getArg(NewIdx++); 214412c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor Params.push_back(NewParam); 214512c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(OldParam, 214612c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor NewParam); 214712c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor continue; 214812c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor } 214912c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor 215012c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor // Parameter pack: make the instantiation an argument pack. 215112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor SemaRef.CurrentInstantiationScope->MakeInstantiatedLocalArgPack( 215212c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor OldParam); 215321371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor unsigned NumArgumentsInExpansion 215421371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor = SemaRef.getNumArgumentsInExpansion(OldParam->getType(), 215521371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor TemplateArgs); 215621371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor while (NumArgumentsInExpansion--) { 215712c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor ParmVarDecl *NewParam = NewProtoLoc->getArg(NewIdx++); 215812c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor Params.push_back(NewParam); 215912c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocalPackArg(OldParam, 216012c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor NewParam); 216112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor } 21626920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor } 2163895162da2d52f4243f61081d7436de66af4503fcDouglas Gregor } 2164cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor } else { 2165cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor // The function type itself was not dependent and therefore no 2166cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor // substitution occurred. However, we still need to instantiate 2167cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor // the function parameters themselves. 2168140a2bd77539b4537010d8cd6a0a3805ce724b3eAbramo Bagnara TypeLoc OldTL = OldTInfo->getTypeLoc().IgnoreParens(); 21696920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor if (FunctionProtoTypeLoc *OldProtoLoc 21706920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor = dyn_cast<FunctionProtoTypeLoc>(&OldTL)) { 21716920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor for (unsigned i = 0, i_end = OldProtoLoc->getNumArgs(); i != i_end; ++i) { 21726920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor ParmVarDecl *Parm = VisitParmVarDecl(OldProtoLoc->getArg(i)); 21736920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor if (!Parm) 21746920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor return 0; 21756920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor Params.push_back(Parm); 21766920cdce298ac9ba50dc7ebb7dea982a300b0664Douglas Gregor } 2177cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor } 2178cb27b0f70d2017295776afafe3616e0bcd74ab51Douglas Gregor } 217921ef0fa27b0783ec0bc6aa5b524feb2ec840f952John McCall return NewTInfo; 21805545e166a956a20d7a6b58408e251a1119025485Douglas Gregor} 21815545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 21821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Initializes the common fields of an instantiation function 2183e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor/// declaration (New) from the corresponding fields of its template (Tmpl). 2184e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor/// 2185e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor/// \returns true if there was an error 21861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool 21871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateDeclInstantiator::InitFunctionInstantiation(FunctionDecl *New, 2188e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor FunctionDecl *Tmpl) { 218910620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt if (Tmpl->isDeletedAsWritten()) 219010620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt New->setDeletedAsWritten(); 21911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2192cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor // If we are performing substituting explicitly-specified template arguments 2193cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor // or deduced template arguments into a function template and we reach this 2194cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor // point, we are now past the point where SFINAE applies and have committed 21951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // to keeping the new function template specialization. We therefore 21961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // convert the active template instantiation for the function template 2197cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor // into a template instantiation for this specific function template 2198cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor // specialization, which is not a SFINAE context, so that we diagnose any 2199cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor // further errors in the declaration itself. 2200cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor typedef Sema::ActiveTemplateInstantiation ActiveInstType; 2201cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor ActiveInstType &ActiveInst = SemaRef.ActiveTemplateInstantiations.back(); 2202cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor if (ActiveInst.Kind == ActiveInstType::ExplicitTemplateArgumentSubstitution || 2203cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor ActiveInst.Kind == ActiveInstType::DeducedTemplateArgumentSubstitution) { 22041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (FunctionTemplateDecl *FunTmpl 2205cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor = dyn_cast<FunctionTemplateDecl>((Decl *)ActiveInst.Entity)) { 22061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(FunTmpl->getTemplatedDecl() == Tmpl && 2207cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor "Deduction from the wrong function template?"); 2208bcbb8bd3326a86aa70b7df386ae3c86c9ad255c5Daniel Dunbar (void) FunTmpl; 2209cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor ActiveInst.Kind = ActiveInstType::TemplateInstantiation; 2210cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor ActiveInst.Entity = reinterpret_cast<uintptr_t>(New); 2211f35f828f9883123772a9731af190a608f3236ef4Douglas Gregor --SemaRef.NonInstantiationEntries; 2212cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor } 2213cca9e9674a5e50a283185d8e9d8a5c3414eb008eDouglas Gregor } 22141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22150ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor const FunctionProtoType *Proto = Tmpl->getType()->getAs<FunctionProtoType>(); 22160ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor assert(Proto && "Function template without prototype?"); 22170ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor 221860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl if (Proto->hasExceptionSpec() || Proto->getNoReturnAttr()) { 22190ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor // The function has an exception specification or a "noreturn" 22200ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor // attribute. Substitute into each of the exception types. 22215f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<QualType, 4> Exceptions; 22220ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor for (unsigned I = 0, N = Proto->getNumExceptions(); I != N; ++I) { 22230ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor // FIXME: Poor location information! 2224b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor if (const PackExpansionType *PackExpansion 2225b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor = Proto->getExceptionType(I)->getAs<PackExpansionType>()) { 2226b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor // We have a pack expansion. Instantiate it. 22275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<UnexpandedParameterPack, 2> Unexpanded; 2228b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 2229b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor Unexpanded); 2230b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor assert(!Unexpanded.empty() && 2231b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor "Pack expansion without parameter packs?"); 223260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl 2233b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor bool Expand = false; 2234d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool RetainExpansion = false; 2235cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions 2236cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor = PackExpansion->getNumExpansions(); 2237b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor if (SemaRef.CheckParameterPacksForExpansion(New->getLocation(), 2238b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor SourceRange(), 2239b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor Unexpanded.data(), 2240b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor Unexpanded.size(), 2241b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor TemplateArgs, 2242d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor Expand, 2243d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor RetainExpansion, 2244d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor NumExpansions)) 2245b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor break; 224660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl 2247b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor if (!Expand) { 2248b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor // We can't expand this pack expansion into separate arguments yet; 2249cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor // just substitute into the pattern and create a new pack expansion 2250cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor // type. 2251b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, -1); 2252b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor QualType T = SemaRef.SubstType(PackExpansion->getPattern(), 2253b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor TemplateArgs, 2254b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor New->getLocation(), New->getDeclName()); 2255b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor if (T.isNull()) 2256b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor break; 2257b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor 2258cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor T = SemaRef.Context.getPackExpansionType(T, NumExpansions); 2259b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor Exceptions.push_back(T); 2260b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor continue; 2261b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor } 226260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl 2263b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor // Substitute into the pack expansion pattern for each template 2264b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor bool Invalid = false; 2265cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 2266b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, ArgIdx); 2267b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor 2268b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor QualType T = SemaRef.SubstType(PackExpansion->getPattern(), 2269b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor TemplateArgs, 2270b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor New->getLocation(), New->getDeclName()); 2271b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor if (T.isNull()) { 2272b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor Invalid = true; 2273b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor break; 2274b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor } 227560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl 2276b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor Exceptions.push_back(T); 2277b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor } 227860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl 2279b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor if (Invalid) 2280b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor break; 228160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl 2282b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor continue; 2283b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor } 2284b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor 22850ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor QualType T 22860ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor = SemaRef.SubstType(Proto->getExceptionType(I), TemplateArgs, 22870ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor New->getLocation(), New->getDeclName()); 22880ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor if (T.isNull() || 22890ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor SemaRef.CheckSpecifiedExceptionType(T, New->getLocation())) 22900ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor continue; 22910ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor 22920ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor Exceptions.push_back(T); 22930ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor } 229456fb926c93786739cfd0867e7ada31ace3bda946Sebastian Redl Expr *NoexceptExpr = 0; 229556fb926c93786739cfd0867e7ada31ace3bda946Sebastian Redl if (Expr *OldNoexceptExpr = Proto->getNoexceptExpr()) { 22963617e198aa89d4aa0921343a22b96823a63f8a58Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 229756fb926c93786739cfd0867e7ada31ace3bda946Sebastian Redl ExprResult E = SemaRef.SubstExpr(OldNoexceptExpr, TemplateArgs); 229856fb926c93786739cfd0867e7ada31ace3bda946Sebastian Redl if (E.isUsable()) 229956fb926c93786739cfd0867e7ada31ace3bda946Sebastian Redl NoexceptExpr = E.take(); 230056fb926c93786739cfd0867e7ada31ace3bda946Sebastian Redl } 23010ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor 23020ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor // Rebuild the function type 23030ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor 2304e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall FunctionProtoType::ExtProtoInfo EPI = Proto->getExtProtoInfo(); 230560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl EPI.ExceptionSpecType = Proto->getExceptionSpecType(); 2306e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.NumExceptions = Exceptions.size(); 2307e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.Exceptions = Exceptions.data(); 230856fb926c93786739cfd0867e7ada31ace3bda946Sebastian Redl EPI.NoexceptExpr = NoexceptExpr; 2309e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI.ExtInfo = Proto->getExtInfo(); 2310e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall 23110ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor const FunctionProtoType *NewProto 23120ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor = New->getType()->getAs<FunctionProtoType>(); 23130ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor assert(NewProto && "Template instantiation without function prototype?"); 23140ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor New->setType(SemaRef.Context.getFunctionType(NewProto->getResultType(), 23150ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor NewProto->arg_type_begin(), 23160ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor NewProto->getNumArgs(), 2317e23cf437fe76b1ed02d63c3f61b456fd48a915f5John McCall EPI)); 23180ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor } 23190ae7b3f1d5403265f693ed75384603ca8fbba74dDouglas Gregor 232019f74acdf8842ceece578b7307884f5ba22d7f59Rafael Espindola const FunctionDecl* Definition = Tmpl; 232119f74acdf8842ceece578b7307884f5ba22d7f59Rafael Espindola 232219f74acdf8842ceece578b7307884f5ba22d7f59Rafael Espindola // Get the definition. Leaves the variable unchanged if undefined. 232319f74acdf8842ceece578b7307884f5ba22d7f59Rafael Espindola Tmpl->isDefined(Definition); 232419f74acdf8842ceece578b7307884f5ba22d7f59Rafael Espindola 232519f74acdf8842ceece578b7307884f5ba22d7f59Rafael Espindola SemaRef.InstantiateAttrs(TemplateArgs, Definition, New); 23267cf84d66965a7706004d8590b5af5fe54b85f525Douglas Gregor 2327e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor return false; 2328e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor} 2329e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 23305545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \brief Initializes common fields of an instantiated method 23315545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// declaration (New) from the corresponding fields of its template 23325545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// (Tmpl). 23335545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// 23345545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \returns true if there was an error 23351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool 23361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateDeclInstantiator::InitMethodInstantiation(CXXMethodDecl *New, 23375545e166a956a20d7a6b58408e251a1119025485Douglas Gregor CXXMethodDecl *Tmpl) { 2338e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (InitFunctionInstantiation(New, Tmpl)) 2339e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor return true; 23401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23415545e166a956a20d7a6b58408e251a1119025485Douglas Gregor New->setAccess(Tmpl->getAccess()); 2342e7184df728bb339633d88c774b5097dd9318cc8aFariborz Jahanian if (Tmpl->isVirtualAsWritten()) 234385606ebf3dd1b5dd81a59ef25b5ad47627664774Douglas Gregor New->setVirtualAsWritten(true); 23445545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 23455545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // FIXME: attributes 23465545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // FIXME: New needs a pointer to Tmpl 23475545e166a956a20d7a6b58408e251a1119025485Douglas Gregor return false; 23485545e166a956a20d7a6b58408e251a1119025485Douglas Gregor} 2349a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor 2350a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// \brief Instantiate the definition of the given function from its 2351a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// template. 2352a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// 2353b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// \param PointOfInstantiation the point at which the instantiation was 2354b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// required. Note that this is not precisely a "point of instantiation" 2355b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// for the function, but it's close. 2356b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// 2357a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// \param Function the already-instantiated declaration of a 2358b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// function template specialization or member function of a class template 2359b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// specialization. 2360b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// 2361b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// \param Recursive if true, recursively instantiates any functions that 2362b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor/// are required by this instantiation. 2363e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// 2364e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// \param DefinitionRequired if true, then we are performing an explicit 2365e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// instantiation where the body of the function is required. Complain if 2366e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// there is no such body. 2367f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregorvoid Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, 2368b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor FunctionDecl *Function, 2369e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor bool Recursive, 2370e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor bool DefinitionRequired) { 237110620eb5164e31208fcbf0437cd79ae535ed0559Sean Hunt if (Function->isInvalidDecl() || Function->isDefined()) 237254dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor return; 237354dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor 2374af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet // Never instantiate an explicit specialization except if it is a class scope 2375af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet // explicit specialization. 2376af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet if (Function->getTemplateSpecializationKind() == TSK_ExplicitSpecialization && 2377af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet !Function->getClassScopeSpecializationPattern()) 2378251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor return; 23796cfacfe54c75baa4d67f1fbdf4f80644b662818eDouglas Gregor 23801eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor // Find the function body that we'll be substituting. 23813b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor const FunctionDecl *PatternDecl = Function->getTemplateInstantiationPattern(); 2382f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt assert(PatternDecl && "instantiating a non-template"); 2383f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt 2384f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt Stmt *Pattern = PatternDecl->getBody(PatternDecl); 2385f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt assert(PatternDecl && "template definition is not a template"); 2386f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt if (!Pattern) { 2387f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt // Try to find a defaulted definition 2388f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt PatternDecl->isDefined(PatternDecl); 2389dfab854e6855dad076c0207b29859d452e398437Sean Hunt } 2390f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt assert(PatternDecl && "template definition is not a template"); 23911eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor 23928387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet // Postpone late parsed template instantiations. 2393f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt if (PatternDecl->isLateTemplateParsed() && 23948a29bc047a374df2464869b55581c24def68c2ecNick Lewycky !LateTemplateParser) { 23958387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet PendingInstantiations.push_back( 23968387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet std::make_pair(Function, PointOfInstantiation)); 23978387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet return; 23988387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet } 23998387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet 24008387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet // Call the LateTemplateParser callback if there a need to late parse 24018387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet // a templated function definition. 2402f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt if (!Pattern && PatternDecl->isLateTemplateParsed() && 24038387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet LateTemplateParser) { 24044a47e8d35dc1778ef7e428d9edd7676be67e725fFrancois Pichet LateTemplateParser(OpaqueParser, PatternDecl); 24058387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet Pattern = PatternDecl->getBody(PatternDecl); 24068387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet } 24078387e2a41eef6fa17fb140a18c29b6eee9dd2b8aFrancois Pichet 2408f996e051d9953550982b57132daad8a5e3f7bd65Sean Hunt if (!Pattern && !PatternDecl->isDefaulted()) { 2409e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor if (DefinitionRequired) { 2410e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor if (Function->getPrimaryTemplate()) 2411e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor Diag(PointOfInstantiation, 2412e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor diag::err_explicit_instantiation_undefined_func_template) 2413e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor << Function->getPrimaryTemplate(); 2414e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor else 2415e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor Diag(PointOfInstantiation, 2416e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor diag::err_explicit_instantiation_undefined_member) 2417e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor << 1 << Function->getDeclName() << Function->getDeclContext(); 2418e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor 2419e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor if (PatternDecl) 2420e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor Diag(PatternDecl->getLocation(), 2421e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor diag::note_explicit_instantiation_here); 2422cfe833be882f600206f1587f157b025b368497d7Douglas Gregor Function->setInvalidDecl(); 242358e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth } else if (Function->getTemplateSpecializationKind() 242458e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth == TSK_ExplicitInstantiationDefinition) { 242562c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PendingInstantiations.push_back( 242658e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth std::make_pair(Function, PointOfInstantiation)); 2427e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor } 242858e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth 24291eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor return; 2430e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor } 24311eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor 2432d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor // C++0x [temp.explicit]p9: 2433d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor // Except for inline functions, other explicit instantiation declarations 24341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // have the effect of suppressing the implicit instantiation of the entity 2435d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor // to which they refer. 24361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Function->getTemplateSpecializationKind() 2437d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor == TSK_ExplicitInstantiationDeclaration && 24387ced9c8529b734e313f62a3b81189d6f402f6713Douglas Gregor !PatternDecl->isInlined()) 2439d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor return; 24401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2441f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor InstantiatingTemplate Inst(*this, PointOfInstantiation, Function); 2442f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor if (Inst) 2443e7089b0c6ffe8a8854150b60df00fb544099f77dDouglas Gregor return; 2444e7089b0c6ffe8a8854150b60df00fb544099f77dDouglas Gregor 2445b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor // If we're performing recursive template instantiation, create our own 2446b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor // queue of pending implicit instantiations that we will instantiate later, 2447b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor // while we're still within our own instantiation context. 24485f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<VTableUse, 16> SavedVTableUses; 244962c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth std::deque<PendingImplicitInstantiation> SavedPendingInstantiations; 24502a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky if (Recursive) { 24512a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky VTableUses.swap(SavedVTableUses); 245262c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PendingInstantiations.swap(SavedPendingInstantiations); 24532a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky } 24541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24559679cafc6368cceed1a5e69d3038d0316401b352Douglas Gregor EnterExpressionEvaluationContext EvalContext(*this, 2456f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::PotentiallyEvaluated); 2457d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall ActOnStartOfFunctionDef(0, Function); 2458e2c31ff0bc622e6fd7d47d7e08b53840f3be6c89Douglas Gregor 245954dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor // Introduce a new scope where local variable instantiations will be 246060406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor // recorded, unless we're actually a member function within a local 246160406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor // class, in which case we need to merge our results with the parent 246260406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor // scope (of the enclosing function). 246360406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor bool MergeWithParentScope = false; 246460406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor if (CXXRecordDecl *Rec = dyn_cast<CXXRecordDecl>(Function->getDeclContext())) 246560406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor MergeWithParentScope = Rec->isLocalClass(); 246660406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor 246760406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor LocalInstantiationScope Scope(*this, MergeWithParentScope); 24681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 246954dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor // Introduce the instantiated function parameters into the local 24708a6c0f1a48b8167ca1457c9f05288fa637033dc9Peter Collingbourne // instantiation scope, and set the parameter names to those used 24718a6c0f1a48b8167ca1457c9f05288fa637033dc9Peter Collingbourne // in the template. 247212c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor unsigned FParamIdx = 0; 24738a6c0f1a48b8167ca1457c9f05288fa637033dc9Peter Collingbourne for (unsigned I = 0, N = PatternDecl->getNumParams(); I != N; ++I) { 24748a6c0f1a48b8167ca1457c9f05288fa637033dc9Peter Collingbourne const ParmVarDecl *PatternParam = PatternDecl->getParamDecl(I); 247512c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor if (!PatternParam->isParameterPack()) { 247612c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor // Simple case: not a parameter pack. 247712c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor assert(FParamIdx < Function->getNumParams()); 247812c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor ParmVarDecl *FunctionParam = Function->getParamDecl(I); 247912c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor FunctionParam->setDeclName(PatternParam->getDeclName()); 248012c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor Scope.InstantiatedLocal(PatternParam, FunctionParam); 248112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor ++FParamIdx; 248212c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor continue; 248312c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor } 248412c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor 248512c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor // Expand the parameter pack. 248612c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor Scope.MakeInstantiatedLocalArgPack(PatternParam); 248712c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor for (unsigned NumFParams = Function->getNumParams(); 248812c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor FParamIdx < NumFParams; 248912c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor ++FParamIdx) { 249012c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor ParmVarDecl *FunctionParam = Function->getParamDecl(FParamIdx); 249112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor FunctionParam->setDeclName(PatternParam->getDeclName()); 249212c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor Scope.InstantiatedLocalPackArg(PatternParam, FunctionParam); 249312c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor } 24948a6c0f1a48b8167ca1457c9f05288fa637033dc9Peter Collingbourne } 249554dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor 2496b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor // Enter the scope of this instantiation. We don't use 2497b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor // PushDeclContext because we don't have a scope. 2498eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall Sema::ContextRAII savedContext(*this, Function); 2499b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor 25001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MultiLevelTemplateArgumentList TemplateArgs = 2501e7089b0c6ffe8a8854150b60df00fb544099f77dDouglas Gregor getTemplateInstantiationArgs(Function, 0, false, PatternDecl); 2502090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson 2503cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt if (PatternDecl->isDefaulted()) { 2504cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt ActOnFinishFunctionBody(Function, 0, /*IsInstantiation=*/true); 25051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2506cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt SetDeclDefaulted(Function, PatternDecl->getLocation()); 2507cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt } else { 2508cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt // If this is a constructor, instantiate the member initializers. 2509cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt if (const CXXConstructorDecl *Ctor = 2510cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt dyn_cast<CXXConstructorDecl>(PatternDecl)) { 2511cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt InstantiateMemInitializers(cast<CXXConstructorDecl>(Function), Ctor, 2512cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt TemplateArgs); 2513cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt } 2514cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt 2515cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt // Instantiate the function body. 2516cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt StmtResult Body = SubstStmt(Pattern, TemplateArgs); 2517cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt 2518cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt if (Body.isInvalid()) 2519cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt Function->setInvalidDecl(); 2520cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt 2521cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt ActOnFinishFunctionBody(Function, Body.get(), 2522cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt /*IsInstantiation=*/true); 2523cd10dec673680fd18a2e5a27646173780c059d32Sean Hunt } 2524b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor 25250c01d18094100db92d38daa923c95661512db203John McCall PerformDependentDiagnostics(PatternDecl, TemplateArgs); 25260c01d18094100db92d38daa923c95661512db203John McCall 2527eee1d5434ebfa955ffc3c493aecd68bb7b3f4838John McCall savedContext.pop(); 2528aba43bb13b3aa3e81990989375fba3a902bfe1c2Douglas Gregor 2529aba43bb13b3aa3e81990989375fba3a902bfe1c2Douglas Gregor DeclGroupRef DG(Function); 2530aba43bb13b3aa3e81990989375fba3a902bfe1c2Douglas Gregor Consumer.HandleTopLevelDecl(DG); 25311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 253260406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor // This class may have local implicit instantiations that need to be 253360406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor // instantiation within this scope. 253462c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PerformPendingInstantiations(/*LocalOnly=*/true); 253560406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor Scope.Exit(); 253660406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor 2537b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor if (Recursive) { 25382a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky // Define any pending vtables. 25392a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky DefineUsedVTables(); 25402a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky 2541b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor // Instantiate any pending implicit instantiations found during the 25421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // instantiation of this template. 254362c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PerformPendingInstantiations(); 25441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25452a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky // Restore the set of pending vtables. 25468155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky assert(VTableUses.empty() && 25478155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky "VTableUses should be empty before it is discarded."); 25482a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky VTableUses.swap(SavedVTableUses); 25492a5f99eb4e2af771faacfceb9f78e230129c5e5aNick Lewycky 2550b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor // Restore the set of pending implicit instantiations. 25518155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky assert(PendingInstantiations.empty() && 25528155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky "PendingInstantiations should be empty before it is discarded."); 255362c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PendingInstantiations.swap(SavedPendingInstantiations); 2554b33fe2ff12676bff9db595fdf77e29014d7ba397Douglas Gregor } 2555a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor} 2556a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor 2557a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// \brief Instantiate the definition of the given variable from its 2558a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// template. 2559a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// 25607caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// \param PointOfInstantiation the point at which the instantiation was 25617caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// required. Note that this is not precisely a "point of instantiation" 25627caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// for the function, but it's close. 25637caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// 25647caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// \param Var the already-instantiated declaration of a static member 25657caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// variable of a class template specialization. 25667caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// 25677caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// \param Recursive if true, recursively instantiates any functions that 25687caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor/// are required by this instantiation. 2569e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// 2570e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// \param DefinitionRequired if true, then we are performing an explicit 2571e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// instantiation where an out-of-line definition of the member variable 2572e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor/// is required. Complain if there is no such definition. 25737caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregorvoid Sema::InstantiateStaticDataMemberDefinition( 25747caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor SourceLocation PointOfInstantiation, 25757caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor VarDecl *Var, 2576e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor bool Recursive, 2577e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor bool DefinitionRequired) { 25787caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (Var->isInvalidDecl()) 25797caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return; 25801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25817caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // Find the out-of-line definition of this static data member. 25827caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor VarDecl *Def = Var->getInstantiatedFromStaticDataMember(); 25837caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Def && "This data member was not instantiated from a template?"); 25840d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor assert(Def->isStaticDataMember() && "Not a static data member?"); 25850d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor Def = Def->getOutOfLineDefinition(); 25861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 25870d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor if (!Def) { 25887caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // We did not find an out-of-line definition of this static data member, 25897caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // so we won't perform any instantiation. Rather, we rely on the user to 25901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // instantiate this definition (or provide a specialization for it) in 25911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // another translation unit. 2592e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor if (DefinitionRequired) { 25930d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor Def = Var->getInstantiatedFromStaticDataMember(); 2594e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor Diag(PointOfInstantiation, 2595e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor diag::err_explicit_instantiation_undefined_member) 2596e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor << 2 << Var->getDeclName() << Var->getDeclContext(); 2597e2d3a3de71b2fa35614cb732a6da95a41fa38ad9Douglas Gregor Diag(Def->getLocation(), diag::note_explicit_instantiation_here); 259858e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth } else if (Var->getTemplateSpecializationKind() 259958e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth == TSK_ExplicitInstantiationDefinition) { 260062c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PendingInstantiations.push_back( 260158e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth std::make_pair(Var, PointOfInstantiation)); 260258e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth } 260358e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth 26047caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return; 26057caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor } 26067caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor 2607251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor // Never instantiate an explicit specialization. 26081028c9f0afc1cc5f4951b39b7067fa57c1fea07bDouglas Gregor if (Var->getTemplateSpecializationKind() == TSK_ExplicitSpecialization) 2609251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor return; 2610251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor 2611251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor // C++0x [temp.explicit]p9: 2612251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor // Except for inline functions, other explicit instantiation declarations 2613251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor // have the effect of suppressing the implicit instantiation of the entity 2614251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor // to which they refer. 26151028c9f0afc1cc5f4951b39b7067fa57c1fea07bDouglas Gregor if (Var->getTemplateSpecializationKind() 2616251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor == TSK_ExplicitInstantiationDeclaration) 2617251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor return; 26181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2619f15748a28c8443eef2924ef83689c358c661e9c5Douglas Gregor // If we already have a definition, we're done. 2620f15748a28c8443eef2924ef83689c358c661e9c5Douglas Gregor if (Var->getDefinition()) 2621f15748a28c8443eef2924ef83689c358c661e9c5Douglas Gregor return; 2622f15748a28c8443eef2924ef83689c358c661e9c5Douglas Gregor 26237caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor InstantiatingTemplate Inst(*this, PointOfInstantiation, Var); 26247caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (Inst) 26257caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return; 26261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26277caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // If we're performing recursive template instantiation, create our own 26287caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // queue of pending implicit instantiations that we will instantiate later, 26297caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // while we're still within our own instantiation context. 26305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<VTableUse, 16> SavedVTableUses; 263162c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth std::deque<PendingImplicitInstantiation> SavedPendingInstantiations; 26328155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky if (Recursive) { 26338155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky VTableUses.swap(SavedVTableUses); 263462c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PendingInstantiations.swap(SavedPendingInstantiations); 26358155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky } 26361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26377caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // Enter the scope of this instantiation. We don't use 26387caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // PushDeclContext because we don't have a scope. 2639f5ba7e089daadcd60b0f6e31d932be8bb6045281John McCall ContextRAII previousContext(*this, Var->getDeclContext()); 26401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26411028c9f0afc1cc5f4951b39b7067fa57c1fea07bDouglas Gregor VarDecl *OldVar = Var; 2642ce3ff2bd3a3386dbc209d3cba4b8769173b274c1John McCall Var = cast_or_null<VarDecl>(SubstDecl(Def, Var->getDeclContext(), 26436bb4dcb412d53d05a80017df81d41e447e2aa3eaNico Weber getTemplateInstantiationArgs(Var))); 2644f5ba7e089daadcd60b0f6e31d932be8bb6045281John McCall 2645f5ba7e089daadcd60b0f6e31d932be8bb6045281John McCall previousContext.pop(); 26467caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor 26477caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (Var) { 2648583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor MemberSpecializationInfo *MSInfo = OldVar->getMemberSpecializationInfo(); 2649583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor assert(MSInfo && "Missing member specialization information?"); 2650583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor Var->setTemplateSpecializationKind(MSInfo->getTemplateSpecializationKind(), 2651583f33b8a9227bace1a77a15404b4c64dc619d69Douglas Gregor MSInfo->getPointOfInstantiation()); 26527caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor DeclGroupRef DG(Var); 26537caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor Consumer.HandleTopLevelDecl(DG); 26547caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor } 26551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26567caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (Recursive) { 26578155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // Define any newly required vtables. 26588155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky DefineUsedVTables(); 26598155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky 26607caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // Instantiate any pending implicit instantiations found during the 26611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // instantiation of this template. 266262c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PerformPendingInstantiations(); 26631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 26648155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky // Restore the set of pending vtables. 26658155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky assert(VTableUses.empty() && 26668155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky "VTableUses should be empty before it is discarded, " 26678155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky "while instantiating static data member."); 26688155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky VTableUses.swap(SavedVTableUses); 26698155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky 26707caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // Restore the set of pending implicit instantiations. 26718155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky assert(PendingInstantiations.empty() && 26728155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky "PendingInstantiations should be empty before it is discarded, " 26738155910a192dafa423d6b932b7d127d48e4641e8Nick Lewycky "while instantiating static data member."); 267462c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PendingInstantiations.swap(SavedPendingInstantiations); 26751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 2676a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor} 2677815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 2678090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlssonvoid 2679090253155017b7eec031bbd7bf07824a448e1d7aAnders CarlssonSema::InstantiateMemInitializers(CXXConstructorDecl *New, 2680090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson const CXXConstructorDecl *Tmpl, 2681090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson const MultiLevelTemplateArgumentList &TemplateArgs) { 26821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 268390ab75b5ad328d2b155ec83fd4e80cd0f7af5729Richard Trieu SmallVector<CXXCtorInitializer*, 4> NewInits; 26849db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor bool AnyErrors = false; 26859db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 2686090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson // Instantiate all the initializers. 2687090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson for (CXXConstructorDecl::init_const_iterator Inits = Tmpl->init_begin(), 268872f6d678c8de9f3a770e8ae5fc4979abf3940668Douglas Gregor InitsEnd = Tmpl->init_end(); 268972f6d678c8de9f3a770e8ae5fc4979abf3940668Douglas Gregor Inits != InitsEnd; ++Inits) { 2690cbb67480094b3bcb5b715acd827cbad55e2a204cSean Hunt CXXCtorInitializer *Init = *Inits; 2691090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson 2692030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth // Only instantiate written initializers, let Sema re-construct implicit 2693030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth // ones. 2694030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth if (!Init->isWritten()) 2695030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth continue; 2696030ef472f31709e175895853fcb43d61d09022c7Chandler Carruth 26976b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor SourceLocation LParenLoc, RParenLoc; 2698ca0408fb49c1370430672acf2d770b7151cf71deJohn McCall ASTOwningVector<Expr*> NewArgs(*this); 26991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27003fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor SourceLocation EllipsisLoc; 27013fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 27023fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor if (Init->isPackExpansion()) { 27033fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor // This is a pack expansion. We should expand it now. 27043fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor TypeLoc BaseTL = Init->getBaseClassInfo()->getTypeLoc(); 27055f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<UnexpandedParameterPack, 2> Unexpanded; 27063fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor collectUnexpandedParameterPacks(BaseTL, Unexpanded); 27073fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor bool ShouldExpand = false; 2708d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor bool RetainExpansion = false; 2709cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> NumExpansions; 27103fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor if (CheckParameterPacksForExpansion(Init->getEllipsisLoc(), 27113fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor BaseTL.getSourceRange(), 27123fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor Unexpanded.data(), 27133fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor Unexpanded.size(), 27143fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor TemplateArgs, ShouldExpand, 2715d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor RetainExpansion, 27163fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor NumExpansions)) { 27173fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor AnyErrors = true; 27183fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor New->setInvalidDecl(); 27193fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor continue; 27203fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor } 27213fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor assert(ShouldExpand && "Partial instantiation of base initializer?"); 27223fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 27233fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor // Loop over all of the arguments in the argument pack(s), 2724cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor for (unsigned I = 0; I != *NumExpansions; ++I) { 27253fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(*this, I); 27263fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 27273fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor // Instantiate the initializer. 27280ff6f8f038f32d85c32fd984673cea51ef737b22Richard Smith if (InstantiateInitializer(Init->getInit(), TemplateArgs, 27293fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor LParenLoc, NewArgs, RParenLoc)) { 27303fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor AnyErrors = true; 27313fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor break; 27323fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor } 27333fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 27343fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor // Instantiate the base type. 27353fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor TypeSourceInfo *BaseTInfo = SubstType(Init->getBaseClassInfo(), 27363fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor TemplateArgs, 27373fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor Init->getSourceLocation(), 27383fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor New->getDeclName()); 27393fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor if (!BaseTInfo) { 27403fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor AnyErrors = true; 27413fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor break; 27423fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor } 27433fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 27443fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor // Build the initializer. 27453fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor MemInitResult NewInit = BuildBaseInitializer(BaseTInfo->getType(), 27463fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor BaseTInfo, 27473fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor (Expr **)NewArgs.data(), 27483fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor NewArgs.size(), 27493fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor Init->getLParenLoc(), 27503fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor Init->getRParenLoc(), 27513fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor New->getParent(), 27523fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor SourceLocation()); 27533fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor if (NewInit.isInvalid()) { 27543fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor AnyErrors = true; 27553fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor break; 27563fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor } 27573fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 27583fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor NewInits.push_back(NewInit.get()); 27593fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor NewArgs.clear(); 27603fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor } 27613fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 27623fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor continue; 27633fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor } 27643fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor 27656b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor // Instantiate the initializer. 27660ff6f8f038f32d85c32fd984673cea51ef737b22Richard Smith if (InstantiateInitializer(Init->getInit(), TemplateArgs, 2767a1a04786cea2445759026edacd096abd1fbf4a05Douglas Gregor LParenLoc, NewArgs, RParenLoc)) { 27686b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor AnyErrors = true; 27696b98b2e5f33ce2dcdb7fa385f7e21672d49f1a69Douglas Gregor continue; 2770090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson } 27719db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor 2772090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson MemInitResult NewInit; 2773090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson if (Init->isBaseInitializer()) { 2774a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *BaseTInfo = SubstType(Init->getBaseClassInfo(), 2775802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor TemplateArgs, 2776802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor Init->getSourceLocation(), 2777802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor New->getDeclName()); 2778a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall if (!BaseTInfo) { 27799db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor AnyErrors = true; 2780802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor New->setInvalidDecl(); 2781802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor continue; 2782802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor } 2783802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor 2784a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall NewInit = BuildBaseInitializer(BaseTInfo->getType(), BaseTInfo, 27851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (Expr **)NewArgs.data(), 2786090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson NewArgs.size(), 2787802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor Init->getLParenLoc(), 2788090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson Init->getRParenLoc(), 27893fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor New->getParent(), 27903fb9e4b89f72823f162096086f0f964e6dcf66d6Douglas Gregor EllipsisLoc); 2791090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson } else if (Init->isMemberInitializer()) { 2792b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor FieldDecl *Member = cast_or_null<FieldDecl>(FindInstantiatedDecl( 279300eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Init->getMemberLocation(), 279400eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Init->getMember(), 279500eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet TemplateArgs)); 2796b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor if (!Member) { 2797b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor AnyErrors = true; 2798b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor New->setInvalidDecl(); 2799b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor continue; 2800b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor } 28011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NewInit = BuildMemberInitializer(Member, (Expr **)NewArgs.data(), 2803090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson NewArgs.size(), 2804090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson Init->getSourceLocation(), 2805802ab45fea51beff12f386329d4928811a479c6eDouglas Gregor Init->getLParenLoc(), 2806090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson Init->getRParenLoc()); 280700eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet } else if (Init->isIndirectMemberInitializer()) { 280800eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet IndirectFieldDecl *IndirectMember = 2809b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor cast_or_null<IndirectFieldDecl>(FindInstantiatedDecl( 281000eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Init->getMemberLocation(), 281100eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Init->getIndirectMember(), TemplateArgs)); 281200eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet 2813b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor if (!IndirectMember) { 2814b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor AnyErrors = true; 2815b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor New->setInvalidDecl(); 2816b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor continue; 2817b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor } 2818b710722d2348cd0945d2b4f02062c7f685146eb0Douglas Gregor 281900eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet NewInit = BuildMemberInitializer(IndirectMember, (Expr **)NewArgs.data(), 282000eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet NewArgs.size(), 282100eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Init->getSourceLocation(), 282200eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Init->getLParenLoc(), 282300eb3f9c5b33e3d99aee1f8b75dd9c9678fdd66bFrancois Pichet Init->getRParenLoc()); 2824090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson } 2825090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson 28269db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor if (NewInit.isInvalid()) { 28279db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor AnyErrors = true; 2828090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson New->setInvalidDecl(); 28299db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor } else { 2830090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson // FIXME: It would be nice if ASTOwningVector had a release function. 2831090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson NewArgs.take(); 28321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 283390ab75b5ad328d2b155ec83fd4e80cd0f7af5729Richard Trieu NewInits.push_back(NewInit.get()); 2834090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson } 2835090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson } 28361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2837090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson // Assign all the initializers to the new constructor. 2838d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall ActOnMemInitializers(New, 2839090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson /*FIXME: ColonLoc */ 2840090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson SourceLocation(), 28419db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor NewInits.data(), NewInits.size(), 28429db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor AnyErrors); 2843090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson} 2844090253155017b7eec031bbd7bf07824a448e1d7aAnders Carlsson 284552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall// TODO: this could be templated if the various decl types used the 284652a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall// same method name. 284752a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCallstatic bool isInstantiationOf(ClassTemplateDecl *Pattern, 284852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall ClassTemplateDecl *Instance) { 284952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Pattern = Pattern->getCanonicalDecl(); 285052a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 285152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall do { 285252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getCanonicalDecl(); 285352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (Pattern == Instance) return true; 285452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getInstantiatedFromMemberTemplate(); 285552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall } while (Instance); 285652a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 285752a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return false; 285852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall} 285952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 28600d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregorstatic bool isInstantiationOf(FunctionTemplateDecl *Pattern, 28610d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor FunctionTemplateDecl *Instance) { 28620d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor Pattern = Pattern->getCanonicalDecl(); 28630d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor 28640d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor do { 28650d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor Instance = Instance->getCanonicalDecl(); 28660d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor if (Pattern == Instance) return true; 28670d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor Instance = Instance->getInstantiatedFromMemberTemplate(); 28680d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor } while (Instance); 28690d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor 28700d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor return false; 28710d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor} 28720d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor 2873ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorstatic bool 2874ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas GregorisInstantiationOf(ClassTemplatePartialSpecializationDecl *Pattern, 2875ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor ClassTemplatePartialSpecializationDecl *Instance) { 2876ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor Pattern 2877ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = cast<ClassTemplatePartialSpecializationDecl>(Pattern->getCanonicalDecl()); 2878ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor do { 2879ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor Instance = cast<ClassTemplatePartialSpecializationDecl>( 2880ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor Instance->getCanonicalDecl()); 2881ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (Pattern == Instance) 2882ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return true; 2883ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor Instance = Instance->getInstantiatedFromMember(); 2884ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor } while (Instance); 2885ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 2886ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return false; 2887ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 2888ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 288952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCallstatic bool isInstantiationOf(CXXRecordDecl *Pattern, 289052a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall CXXRecordDecl *Instance) { 289152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Pattern = Pattern->getCanonicalDecl(); 289252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 289352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall do { 289452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getCanonicalDecl(); 289552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (Pattern == Instance) return true; 289652a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getInstantiatedFromMemberClass(); 289752a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall } while (Instance); 289852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 289952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return false; 290052a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall} 290152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 290252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCallstatic bool isInstantiationOf(FunctionDecl *Pattern, 290352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall FunctionDecl *Instance) { 290452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Pattern = Pattern->getCanonicalDecl(); 290552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 290652a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall do { 290752a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getCanonicalDecl(); 290852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (Pattern == Instance) return true; 290952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getInstantiatedFromMemberFunction(); 291052a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall } while (Instance); 291152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 291252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return false; 291352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall} 291452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 291552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCallstatic bool isInstantiationOf(EnumDecl *Pattern, 291652a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall EnumDecl *Instance) { 291752a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Pattern = Pattern->getCanonicalDecl(); 291852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 291952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall do { 292052a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getCanonicalDecl(); 292152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (Pattern == Instance) return true; 292252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getInstantiatedFromMemberEnum(); 292352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall } while (Instance); 292452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 292552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return false; 292652a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall} 292752a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 2928ed97649e9574b9d854fa4d6109c9333ae0993554John McCallstatic bool isInstantiationOf(UsingShadowDecl *Pattern, 2929ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingShadowDecl *Instance, 2930ed97649e9574b9d854fa4d6109c9333ae0993554John McCall ASTContext &C) { 2931ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return C.getInstantiatedFromUsingShadowDecl(Instance) == Pattern; 2932ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 2933ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 2934ed97649e9574b9d854fa4d6109c9333ae0993554John McCallstatic bool isInstantiationOf(UsingDecl *Pattern, 2935ed97649e9574b9d854fa4d6109c9333ae0993554John McCall UsingDecl *Instance, 2936ed97649e9574b9d854fa4d6109c9333ae0993554John McCall ASTContext &C) { 2937ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return C.getInstantiatedFromUsingDecl(Instance) == Pattern; 2938ed97649e9574b9d854fa4d6109c9333ae0993554John McCall} 2939ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 29407ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallstatic bool isInstantiationOf(UnresolvedUsingValueDecl *Pattern, 29417ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall UsingDecl *Instance, 29427ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall ASTContext &C) { 2943ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return C.getInstantiatedFromUsingDecl(Instance) == Pattern; 29447ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall} 29457ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall 29467ba107a1863ddfa1664555854f0d7bdb3c491c92John McCallstatic bool isInstantiationOf(UnresolvedUsingTypenameDecl *Pattern, 29470d8df780aef1acda5962347a32591efc629b6748Anders Carlsson UsingDecl *Instance, 29480d8df780aef1acda5962347a32591efc629b6748Anders Carlsson ASTContext &C) { 2949ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return C.getInstantiatedFromUsingDecl(Instance) == Pattern; 29500d8df780aef1acda5962347a32591efc629b6748Anders Carlsson} 29510d8df780aef1acda5962347a32591efc629b6748Anders Carlsson 295252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCallstatic bool isInstantiationOfStaticDataMember(VarDecl *Pattern, 295352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall VarDecl *Instance) { 295452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall assert(Instance->isStaticDataMember()); 295552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 295652a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Pattern = Pattern->getCanonicalDecl(); 295752a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 295852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall do { 295952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getCanonicalDecl(); 296052a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (Pattern == Instance) return true; 296152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall Instance = Instance->getInstantiatedFromStaticDataMember(); 296252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall } while (Instance); 296352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 296452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return false; 296552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall} 296652a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 2967ed97649e9574b9d854fa4d6109c9333ae0993554John McCall// Other is the prospective instantiation 2968ed97649e9574b9d854fa4d6109c9333ae0993554John McCall// D is the prospective pattern 2969815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregorstatic bool isInstantiationOf(ASTContext &Ctx, NamedDecl *D, Decl *Other) { 29700d8df780aef1acda5962347a32591efc629b6748Anders Carlsson if (D->getKind() != Other->getKind()) { 29717ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall if (UnresolvedUsingTypenameDecl *UUD 29727ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall = dyn_cast<UnresolvedUsingTypenameDecl>(D)) { 29737ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall if (UsingDecl *UD = dyn_cast<UsingDecl>(Other)) { 29747ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall return isInstantiationOf(UUD, UD, Ctx); 29757ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall } 29767ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall } 29777ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall 29787ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall if (UnresolvedUsingValueDecl *UUD 29797ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall = dyn_cast<UnresolvedUsingValueDecl>(D)) { 29800d8df780aef1acda5962347a32591efc629b6748Anders Carlsson if (UsingDecl *UD = dyn_cast<UsingDecl>(Other)) { 29810d8df780aef1acda5962347a32591efc629b6748Anders Carlsson return isInstantiationOf(UUD, UD, Ctx); 29820d8df780aef1acda5962347a32591efc629b6748Anders Carlsson } 29830d8df780aef1acda5962347a32591efc629b6748Anders Carlsson } 2984815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 29850d8df780aef1acda5962347a32591efc629b6748Anders Carlsson return false; 29860d8df780aef1acda5962347a32591efc629b6748Anders Carlsson } 29871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 298852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(Other)) 298952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return isInstantiationOf(cast<CXXRecordDecl>(D), Record); 29901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 299152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Other)) 299252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return isInstantiationOf(cast<FunctionDecl>(D), Function); 2993815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 299452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (EnumDecl *Enum = dyn_cast<EnumDecl>(Other)) 299552a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return isInstantiationOf(cast<EnumDecl>(D), Enum); 2996815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 29977caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (VarDecl *Var = dyn_cast<VarDecl>(Other)) 299852a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (Var->isStaticDataMember()) 299952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return isInstantiationOfStaticDataMember(cast<VarDecl>(D), Var); 300052a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 300152a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall if (ClassTemplateDecl *Temp = dyn_cast<ClassTemplateDecl>(Other)) 300252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return isInstantiationOf(cast<ClassTemplateDecl>(D), Temp); 3003a5bf7f13d7772b164750997f95ab18487bbc4114Douglas Gregor 30040d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor if (FunctionTemplateDecl *Temp = dyn_cast<FunctionTemplateDecl>(Other)) 30050d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor return isInstantiationOf(cast<FunctionTemplateDecl>(D), Temp); 30060d696533420fca4cf32694621e3edf582ad4d06eDouglas Gregor 3007ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (ClassTemplatePartialSpecializationDecl *PartialSpec 3008ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<ClassTemplatePartialSpecializationDecl>(Other)) 3009ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return isInstantiationOf(cast<ClassTemplatePartialSpecializationDecl>(D), 3010ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor PartialSpec); 3011ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 3012d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (FieldDecl *Field = dyn_cast<FieldDecl>(Other)) { 3013d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (!Field->getDeclName()) { 3014d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson // This is an unnamed field. 30151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return Ctx.getInstantiatedFromUnnamedFieldDecl(Field) == 3016d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson cast<FieldDecl>(D); 3017d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 3018d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 30191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3020ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (UsingDecl *Using = dyn_cast<UsingDecl>(Other)) 3021ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return isInstantiationOf(cast<UsingDecl>(D), Using, Ctx); 3022ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 3023ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (UsingShadowDecl *Shadow = dyn_cast<UsingShadowDecl>(Other)) 3024ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return isInstantiationOf(cast<UsingShadowDecl>(D), Shadow, Ctx); 3025ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 3026815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return D->getDeclName() && isa<NamedDecl>(Other) && 3027815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor D->getDeclName() == cast<NamedDecl>(Other)->getDeclName(); 3028815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor} 3029815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 3030815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregortemplate<typename ForwardIterator> 30311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic NamedDecl *findInstantiationOf(ASTContext &Ctx, 3032815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor NamedDecl *D, 3033815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor ForwardIterator first, 3034815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor ForwardIterator last) { 3035815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor for (; first != last; ++first) 3036815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (isInstantiationOf(Ctx, D, *first)) 3037815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return cast<NamedDecl>(*first); 3038815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 3039815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return 0; 3040815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor} 3041815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 304202cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// \brief Finds the instantiation of the given declaration context 304302cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// within the current instantiation. 304402cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// 304502cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall/// \returns NULL if there was an error 30467c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas GregorDeclContext *Sema::FindInstantiatedContext(SourceLocation Loc, DeclContext* DC, 3047e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor const MultiLevelTemplateArgumentList &TemplateArgs) { 304802cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall if (NamedDecl *D = dyn_cast<NamedDecl>(DC)) { 30497c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor Decl* ID = FindInstantiatedDecl(Loc, D, TemplateArgs); 305002cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall return cast_or_null<DeclContext>(ID); 305102cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall } else return DC; 305202cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall} 305302cace78cf48cc26686bd5b07c78606abca13bcdJohn McCall 3054ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// \brief Find the instantiation of the given declaration within the 3055ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// current instantiation. 3056815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 3057815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// This routine is intended to be used when \p D is a declaration 3058815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// referenced from within a template, that needs to mapped into the 3059815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// corresponding declaration within an instantiation. For example, 3060815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// given: 3061815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 3062815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// \code 3063815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// template<typename T> 3064815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// struct X { 3065815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// enum Kind { 3066815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// KnownValue = sizeof(T) 3067815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// }; 3068815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 3069815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// bool getKind() const { return KnownValue; } 3070815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// }; 3071815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 3072815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// template struct X<int>; 3073815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// \endcode 3074815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 3075815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// In the instantiation of X<int>::getKind(), we need to map the 3076815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// EnumConstantDecl for KnownValue (which refers to 3077815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// X<T>::<Kind>::KnownValue) to its instantiation 3078ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// (X<int>::<Kind>::KnownValue). InstantiateCurrentDeclRef() performs 3079ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// this mapping from within the instantiation of X<int>. 30807c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas GregorNamedDecl *Sema::FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, 3081e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor const MultiLevelTemplateArgumentList &TemplateArgs) { 3082815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor DeclContext *ParentDC = D->getDeclContext(); 3083550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor if (isa<ParmVarDecl>(D) || isa<NonTypeTemplateParmDecl>(D) || 30846d3e627dacdb2f749195635ab587fd067ef813e1Douglas Gregor isa<TemplateTypeParmDecl>(D) || isa<TemplateTemplateParmDecl>(D) || 3085766724566289e6951a90b6483f0d3e22fe4b9b52John McCall (ParentDC->isFunctionOrMethod() && ParentDC->isDependentContext())) { 30862bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor // D is a local of some kind. Look into the map of local 30872bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor // declarations to their instantiations. 3088d8e54990ade0dd5566f8e3aa2e62def08753d1e9Chris Lattner typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack; 3089d8e54990ade0dd5566f8e3aa2e62def08753d1e9Chris Lattner llvm::PointerUnion<Decl *, DeclArgumentPack *> *Found 3090d8e54990ade0dd5566f8e3aa2e62def08753d1e9Chris Lattner = CurrentInstantiationScope->findInstantiationOf(D); 3091d8e54990ade0dd5566f8e3aa2e62def08753d1e9Chris Lattner 309257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner if (Found) { 309357ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner if (Decl *FD = Found->dyn_cast<Decl *>()) 309457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return cast<NamedDecl>(FD); 309557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 309657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner unsigned PackIdx = ArgumentPackSubstitutionIndex; 309757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return cast<NamedDecl>((*Found->get<DeclArgumentPack *>())[PackIdx]); 309857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner } 309957ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 310057ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner // If we didn't find the decl, then we must have a label decl that hasn't 310157ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner // been found yet. Lazily instantiate it and return it now. 310257ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner assert(isa<LabelDecl>(D)); 310357ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner 310457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner Decl *Inst = SubstDecl(D, CurContext, TemplateArgs); 310557ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner assert(Inst && "Failed to instantiate label??"); 3106d8e54990ade0dd5566f8e3aa2e62def08753d1e9Chris Lattner 310757ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner CurrentInstantiationScope->InstantiatedLocal(D, Inst); 310857ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner return cast<LabelDecl>(Inst); 31092bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor } 3110815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 3111e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(D)) { 3112e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor if (!Record->isDependentContext()) 3113e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor return D; 3114e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor 31158b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // If the RecordDecl is actually the injected-class-name or a 31168b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // "templated" declaration for a class template, class template 31178b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // partial specialization, or a member class of a class template, 31188b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // substitute into the injected-class-name of the class template 31198b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // or partial specialization to find the new DeclContext. 3120e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor QualType T; 3121e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor ClassTemplateDecl *ClassTemplate = Record->getDescribedClassTemplate(); 3122e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor 3123e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor if (ClassTemplate) { 312424bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor T = ClassTemplate->getInjectedClassNameSpecialization(); 3125e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor } else if (ClassTemplatePartialSpecializationDecl *PartialSpec 3126e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor = dyn_cast<ClassTemplatePartialSpecializationDecl>(Record)) { 3127e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor ClassTemplate = PartialSpec->getSpecializedTemplate(); 31283cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 31293cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall // If we call SubstType with an InjectedClassNameType here we 31303cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall // can end up in an infinite loop. 31313cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall T = Context.getTypeDeclType(Record); 31323cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(isa<InjectedClassNameType>(T) && 31333cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall "type of partial specialization is not an InjectedClassNameType"); 313431f17ecbef57b5679c017c375db330546b7b5145John McCall T = cast<InjectedClassNameType>(T)->getInjectedSpecializationType(); 31353cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall } 3136e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor 3137e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor if (!T.isNull()) { 31388b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // Substitute into the injected-class-name to get the type 31398b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // corresponding to the instantiation we want, which may also be 31408b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // the current instantiation (if we're in a template 31418b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // definition). This substitution should never fail, since we 31428b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // know we can instantiate the injected-class-name or we 31438b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // wouldn't have gotten to the injected-class-name! 31448b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor 31458b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // FIXME: Can we use the CurrentInstantiationScope to avoid this 31468b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // extra instantiation in the common case? 3147b46ae3964ba02535276c71332396e9a7bad2dfa5Douglas Gregor T = SubstType(T, TemplateArgs, Loc, DeclarationName()); 3148e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor assert(!T.isNull() && "Instantiation of injected-class-name cannot fail."); 3149e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor 3150e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor if (!T->isDependentType()) { 3151e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor assert(T->isRecordType() && "Instantiation must produce a record type"); 3152e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor return T->getAs<RecordType>()->getDecl(); 3153e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor } 3154e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor 31558b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // We are performing "partial" template instantiation to create 31568b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // the member declarations for the members of a class template 31578b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // specialization. Therefore, D is actually referring to something 31588b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // in the current instantiation. Look through the current 31598b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // context, which contains actual instantiations, to find the 31608b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // instantiation of the "current instantiation" that D refers 31618b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // to. 31628b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor bool SawNonDependentContext = false; 31631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (DeclContext *DC = CurContext; !DC->isFileContext(); 316452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall DC = DC->getParent()) { 31651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (ClassTemplateSpecializationDecl *Spec 31668b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor = dyn_cast<ClassTemplateSpecializationDecl>(DC)) 3167e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor if (isInstantiationOf(ClassTemplate, 3168e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor Spec->getSpecializedTemplate())) 316952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall return Spec; 31708b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor 31718b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor if (!DC->isDependentContext()) 31728b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor SawNonDependentContext = true; 317352a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall } 317452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 31758b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // We're performing "instantiation" of a member of the current 31768b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // instantiation while we are type-checking the 31778b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor // definition. Compute the declaration context and return that. 31788b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor assert(!SawNonDependentContext && 31798b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor "No dependent context while instantiating record"); 31808b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor DeclContext *DC = computeDeclContext(T); 31818b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor assert(DC && 318252a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall "Unable to find declaration for the current instantiation"); 31838b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor return cast<CXXRecordDecl>(DC); 318452a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall } 31858b013bdbf6474ed25d4017635cac851e51163c25Douglas Gregor 3186e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor // Fall through to deal with other dependent record types (e.g., 3187e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor // anonymous unions in class templates). 3188e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor } 318952a575a5ce7b27b6612357cdba5aa4ec1574ad5eJohn McCall 3190e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor if (!ParentDC->isDependentContext()) 3191e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor return D; 3192e95b40961302c2130968ddfc3ba162e138f2118eDouglas Gregor 31937c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor ParentDC = FindInstantiatedContext(Loc, ParentDC, TemplateArgs); 31941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!ParentDC) 319544c73848d5d5bd34c05582dc8398a20bea7cd971Douglas Gregor return 0; 31961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3197815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (ParentDC != D->getDeclContext()) { 3198815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // We performed some kind of instantiation in the parent context, 3199815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // so now we need to look into the instantiated parent context to 3200815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // find the instantiation of the declaration D. 32017c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor 32023cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall // If our context used to be dependent, we may need to instantiate 32033cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall // it before performing lookup into that context. 3204eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor bool IsBeingInstantiated = false; 32053cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (CXXRecordDecl *Spec = dyn_cast<CXXRecordDecl>(ParentDC)) { 32067c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor if (!Spec->isDependentContext()) { 32077c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor QualType T = Context.getTypeDeclType(Spec); 32083cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall const RecordType *Tag = T->getAs<RecordType>(); 32093cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall assert(Tag && "type of non-dependent record is not a RecordType"); 3210eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor if (Tag->isBeingDefined()) 3211eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor IsBeingInstantiated = true; 32123cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (!Tag->isBeingDefined() && 32133cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall RequireCompleteType(Loc, T, diag::err_incomplete_type)) 32143cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return 0; 3215a43064c7b721a51ab2c0d0ccdc4f84064aa7ceccDouglas Gregor 3216a43064c7b721a51ab2c0d0ccdc4f84064aa7ceccDouglas Gregor ParentDC = Tag->getDecl(); 32177c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor } 32187c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor } 32197c1e98f1cb37b40e619a0c8aee8b337f037b432bDouglas Gregor 3220815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor NamedDecl *Result = 0; 3221815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (D->getDeclName()) { 322217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis DeclContext::lookup_result Found = ParentDC->lookup(D->getDeclName()); 3223815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor Result = findInstantiationOf(Context, D, Found.first, Found.second); 3224815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } else { 3225815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // Since we don't have a name for the entity we're looking for, 3226815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // our only option is to walk through all of the declarations to 3227815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // find that name. This will occur in a few cases: 3228815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // 3229815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // - anonymous struct/union within a template 3230815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // - unnamed class/struct/union/enum within a template 3231815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // 3232815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // FIXME: Find a better way to find these instantiations! 32331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result = findInstantiationOf(Context, D, 323417945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis ParentDC->decls_begin(), 323517945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis ParentDC->decls_end()); 3236815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } 32371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3238eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor if (!Result) { 3239eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor if (isa<UsingShadowDecl>(D)) { 3240eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // UsingShadowDecls can instantiate to nothing because of using hiding. 3241eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor } else if (Diags.hasErrorOccurred()) { 3242eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // We've already complained about something, so most likely this 3243eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // declaration failed to instantiate. There's no point in complaining 3244eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // further, since this is normal in invalid code. 3245eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor } else if (IsBeingInstantiated) { 3246eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // The class in which this member exists is currently being 3247eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // instantiated, and we haven't gotten around to instantiating this 3248eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // member yet. This can happen when the code uses forward declarations 3249eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // of member classes, and introduces ordering dependencies via 3250eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // template instantiation. 3251eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor Diag(Loc, diag::err_member_not_yet_instantiated) 3252eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor << D->getDeclName() 3253eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor << Context.getTypeDeclType(cast<CXXRecordDecl>(ParentDC)); 3254eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor Diag(D->getLocation(), diag::note_non_instantiated_member_here); 3255eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor } else { 3256eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor // We should have found something, but didn't. 3257eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor llvm_unreachable("Unable to find instantiation of declaration!"); 3258eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor } 3259eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor } 3260eff1dbec93999bfc5406eb861efd8add9de23633Douglas Gregor 3261815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor D = Result; 3262815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } 3263815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 3264815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return D; 3265815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor} 3266d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor 32671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Performs template instantiation for all implicit template 3268d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor/// instantiations we have seen until this point. 32698155910a192dafa423d6b932b7d127d48e4641e8Nick Lewyckyvoid Sema::PerformPendingInstantiations(bool LocalOnly) { 32706e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor // Load pending instantiations from the external source. 32716e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor if (!LocalOnly && ExternalSource) { 32726e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor SmallVector<std::pair<ValueDecl *, SourceLocation>, 4> Pending; 32736e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor ExternalSource->ReadPendingInstantiations(Pending); 32746e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor PendingInstantiations.insert(PendingInstantiations.begin(), 32756e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor Pending.begin(), Pending.end()); 32766e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor } 32776e4a3f5c59664af13e02e9bb58c2810b830e3b96Douglas Gregor 327860406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor while (!PendingLocalImplicitInstantiations.empty() || 327962c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth (!LocalOnly && !PendingInstantiations.empty())) { 328060406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor PendingImplicitInstantiation Inst; 328160406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor 328260406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor if (PendingLocalImplicitInstantiations.empty()) { 328362c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth Inst = PendingInstantiations.front(); 328462c78d54bee499dd87f768f48b21c9b5ec15e516Chandler Carruth PendingInstantiations.pop_front(); 328560406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor } else { 328660406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor Inst = PendingLocalImplicitInstantiations.front(); 328760406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor PendingLocalImplicitInstantiations.pop_front(); 328860406bede202b66ebdd98cac0c38d20f9698aecaDouglas Gregor } 32891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32907caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // Instantiate function definitions 32917caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Inst.first)) { 3292f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall PrettyDeclStackTraceEntry CrashInfo(*this, Function, SourceLocation(), 3293f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall "instantiating function definition"); 329458e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth bool DefinitionRequired = Function->getTemplateSpecializationKind() == 329558e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth TSK_ExplicitInstantiationDefinition; 329658e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth InstantiateFunctionDefinition(/*FIXME:*/Inst.second, Function, true, 329758e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth DefinitionRequired); 32987caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor continue; 32997caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor } 33001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33017caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor // Instantiate static data member definitions. 33027caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor VarDecl *Var = cast<VarDecl>(Inst.first); 33037caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor assert(Var->isStaticDataMember() && "Not a static data member?"); 3304c17fb7bd9a06b027c792c7dfad7e9fa430277affAnders Carlsson 3305291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth // Don't try to instantiate declarations if the most recent redeclaration 3306291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth // is invalid. 3307291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth if (Var->getMostRecentDeclaration()->isInvalidDecl()) 3308291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth continue; 3309291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth 3310291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth // Check if the most recent declaration has changed the specialization kind 3311291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth // and removed the need for implicit instantiation. 3312291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth switch (Var->getMostRecentDeclaration()->getTemplateSpecializationKind()) { 3313291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth case TSK_Undeclared: 3314291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth assert(false && "Cannot instantitiate an undeclared specialization."); 3315291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth case TSK_ExplicitInstantiationDeclaration: 3316291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth case TSK_ExplicitSpecialization: 331758e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth continue; // No longer need to instantiate this type. 331858e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth case TSK_ExplicitInstantiationDefinition: 331958e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth // We only need an instantiation if the pending instantiation *is* the 332058e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth // explicit instantiation. 332158e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth if (Var != Var->getMostRecentDeclaration()) continue; 3322291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth case TSK_ImplicitInstantiation: 3323291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth break; 3324291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth } 3325291b441a095b289c30d9f311fe37a2cf5ed6fd45Chandler Carruth 3326f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall PrettyDeclStackTraceEntry CrashInfo(*this, Var, Var->getLocation(), 3327f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall "instantiating static data member " 3328f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall "definition"); 33291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 333058e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth bool DefinitionRequired = Var->getTemplateSpecializationKind() == 333158e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth TSK_ExplicitInstantiationDefinition; 333258e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth InstantiateStaticDataMemberDefinition(/*FIXME:*/Inst.second, Var, true, 333358e390ef491c8fb11ae17445054ee09527b492d3Chandler Carruth DefinitionRequired); 3334d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor } 3335d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor} 33360c01d18094100db92d38daa923c95661512db203John McCall 33370c01d18094100db92d38daa923c95661512db203John McCallvoid Sema::PerformDependentDiagnostics(const DeclContext *Pattern, 33380c01d18094100db92d38daa923c95661512db203John McCall const MultiLevelTemplateArgumentList &TemplateArgs) { 33390c01d18094100db92d38daa923c95661512db203John McCall for (DeclContext::ddiag_iterator I = Pattern->ddiag_begin(), 33400c01d18094100db92d38daa923c95661512db203John McCall E = Pattern->ddiag_end(); I != E; ++I) { 33410c01d18094100db92d38daa923c95661512db203John McCall DependentDiagnostic *DD = *I; 33420c01d18094100db92d38daa923c95661512db203John McCall 33430c01d18094100db92d38daa923c95661512db203John McCall switch (DD->getKind()) { 33440c01d18094100db92d38daa923c95661512db203John McCall case DependentDiagnostic::Access: 33450c01d18094100db92d38daa923c95661512db203John McCall HandleDependentAccessCheck(*DD, TemplateArgs); 33460c01d18094100db92d38daa923c95661512db203John McCall break; 33470c01d18094100db92d38daa923c95661512db203John McCall } 33480c01d18094100db92d38daa923c95661512db203John McCall } 33490c01d18094100db92d38daa923c95661512db203John McCall} 3350