SemaTemplateInstantiateDecl.cpp revision 127102b5196ffe04bdb70fd553fe62c265ab10a9
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//===----------------------------------------------------------------------===/ 128dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#include "Sema.h" 13aba43bb13b3aa3e81990989375fba3a902bfe1c2Douglas Gregor#include "clang/AST/ASTConsumer.h" 148dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#include "clang/AST/ASTContext.h" 158dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#include "clang/AST/DeclTemplate.h" 168dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#include "clang/AST/DeclVisitor.h" 178dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#include "clang/AST/Expr.h" 188dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#include "llvm/Support/Compiler.h" 198dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 208dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregorusing namespace clang; 218dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 228dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregornamespace { 238dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor class VISIBILITY_HIDDEN TemplateDeclInstantiator 24b28317a8e5e0e2953d1e5406d753d6c3c7f1e7d2Chris Lattner : public DeclVisitor<TemplateDeclInstantiator, Decl *> { 258dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Sema &SemaRef; 268dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor DeclContext *Owner; 277e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor const TemplateArgumentList &TemplateArgs; 288dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 298dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor public: 308dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor typedef Sema::OwningExprResult OwningExprResult; 318dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 328dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor TemplateDeclInstantiator(Sema &SemaRef, DeclContext *Owner, 337e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor const TemplateArgumentList &TemplateArgs) 347e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor : SemaRef(SemaRef), Owner(Owner), TemplateArgs(TemplateArgs) { } 358dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 36390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // FIXME: Once we get closer to completion, replace these manually-written 37390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // declarations with automatically-generated ones from 38390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // clang/AST/DeclNodes.def. 394f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor Decl *VisitTranslationUnitDecl(TranslationUnitDecl *D); 404f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor Decl *VisitNamespaceDecl(NamespaceDecl *D); 418dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Decl *VisitTypedefDecl(TypedefDecl *D); 423d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor Decl *VisitVarDecl(VarDecl *D); 438dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Decl *VisitFieldDecl(FieldDecl *D); 448dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Decl *VisitStaticAssertDecl(StaticAssertDecl *D); 458dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Decl *VisitEnumDecl(EnumDecl *D); 466477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor Decl *VisitEnumConstantDecl(EnumConstantDecl *D); 47e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor Decl *VisitFunctionDecl(FunctionDecl *D); 48d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor Decl *VisitCXXRecordDecl(CXXRecordDecl *D); 492dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor Decl *VisitCXXMethodDecl(CXXMethodDecl *D); 50615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor Decl *VisitCXXConstructorDecl(CXXConstructorDecl *D); 5103b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D); 52bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor Decl *VisitCXXConversionDecl(CXXConversionDecl *D); 536477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor ParmVarDecl *VisitParmVarDecl(ParmVarDecl *D); 542dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor Decl *VisitOriginalParmVarDecl(OriginalParmVarDecl *D); 555545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 568dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // Base case. FIXME: Remove once we can instantiate everything. 578dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Decl *VisitDecl(Decl *) { 583d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor assert(false && "Template instantiation of unknown declaration kind!"); 598dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return 0; 608dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 615545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 625545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // Helper functions for instantiating methods. 635545e166a956a20d7a6b58408e251a1119025485Douglas Gregor QualType InstantiateFunctionType(FunctionDecl *D, 645545e166a956a20d7a6b58408e251a1119025485Douglas Gregor llvm::SmallVectorImpl<ParmVarDecl *> &Params); 65e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor bool InitFunctionInstantiation(FunctionDecl *New, FunctionDecl *Tmpl); 665545e166a956a20d7a6b58408e251a1119025485Douglas Gregor bool InitMethodInstantiation(CXXMethodDecl *New, CXXMethodDecl *Tmpl); 678dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor }; 688dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 698dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 704f722be4587a7a0dece399fb5405dda158971ae1Douglas GregorDecl * 714f722be4587a7a0dece399fb5405dda158971ae1Douglas GregorTemplateDeclInstantiator::VisitTranslationUnitDecl(TranslationUnitDecl *D) { 724f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor assert(false && "Translation units cannot be instantiated"); 734f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor return D; 744f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor} 754f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor 764f722be4587a7a0dece399fb5405dda158971ae1Douglas GregorDecl * 774f722be4587a7a0dece399fb5405dda158971ae1Douglas GregorTemplateDeclInstantiator::VisitNamespaceDecl(NamespaceDecl *D) { 784f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor assert(false && "Namespaces cannot be instantiated"); 794f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor return D; 804f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor} 814f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor 828dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *TemplateDeclInstantiator::VisitTypedefDecl(TypedefDecl *D) { 838dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor bool Invalid = false; 848dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor QualType T = D->getUnderlyingType(); 858dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (T->isDependentType()) { 861eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor T = SemaRef.InstantiateType(T, TemplateArgs, 871eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor D->getLocation(), D->getDeclName()); 888dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (T.isNull()) { 898dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Invalid = true; 908dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor T = SemaRef.Context.IntTy; 918dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 928dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 938dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 948dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // Create the new typedef 958dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor TypedefDecl *Typedef 968dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor = TypedefDecl::Create(SemaRef.Context, Owner, D->getLocation(), 978dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getIdentifier(), T); 988dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Invalid) 998dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Typedef->setInvalidDecl(); 1008dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1016ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor Owner->addDecl(SemaRef.Context, Typedef); 102bc221637f5ed3538b8495dd13b831c11e821c712Douglas Gregor 1038dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Typedef; 1048dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 1058dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1063d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas GregorDecl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D) { 1073d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor // Instantiate the type of the declaration 1083d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor QualType T = SemaRef.InstantiateType(D->getType(), TemplateArgs, 1093d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor D->getTypeSpecStartLoc(), 1103d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor D->getDeclName()); 1113d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor if (T.isNull()) 1123d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor return 0; 1133d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 114b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor // Build the instantiated declaration 1153d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor VarDecl *Var = VarDecl::Create(SemaRef.Context, Owner, 1163d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor D->getLocation(), D->getIdentifier(), 1173d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor T, D->getStorageClass(), 1183d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor D->getTypeSpecStartLoc()); 1193d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor Var->setThreadSpecified(D->isThreadSpecified()); 1203d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor Var->setCXXDirectInitializer(D->hasCXXDirectInitializer()); 1213d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor Var->setDeclaredInCondition(D->isDeclaredInCondition()); 1223d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 123390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // FIXME: In theory, we could have a previous declaration for variables that 124390b4cc8b45a05612349269ef08faab3e4688f06Mike Stump // are not static data members. 1253d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor bool Redeclaration = false; 126eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner SemaRef.CheckVariableDeclaration(Var, 0, Redeclaration); 1276ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor Owner->addDecl(SemaRef.Context, Var); 1283d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 1293d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor if (D->getInit()) { 1303d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor OwningExprResult Init 1317e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor = SemaRef.InstantiateExpr(D->getInit(), TemplateArgs); 1323d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor if (Init.isInvalid()) 1333d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor Var->setInvalidDecl(); 1343d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor else 135b28317a8e5e0e2953d1e5406d753d6c3c7f1e7d2Chris Lattner SemaRef.AddInitializerToDecl(Sema::DeclPtrTy::make(Var), move(Init), 1363d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor D->hasCXXDirectInitializer()); 137d308e6201afd3a8a198c52ba034d35ed19d4bafeDouglas Gregor } else { 138d308e6201afd3a8a198c52ba034d35ed19d4bafeDouglas Gregor // FIXME: Call ActOnUninitializedDecl? (Not always) 1393d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor } 1403d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 1413d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor return Var; 1423d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor} 1433d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 1448dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *TemplateDeclInstantiator::VisitFieldDecl(FieldDecl *D) { 1458dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor bool Invalid = false; 1468dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor QualType T = D->getType(); 1478dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (T->isDependentType()) { 1481eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor T = SemaRef.InstantiateType(T, TemplateArgs, 1491eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor D->getLocation(), D->getDeclName()); 1508dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (!T.isNull() && T->isFunctionType()) { 1518dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // C++ [temp.arg.type]p3: 1528dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // If a declaration acquires a function type through a type 1538dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // dependent on a template-parameter and this causes a 1548dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // declaration that does not use the syntactic form of a 1558dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // function declarator to have function type, the program is 1568dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // ill-formed. 1578dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor SemaRef.Diag(D->getLocation(), diag::err_field_instantiates_to_function) 1588dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor << T; 1598dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor T = QualType(); 1608dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Invalid = true; 1618dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 1628dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 1638dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1648dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Expr *BitWidth = D->getBitWidth(); 1658dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Invalid) 1668dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor BitWidth = 0; 1678dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor else if (BitWidth) { 168ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor // The bit-width expression is not potentially evaluated. 169ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 170ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor 1718dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor OwningExprResult InstantiatedBitWidth 1727e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor = SemaRef.InstantiateExpr(BitWidth, TemplateArgs); 1738dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (InstantiatedBitWidth.isInvalid()) { 1748dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Invalid = true; 1758dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor BitWidth = 0; 1768dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } else 177e9146f2e9f1c4e281544e8c080934c72d41012caAnders Carlsson BitWidth = InstantiatedBitWidth.takeAs<Expr>(); 1788dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 1798dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1808dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor FieldDecl *Field = SemaRef.CheckFieldDecl(D->getDeclName(), T, 1818dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor cast<RecordDecl>(Owner), 1828dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getLocation(), 1838dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->isMutable(), 1848dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor BitWidth, 1858dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getAccess(), 1868dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 0); 1878dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Field) { 1888dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Invalid) 1898dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Field->setInvalidDecl(); 1908dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1916ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor Owner->addDecl(SemaRef.Context, Field); 1928dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 1938dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1948dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Field; 1958dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 1968dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1978dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *TemplateDeclInstantiator::VisitStaticAssertDecl(StaticAssertDecl *D) { 1988dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Expr *AssertExpr = D->getAssertExpr(); 1998dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 200ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor // The expression in a static assertion is not potentially evaluated. 201ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 202ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor 2038dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor OwningExprResult InstantiatedAssertExpr 2047e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor = SemaRef.InstantiateExpr(AssertExpr, TemplateArgs); 2058dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (InstantiatedAssertExpr.isInvalid()) 2068dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return 0; 2078dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2088dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor OwningExprResult Message = SemaRef.Clone(D->getMessage()); 2098dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Decl *StaticAssert 210b28317a8e5e0e2953d1e5406d753d6c3c7f1e7d2Chris Lattner = SemaRef.ActOnStaticAssertDeclaration(D->getLocation(), 211b28317a8e5e0e2953d1e5406d753d6c3c7f1e7d2Chris Lattner move(InstantiatedAssertExpr), 212b28317a8e5e0e2953d1e5406d753d6c3c7f1e7d2Chris Lattner move(Message)).getAs<Decl>(); 2138dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return StaticAssert; 2148dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 2158dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2168dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *TemplateDeclInstantiator::VisitEnumDecl(EnumDecl *D) { 2178dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EnumDecl *Enum = EnumDecl::Create(SemaRef.Context, Owner, 2188dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getLocation(), D->getIdentifier(), 2198dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor /*PrevDecl=*/0); 2208dbc3c64965f99e48830885835b7d2fc26ec3cf5Douglas Gregor Enum->setInstantiationOfMemberEnum(D); 22106c0fecd197fef21e265a41bca8dc5022de1f864Douglas Gregor Enum->setAccess(D->getAccess()); 2226ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor Owner->addDecl(SemaRef.Context, Enum); 2238dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Enum->startDefinition(); 2248dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2250ca20ac8cea99c43d89510f29cf3dc876f9c9111Douglas Gregor llvm::SmallVector<Sema::DeclPtrTy, 4> Enumerators; 2268dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2278dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EnumConstantDecl *LastEnumConst = 0; 2286ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor for (EnumDecl::enumerator_iterator EC = D->enumerator_begin(SemaRef.Context), 2296ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor ECEnd = D->enumerator_end(SemaRef.Context); 2308dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EC != ECEnd; ++EC) { 2318dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // The specified value for the enumerator. 2328dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor OwningExprResult Value = SemaRef.Owned((Expr *)0); 233ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor if (Expr *UninstValue = EC->getInitExpr()) { 234ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor // The enumerator's value expression is not potentially evaluated. 235ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, 236ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor Action::Unevaluated); 237ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor 2387e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor Value = SemaRef.InstantiateExpr(UninstValue, TemplateArgs); 239ac7610dad6653bad02dd42de198ca358b6fb1f1dDouglas Gregor } 2408dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2418dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // Drop the initial value and continue. 2428dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor bool isInvalid = false; 2438dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Value.isInvalid()) { 2448dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Value = SemaRef.Owned((Expr *)0); 2458dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor isInvalid = true; 2468dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 2478dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2488dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EnumConstantDecl *EnumConst 2498dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor = SemaRef.CheckEnumConstant(Enum, LastEnumConst, 2508dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EC->getLocation(), EC->getIdentifier(), 2518dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor move(Value)); 2528dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2538dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (isInvalid) { 2548dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (EnumConst) 2558dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EnumConst->setInvalidDecl(); 2568dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Enum->setInvalidDecl(); 2578dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 2588dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2598dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (EnumConst) { 2606ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor Enum->addDecl(SemaRef.Context, EnumConst); 261b28317a8e5e0e2953d1e5406d753d6c3c7f1e7d2Chris Lattner Enumerators.push_back(Sema::DeclPtrTy::make(EnumConst)); 2628dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor LastEnumConst = EnumConst; 2638dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 2648dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 2658dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 266c6e35aae23bc3cea7daf5ee075fa695c01c0f66fMike Stump // FIXME: Fixup LBraceLoc and RBraceLoc 267c6e35aae23bc3cea7daf5ee075fa695c01c0f66fMike Stump SemaRef.ActOnEnumBody(Enum->getLocation(), SourceLocation(), SourceLocation(), 268c6e35aae23bc3cea7daf5ee075fa695c01c0f66fMike Stump Sema::DeclPtrTy::make(Enum), 2698dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor &Enumerators[0], Enumerators.size()); 2708dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2718dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Enum; 2728dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 2738dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2746477b69cc93e0a0ff15036d60d604f3544da0f29Douglas GregorDecl *TemplateDeclInstantiator::VisitEnumConstantDecl(EnumConstantDecl *D) { 2756477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor assert(false && "EnumConstantDecls can only occur within EnumDecls."); 2766477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor return 0; 2776477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor} 2786477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor 279d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas GregorDecl *TemplateDeclInstantiator::VisitCXXRecordDecl(CXXRecordDecl *D) { 280d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor CXXRecordDecl *PrevDecl = 0; 281d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor if (D->isInjectedClassName()) 282d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor PrevDecl = cast<CXXRecordDecl>(Owner); 283d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor 284d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor CXXRecordDecl *Record 285d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor = CXXRecordDecl::Create(SemaRef.Context, D->getTagKind(), Owner, 286d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor D->getLocation(), D->getIdentifier(), PrevDecl); 287d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor Record->setImplicit(D->isImplicit()); 288d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor Record->setAccess(D->getAccess()); 289d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor if (!D->isInjectedClassName()) 290d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor Record->setInstantiationOfMemberClass(D); 291d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor 2926ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor Owner->addDecl(SemaRef.Context, Record); 293d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor return Record; 294d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor} 295d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor 296e53060fa78ad7e98352049f72787bdb7543e2a48Douglas GregorDecl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D) { 297127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // Check whether there is already a function template specialization for 298127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // this declaration. 299127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor FunctionTemplateDecl *FunctionTemplate = D->getDescribedFunctionTemplate(); 300127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor void *InsertPos = 0; 301127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor if (FunctionTemplate) { 302127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor llvm::FoldingSetNodeID ID; 303127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor FunctionTemplateSpecializationInfo::Profile(ID, 304127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor TemplateArgs.getFlatArgumentList(), 305127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor TemplateArgs.flat_size()); 306127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor 307127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor FunctionTemplateSpecializationInfo *Info 308127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor = FunctionTemplate->getSpecializations().FindNodeOrInsertPos(ID, 309127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor InsertPos); 310127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor 311127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // If we already have a function template specialization, return it. 312127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor if (Info) 313127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor return Info->Function; 314127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor } 315e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 316e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor Sema::LocalInstantiationScope Scope(SemaRef); 317e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 318e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor llvm::SmallVector<ParmVarDecl *, 4> Params; 319e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor QualType T = InstantiateFunctionType(D, Params); 320e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (T.isNull()) 3212dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return 0; 322e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 323e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // Build the instantiated method declaration. 324e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor FunctionDecl *Function 325e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor = FunctionDecl::Create(SemaRef.Context, Owner, D->getLocation(), 326e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor D->getDeclName(), T, D->getStorageClass(), 327e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor D->isInline(), D->hasWrittenPrototype(), 328e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor D->getTypeSpecStartLoc()); 329e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 330e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // FIXME: friend functions 331e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 332e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // Attach the parameters 333e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor for (unsigned P = 0; P < Params.size(); ++P) 334e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor Params[P]->setOwningFunction(Function); 335e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor Function->setParams(SemaRef.Context, Params.data(), Params.size()); 336e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 337e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (InitFunctionInstantiation(Function, D)) 338e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor Function->setInvalidDecl(); 339e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 340e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor bool Redeclaration = false; 341e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor bool OverloadableAttrRequired = false; 342e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor NamedDecl *PrevDecl = 0; 343e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor SemaRef.CheckFunctionDeclaration(Function, PrevDecl, Redeclaration, 344e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor /*FIXME:*/OverloadableAttrRequired); 345e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 346127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor if (FunctionTemplate) { 347127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // Record this function template specialization. 348127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor Function->setFunctionTemplateSpecialization(SemaRef.Context, 349127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor FunctionTemplate, 350127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor &TemplateArgs, 351127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor InsertPos); 352127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor } 353127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor 354e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor return Function; 355e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor} 3562dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 357e53060fa78ad7e98352049f72787bdb7543e2a48Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D) { 358e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // FIXME: Look for existing, explicit specializations. 35948dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor Sema::LocalInstantiationScope Scope(SemaRef); 36048dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor 3610ca20ac8cea99c43d89510f29cf3dc876f9c9111Douglas Gregor llvm::SmallVector<ParmVarDecl *, 4> Params; 3625545e166a956a20d7a6b58408e251a1119025485Douglas Gregor QualType T = InstantiateFunctionType(D, Params); 3632dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (T.isNull()) 3642dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return 0; 3652dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 3662dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // Build the instantiated method declaration. 3672dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(Owner); 3682dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor CXXMethodDecl *Method 3692dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor = CXXMethodDecl::Create(SemaRef.Context, Record, D->getLocation(), 3702dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor D->getDeclName(), T, D->isStatic(), 3712dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor D->isInline()); 3721eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor Method->setInstantiationOfMemberFunction(D); 3732dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 3745545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // Attach the parameters 3755545e166a956a20d7a6b58408e251a1119025485Douglas Gregor for (unsigned P = 0; P < Params.size(); ++P) 3765545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Params[P]->setOwningFunction(Method); 377beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad Method->setParams(SemaRef.Context, Params.data(), Params.size()); 3785545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 3795545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (InitMethodInstantiation(Method, D)) 3805545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Method->setInvalidDecl(); 3812dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 3822dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor NamedDecl *PrevDecl 3832dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor = SemaRef.LookupQualifiedName(Owner, Method->getDeclName(), 3842dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor Sema::LookupOrdinaryName, true); 3852dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // In C++, the previous declaration we find might be a tag type 3862dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // (class or enum). In this case, the new declaration will hide the 3872dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // tag type. Note that this does does not apply if we're declaring a 3882dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // typedef (C++ [dcl.typedef]p4). 3892dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (PrevDecl && PrevDecl->getIdentifierNamespace() == Decl::IDNS_Tag) 3902dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor PrevDecl = 0; 3912dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor bool Redeclaration = false; 3922dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor bool OverloadableAttrRequired = false; 393eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner SemaRef.CheckFunctionDeclaration(Method, PrevDecl, Redeclaration, 394eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner /*FIXME:*/OverloadableAttrRequired); 3952dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 3962dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (!Method->isInvalidDecl() || !PrevDecl) 3976ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor Owner->addDecl(SemaRef.Context, Method); 3982dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return Method; 3992dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor} 4002dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 401615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 402e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // FIXME: Look for existing, explicit specializations. 40348dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor Sema::LocalInstantiationScope Scope(SemaRef); 40448dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor 4050ca20ac8cea99c43d89510f29cf3dc876f9c9111Douglas Gregor llvm::SmallVector<ParmVarDecl *, 4> Params; 406615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor QualType T = InstantiateFunctionType(D, Params); 407615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor if (T.isNull()) 408615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor return 0; 409615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 410615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // Build the instantiated method declaration. 411615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(Owner); 412615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor QualType ClassTy = SemaRef.Context.getTypeDeclType(Record); 413615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor DeclarationName Name 41449f25ecf7ff358039ce4c9254b867f32110e660eDouglas Gregor = SemaRef.Context.DeclarationNames.getCXXConstructorName( 41549f25ecf7ff358039ce4c9254b867f32110e660eDouglas Gregor SemaRef.Context.getCanonicalType(ClassTy)); 416615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor CXXConstructorDecl *Constructor 417615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor = CXXConstructorDecl::Create(SemaRef.Context, Record, D->getLocation(), 418615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor Name, T, D->isExplicit(), D->isInline(), 419615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor false); 4201eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor Constructor->setInstantiationOfMemberFunction(D); 421615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 422615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // Attach the parameters 423615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor for (unsigned P = 0; P < Params.size(); ++P) 424615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor Params[P]->setOwningFunction(Constructor); 425beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad Constructor->setParams(SemaRef.Context, Params.data(), Params.size()); 426615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 427615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor if (InitMethodInstantiation(Constructor, D)) 428615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor Constructor->setInvalidDecl(); 429615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 430615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor NamedDecl *PrevDecl 431615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor = SemaRef.LookupQualifiedName(Owner, Name, Sema::LookupOrdinaryName, true); 432615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 433615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // In C++, the previous declaration we find might be a tag type 434615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // (class or enum). In this case, the new declaration will hide the 435615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // tag type. Note that this does does not apply if we're declaring a 436615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // typedef (C++ [dcl.typedef]p4). 437615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor if (PrevDecl && PrevDecl->getIdentifierNamespace() == Decl::IDNS_Tag) 438615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor PrevDecl = 0; 439615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor bool Redeclaration = false; 440615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor bool OverloadableAttrRequired = false; 441eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner SemaRef.CheckFunctionDeclaration(Constructor, PrevDecl, Redeclaration, 442eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner /*FIXME:*/OverloadableAttrRequired); 443615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 44449f25ecf7ff358039ce4c9254b867f32110e660eDouglas Gregor Record->addedConstructor(SemaRef.Context, Constructor); 445eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner Owner->addDecl(SemaRef.Context, Constructor); 446615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor return Constructor; 447615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor} 448615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 44903b2b07aaef3a585aec13048a33356c7f635de72Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 450e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // FIXME: Look for existing, explicit specializations. 45148dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor Sema::LocalInstantiationScope Scope(SemaRef); 45248dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor 4530ca20ac8cea99c43d89510f29cf3dc876f9c9111Douglas Gregor llvm::SmallVector<ParmVarDecl *, 4> Params; 4545545e166a956a20d7a6b58408e251a1119025485Douglas Gregor QualType T = InstantiateFunctionType(D, Params); 45503b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor if (T.isNull()) 45603b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor return 0; 4575545e166a956a20d7a6b58408e251a1119025485Douglas Gregor assert(Params.size() == 0 && "Destructor with parameters?"); 4585545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 45903b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor // Build the instantiated destructor declaration. 46003b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(Owner); 46149f25ecf7ff358039ce4c9254b867f32110e660eDouglas Gregor QualType ClassTy = 46249f25ecf7ff358039ce4c9254b867f32110e660eDouglas Gregor SemaRef.Context.getCanonicalType(SemaRef.Context.getTypeDeclType(Record)); 46303b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor CXXDestructorDecl *Destructor 46403b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor = CXXDestructorDecl::Create(SemaRef.Context, Record, 46503b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor D->getLocation(), 46603b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor SemaRef.Context.DeclarationNames.getCXXDestructorName(ClassTy), 46703b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor T, D->isInline(), false); 4681eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor Destructor->setInstantiationOfMemberFunction(D); 4695545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (InitMethodInstantiation(Destructor, D)) 4705545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Destructor->setInvalidDecl(); 47103b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor 47203b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor bool Redeclaration = false; 47303b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor bool OverloadableAttrRequired = false; 47403b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor NamedDecl *PrevDecl = 0; 475eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner SemaRef.CheckFunctionDeclaration(Destructor, PrevDecl, Redeclaration, 476eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner /*FIXME:*/OverloadableAttrRequired); 4776ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor Owner->addDecl(SemaRef.Context, Destructor); 47803b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor return Destructor; 47903b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor} 48003b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor 481bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXConversionDecl(CXXConversionDecl *D) { 482e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // FIXME: Look for existing, explicit specializations. 48348dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor Sema::LocalInstantiationScope Scope(SemaRef); 48448dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor 4850ca20ac8cea99c43d89510f29cf3dc876f9c9111Douglas Gregor llvm::SmallVector<ParmVarDecl *, 4> Params; 486bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor QualType T = InstantiateFunctionType(D, Params); 487bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor if (T.isNull()) 488bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor return 0; 489bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor assert(Params.size() == 0 && "Destructor with parameters?"); 490bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor 491bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor // Build the instantiated conversion declaration. 492bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(Owner); 493bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor QualType ClassTy = SemaRef.Context.getTypeDeclType(Record); 494bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor QualType ConvTy 495bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor = SemaRef.Context.getCanonicalType(T->getAsFunctionType()->getResultType()); 496bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor CXXConversionDecl *Conversion 497bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor = CXXConversionDecl::Create(SemaRef.Context, Record, 498bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor D->getLocation(), 499bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor SemaRef.Context.DeclarationNames.getCXXConversionFunctionName(ConvTy), 500bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor T, D->isInline(), D->isExplicit()); 5011eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor Conversion->setInstantiationOfMemberFunction(D); 502bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor if (InitMethodInstantiation(Conversion, D)) 503bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor Conversion->setInvalidDecl(); 504bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor 505bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor bool Redeclaration = false; 506bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor bool OverloadableAttrRequired = false; 507bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor NamedDecl *PrevDecl = 0; 508eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner SemaRef.CheckFunctionDeclaration(Conversion, PrevDecl, Redeclaration, 509eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner /*FIXME:*/OverloadableAttrRequired); 5106ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor Owner->addDecl(SemaRef.Context, Conversion); 511bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor return Conversion; 512bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor} 513bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor 5146477b69cc93e0a0ff15036d60d604f3544da0f29Douglas GregorParmVarDecl *TemplateDeclInstantiator::VisitParmVarDecl(ParmVarDecl *D) { 5152dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor QualType OrigT = SemaRef.InstantiateType(D->getOriginalType(), TemplateArgs, 5167e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor D->getLocation(), D->getDeclName()); 5172dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (OrigT.isNull()) 5182dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return 0; 5192dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 5202dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor QualType T = SemaRef.adjustParameterType(OrigT); 5212dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 5222dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (D->getDefaultArg()) { 5232dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // FIXME: Leave a marker for "uninstantiated" default 5242dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // arguments. They only get instantiated on demand at the call 5252dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // site. 5262dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor unsigned DiagID = SemaRef.Diags.getCustomDiagID(Diagnostic::Warning, 5272dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor "sorry, dropping default argument during template instantiation"); 5282dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor SemaRef.Diag(D->getDefaultArg()->getSourceRange().getBegin(), DiagID) 5292dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor << D->getDefaultArg()->getSourceRange(); 5302dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor } 5312dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 5322dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // Allocate the parameter 5332dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor ParmVarDecl *Param = 0; 5342dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (T == OrigT) 5352dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor Param = ParmVarDecl::Create(SemaRef.Context, Owner, D->getLocation(), 5362dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor D->getIdentifier(), T, D->getStorageClass(), 5372dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 0); 5382dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor else 5392dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor Param = OriginalParmVarDecl::Create(SemaRef.Context, Owner, 5402dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor D->getLocation(), D->getIdentifier(), 5412dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor T, OrigT, D->getStorageClass(), 0); 5422dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 5432dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // Note: we don't try to instantiate function parameters until after 5442dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // we've instantiated the function's type. Therefore, we don't have 5452dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // to check for 'void' parameter types here. 54648dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param); 5472dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return Param; 5482dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor} 5492dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 5502dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas GregorDecl * 5512dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas GregorTemplateDeclInstantiator::VisitOriginalParmVarDecl(OriginalParmVarDecl *D) { 5522dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // Since parameter types can decay either before or after 5532dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // instantiation, we simply treat OriginalParmVarDecls as 5542dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // ParmVarDecls the same way, and create one or the other depending 5552dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // on what happens after template instantiation. 5562dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return VisitParmVarDecl(D); 5572dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor} 5582dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 5598dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *Sema::InstantiateDecl(Decl *D, DeclContext *Owner, 5607e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor const TemplateArgumentList &TemplateArgs) { 5617e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor TemplateDeclInstantiator Instantiator(*this, Owner, TemplateArgs); 5628dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Instantiator.Visit(D); 5638dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 5648dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 5655545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \brief Instantiates the type of the given function, including 5665545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// instantiating all of the function parameters. 5675545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// 5685545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \param D The function that we will be instantiated 5695545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// 5705545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \param Params the instantiated parameter declarations 5715545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5725545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \returns the instantiated function's type if successfull, a NULL 5735545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// type if there was an error. 5745545e166a956a20d7a6b58408e251a1119025485Douglas GregorQualType 5755545e166a956a20d7a6b58408e251a1119025485Douglas GregorTemplateDeclInstantiator::InstantiateFunctionType(FunctionDecl *D, 5765545e166a956a20d7a6b58408e251a1119025485Douglas Gregor llvm::SmallVectorImpl<ParmVarDecl *> &Params) { 5775545e166a956a20d7a6b58408e251a1119025485Douglas Gregor bool InvalidDecl = false; 5785545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5795545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // Instantiate the function parameters 5807e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor TemplateDeclInstantiator ParamInstantiator(SemaRef, 0, TemplateArgs); 5810ca20ac8cea99c43d89510f29cf3dc876f9c9111Douglas Gregor llvm::SmallVector<QualType, 4> ParamTys; 5825545e166a956a20d7a6b58408e251a1119025485Douglas Gregor for (FunctionDecl::param_iterator P = D->param_begin(), 5835545e166a956a20d7a6b58408e251a1119025485Douglas Gregor PEnd = D->param_end(); 5845545e166a956a20d7a6b58408e251a1119025485Douglas Gregor P != PEnd; ++P) { 5856477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor if (ParmVarDecl *PInst = ParamInstantiator.VisitParmVarDecl(*P)) { 5865545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (PInst->getType()->isVoidType()) { 5875545e166a956a20d7a6b58408e251a1119025485Douglas Gregor SemaRef.Diag(PInst->getLocation(), diag::err_param_with_void_type); 5885545e166a956a20d7a6b58408e251a1119025485Douglas Gregor PInst->setInvalidDecl(); 5895545e166a956a20d7a6b58408e251a1119025485Douglas Gregor } 5905545e166a956a20d7a6b58408e251a1119025485Douglas Gregor else if (SemaRef.RequireNonAbstractType(PInst->getLocation(), 5915545e166a956a20d7a6b58408e251a1119025485Douglas Gregor PInst->getType(), 5925545e166a956a20d7a6b58408e251a1119025485Douglas Gregor diag::err_abstract_type_in_decl, 5938211effbd3abc5948a5d6924c87e72323016a376Anders Carlsson Sema::AbstractParamType)) 5945545e166a956a20d7a6b58408e251a1119025485Douglas Gregor PInst->setInvalidDecl(); 5955545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5965545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Params.push_back(PInst); 5975545e166a956a20d7a6b58408e251a1119025485Douglas Gregor ParamTys.push_back(PInst->getType()); 5985545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5995545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (PInst->isInvalidDecl()) 6005545e166a956a20d7a6b58408e251a1119025485Douglas Gregor InvalidDecl = true; 6015545e166a956a20d7a6b58408e251a1119025485Douglas Gregor } else 6025545e166a956a20d7a6b58408e251a1119025485Douglas Gregor InvalidDecl = true; 6035545e166a956a20d7a6b58408e251a1119025485Douglas Gregor } 6045545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 6055545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // FIXME: Deallocate dead declarations. 6065545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (InvalidDecl) 6075545e166a956a20d7a6b58408e251a1119025485Douglas Gregor return QualType(); 6085545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 6095545e166a956a20d7a6b58408e251a1119025485Douglas Gregor const FunctionProtoType *Proto = D->getType()->getAsFunctionProtoType(); 6105545e166a956a20d7a6b58408e251a1119025485Douglas Gregor assert(Proto && "Missing prototype?"); 6115545e166a956a20d7a6b58408e251a1119025485Douglas Gregor QualType ResultType 6121eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor = SemaRef.InstantiateType(Proto->getResultType(), TemplateArgs, 6135545e166a956a20d7a6b58408e251a1119025485Douglas Gregor D->getLocation(), D->getDeclName()); 6145545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (ResultType.isNull()) 6155545e166a956a20d7a6b58408e251a1119025485Douglas Gregor return QualType(); 6165545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 617beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad return SemaRef.BuildFunctionType(ResultType, ParamTys.data(), ParamTys.size(), 6185545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Proto->isVariadic(), Proto->getTypeQuals(), 6195545e166a956a20d7a6b58408e251a1119025485Douglas Gregor D->getLocation(), D->getDeclName()); 6205545e166a956a20d7a6b58408e251a1119025485Douglas Gregor} 6215545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 622e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor/// \brief Initializes the common fields of an instantiation function 623e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor/// declaration (New) from the corresponding fields of its template (Tmpl). 624e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor/// 625e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor/// \returns true if there was an error 626e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregorbool 627e53060fa78ad7e98352049f72787bdb7543e2a48Douglas GregorTemplateDeclInstantiator::InitFunctionInstantiation(FunctionDecl *New, 628e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor FunctionDecl *Tmpl) { 629e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (Tmpl->isDeleted()) 630e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor New->setDeleted(); 631e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor return false; 632e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor} 633e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 6345545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \brief Initializes common fields of an instantiated method 6355545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// declaration (New) from the corresponding fields of its template 6365545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// (Tmpl). 6375545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// 6385545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \returns true if there was an error 6395545e166a956a20d7a6b58408e251a1119025485Douglas Gregorbool 6405545e166a956a20d7a6b58408e251a1119025485Douglas GregorTemplateDeclInstantiator::InitMethodInstantiation(CXXMethodDecl *New, 6415545e166a956a20d7a6b58408e251a1119025485Douglas Gregor CXXMethodDecl *Tmpl) { 642e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (InitFunctionInstantiation(New, Tmpl)) 643e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor return true; 644e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 6455545e166a956a20d7a6b58408e251a1119025485Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(Owner); 6465545e166a956a20d7a6b58408e251a1119025485Douglas Gregor New->setAccess(Tmpl->getAccess()); 64777b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson if (Tmpl->isVirtualAsWritten()) { 64877b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson New->setVirtualAsWritten(true); 6495545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Record->setAggregate(false); 6505545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Record->setPOD(false); 6515545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Record->setPolymorphic(true); 6525545e166a956a20d7a6b58408e251a1119025485Douglas Gregor } 6535545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (Tmpl->isPure()) { 6545545e166a956a20d7a6b58408e251a1119025485Douglas Gregor New->setPure(); 6555545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Record->setAbstract(true); 6565545e166a956a20d7a6b58408e251a1119025485Douglas Gregor } 6575545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 6585545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // FIXME: attributes 6595545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // FIXME: New needs a pointer to Tmpl 6605545e166a956a20d7a6b58408e251a1119025485Douglas Gregor return false; 6615545e166a956a20d7a6b58408e251a1119025485Douglas Gregor} 662a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor 663a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// \brief Instantiate the definition of the given function from its 664a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// template. 665a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// 666a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// \param Function the already-instantiated declaration of a 667a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// function. 668f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregorvoid Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, 669f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor FunctionDecl *Function) { 67054dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor if (Function->isInvalidDecl()) 67154dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor return; 67254dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor 673d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor assert(!Function->getBody(Context) && "Already instantiated!"); 674d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor 6751eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor // Find the function body that we'll be substituting. 6761637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor const FunctionDecl *PatternDecl = 0; 6771637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor if (FunctionTemplateDecl *Primary = Function->getPrimaryTemplate()) 6781637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor PatternDecl = Primary->getTemplatedDecl(); 6791637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor else 6801637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor PatternDecl = Function->getInstantiatedFromMemberFunction(); 6811eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor Stmt *Pattern = 0; 6821eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor if (PatternDecl) 6831eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor Pattern = PatternDecl->getBody(Context, PatternDecl); 6841eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor 6851eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor if (!Pattern) 6861eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor return; 6871eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor 688f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor InstantiatingTemplate Inst(*this, PointOfInstantiation, Function); 689f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor if (Inst) 690f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor return; 691b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor 692e2c31ff0bc622e6fd7d47d7e08b53840f3be6c89Douglas Gregor ActOnStartOfFunctionDef(0, DeclPtrTy::make(Function)); 693e2c31ff0bc622e6fd7d47d7e08b53840f3be6c89Douglas Gregor 69454dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor // Introduce a new scope where local variable instantiations will be 69554dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor // recorded. 69654dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor LocalInstantiationScope Scope(*this); 69754dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor 69854dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor // Introduce the instantiated function parameters into the local 69954dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor // instantiation scope. 70054dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor for (unsigned I = 0, N = PatternDecl->getNumParams(); I != N; ++I) 70154dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor Scope.InstantiatedLocal(PatternDecl->getParamDecl(I), 70254dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor Function->getParamDecl(I)); 70354dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor 704b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor // Enter the scope of this instantiation. We don't use 705b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor // PushDeclContext because we don't have a scope. 706b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor DeclContext *PreviousContext = CurContext; 707b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor CurContext = Function; 708b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor 70954dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor // Instantiate the function body. 71054dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor OwningStmtResult Body 71154dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor = InstantiateStmt(Pattern, getTemplateInstantiationArgs(Function)); 712e2c31ff0bc622e6fd7d47d7e08b53840f3be6c89Douglas Gregor 713e2c31ff0bc622e6fd7d47d7e08b53840f3be6c89Douglas Gregor ActOnFinishFunctionBody(DeclPtrTy::make(Function), move(Body), 714e2c31ff0bc622e6fd7d47d7e08b53840f3be6c89Douglas Gregor /*IsInstantiation=*/true); 715b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor 716b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor CurContext = PreviousContext; 717aba43bb13b3aa3e81990989375fba3a902bfe1c2Douglas Gregor 718aba43bb13b3aa3e81990989375fba3a902bfe1c2Douglas Gregor DeclGroupRef DG(Function); 719aba43bb13b3aa3e81990989375fba3a902bfe1c2Douglas Gregor Consumer.HandleTopLevelDecl(DG); 720a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor} 721a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor 722a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// \brief Instantiate the definition of the given variable from its 723a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// template. 724a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// 725a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// \param Var the already-instantiated declaration of a variable. 726a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregorvoid Sema::InstantiateVariableDefinition(VarDecl *Var) { 727a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor // FIXME: Implement this! 728a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor} 729815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 730815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregorstatic bool isInstantiationOf(ASTContext &Ctx, NamedDecl *D, Decl *Other) { 731815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (D->getKind() != Other->getKind()) 732815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return false; 733815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 734815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(Other)) 735815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return Ctx.getCanonicalDecl(Record->getInstantiatedFromMemberClass()) 736815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor == Ctx.getCanonicalDecl(D); 737815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 738815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Other)) 739815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return Ctx.getCanonicalDecl(Function->getInstantiatedFromMemberFunction()) 740815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor == Ctx.getCanonicalDecl(D); 741815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 7428dbc3c64965f99e48830885835b7d2fc26ec3cf5Douglas Gregor if (EnumDecl *Enum = dyn_cast<EnumDecl>(Other)) 7438dbc3c64965f99e48830885835b7d2fc26ec3cf5Douglas Gregor return Ctx.getCanonicalDecl(Enum->getInstantiatedFromMemberEnum()) 7448dbc3c64965f99e48830885835b7d2fc26ec3cf5Douglas Gregor == Ctx.getCanonicalDecl(D); 745815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 746815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // FIXME: How can we find instantiations of anonymous unions? 747815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 748815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return D->getDeclName() && isa<NamedDecl>(Other) && 749815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor D->getDeclName() == cast<NamedDecl>(Other)->getDeclName(); 750815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor} 751815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 752815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregortemplate<typename ForwardIterator> 753815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregorstatic NamedDecl *findInstantiationOf(ASTContext &Ctx, 754815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor NamedDecl *D, 755815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor ForwardIterator first, 756815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor ForwardIterator last) { 757815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor for (; first != last; ++first) 758815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (isInstantiationOf(Ctx, D, *first)) 759815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return cast<NamedDecl>(*first); 760815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 761815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return 0; 762815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor} 763815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 764ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// \brief Find the instantiation of the given declaration within the 765ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// current instantiation. 766815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 767815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// This routine is intended to be used when \p D is a declaration 768815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// referenced from within a template, that needs to mapped into the 769815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// corresponding declaration within an instantiation. For example, 770815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// given: 771815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 772815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// \code 773815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// template<typename T> 774815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// struct X { 775815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// enum Kind { 776815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// KnownValue = sizeof(T) 777815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// }; 778815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 779815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// bool getKind() const { return KnownValue; } 780815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// }; 781815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 782815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// template struct X<int>; 783815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// \endcode 784815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 785815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// In the instantiation of X<int>::getKind(), we need to map the 786815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// EnumConstantDecl for KnownValue (which refers to 787815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// X<T>::<Kind>::KnownValue) to its instantiation 788ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// (X<int>::<Kind>::KnownValue). InstantiateCurrentDeclRef() performs 789ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// this mapping from within the instantiation of X<int>. 790ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas GregorNamedDecl * Sema::InstantiateCurrentDeclRef(NamedDecl *D) { 791815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor DeclContext *ParentDC = D->getDeclContext(); 7922bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor if (isa<ParmVarDecl>(D) || ParentDC->isFunctionOrMethod()) { 7932bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor // D is a local of some kind. Look into the map of local 7942bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor // declarations to their instantiations. 7952bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor return cast<NamedDecl>(CurrentInstantiationScope->getInstantiationOf(D)); 7962bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor } 797815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 7982bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor if (NamedDecl *ParentDecl = dyn_cast<NamedDecl>(ParentDC)) { 799ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor ParentDecl = InstantiateCurrentDeclRef(ParentDecl); 800815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (!ParentDecl) 801815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return 0; 802815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 803815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor ParentDC = cast<DeclContext>(ParentDecl); 804815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } 805815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 806815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (ParentDC != D->getDeclContext()) { 807815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // We performed some kind of instantiation in the parent context, 808815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // so now we need to look into the instantiated parent context to 809815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // find the instantiation of the declaration D. 810815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor NamedDecl *Result = 0; 811815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (D->getDeclName()) { 812815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor DeclContext::lookup_result Found 813815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor = ParentDC->lookup(Context, D->getDeclName()); 814815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor Result = findInstantiationOf(Context, D, Found.first, Found.second); 815815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } else { 816815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // Since we don't have a name for the entity we're looking for, 817815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // our only option is to walk through all of the declarations to 818815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // find that name. This will occur in a few cases: 819815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // 820815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // - anonymous struct/union within a template 821815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // - unnamed class/struct/union/enum within a template 822815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // 823815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // FIXME: Find a better way to find these instantiations! 824815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor Result = findInstantiationOf(Context, D, 825815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor ParentDC->decls_begin(Context), 826815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor ParentDC->decls_end(Context)); 827815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } 828815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor assert(Result && "Unable to find instantiation of declaration!"); 829815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor D = Result; 830815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } 831815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 832815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(D)) 833ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor if (ClassTemplateDecl *ClassTemplate 834ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor = Record->getDescribedClassTemplate()) { 835ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor // When the declaration D was parsed, it referred to the current 836ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor // instantiation. Therefore, look through the current context, 837ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor // which contains actual instantiations, to find the 838ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor // instantiation of the "current instantiation" that D refers 839ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor // to. Alternatively, we could just instantiate the 840ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor // injected-class-name with the current template arguments, but 841ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor // such an instantiation is far more expensive. 842ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor for (DeclContext *DC = CurContext; !DC->isFileContext(); 843ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor DC = DC->getParent()) { 844ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor if (ClassTemplateSpecializationDecl *Spec 845ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor = dyn_cast<ClassTemplateSpecializationDecl>(DC)) 846ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor if (Context.getCanonicalDecl(Spec->getSpecializedTemplate()) 847ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor == Context.getCanonicalDecl(ClassTemplate)) 848ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor return Spec; 849ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor } 850ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor 851ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor assert(false && 852ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor "Unable to find declaration for the current instantiation"); 853815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } 854815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 855815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return D; 856815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor} 857d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor 858d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor/// \brief Performs template instantiation for all implicit template 859d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor/// instantiations we have seen until this point. 860d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregorvoid Sema::PerformPendingImplicitInstantiations() { 861d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor while (!PendingImplicitInstantiations.empty()) { 862d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor PendingImplicitInstantiation Inst = PendingImplicitInstantiations.front(); 863d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor PendingImplicitInstantiations.pop(); 864d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor 865d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Inst.first)) 866d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor if (!Function->getBody(Context)) 867d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor InstantiateFunctionDefinition(/*FIXME:*/Inst.second, Function); 868d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor 869d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor // FIXME: instantiation static member variables 870d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor } 871d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor} 872