SemaTemplateInstantiateDecl.cpp revision e53060fa78ad7e98352049f72787bdb7543e2a48
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) { 297e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // FIXME: Look for existing specializations (explicit or otherwise). 298e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 299e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor Sema::LocalInstantiationScope Scope(SemaRef); 300e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 301e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor llvm::SmallVector<ParmVarDecl *, 4> Params; 302e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor QualType T = InstantiateFunctionType(D, Params); 303e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (T.isNull()) 3042dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return 0; 305e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 306e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // Build the instantiated method declaration. 307e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor FunctionDecl *Function 308e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor = FunctionDecl::Create(SemaRef.Context, Owner, D->getLocation(), 309e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor D->getDeclName(), T, D->getStorageClass(), 310e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor D->isInline(), D->hasWrittenPrototype(), 311e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor D->getTypeSpecStartLoc()); 312e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 313e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // FIXME: friend functions 314e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 315e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // Attach the parameters 316e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor for (unsigned P = 0; P < Params.size(); ++P) 317e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor Params[P]->setOwningFunction(Function); 318e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor Function->setParams(SemaRef.Context, Params.data(), Params.size()); 319e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 320e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (InitFunctionInstantiation(Function, D)) 321e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor Function->setInvalidDecl(); 322e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 323e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor bool Redeclaration = false; 324e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor bool OverloadableAttrRequired = false; 325e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor NamedDecl *PrevDecl = 0; 326e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor SemaRef.CheckFunctionDeclaration(Function, PrevDecl, Redeclaration, 327e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor /*FIXME:*/OverloadableAttrRequired); 328e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 329e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 330e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // FIXME: link this to the function template from which it was instantiated. 331e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 332e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor return Function; 333e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor} 3342dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 335e53060fa78ad7e98352049f72787bdb7543e2a48Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D) { 336e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // FIXME: Look for existing, explicit specializations. 33748dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor Sema::LocalInstantiationScope Scope(SemaRef); 33848dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor 3390ca20ac8cea99c43d89510f29cf3dc876f9c9111Douglas Gregor llvm::SmallVector<ParmVarDecl *, 4> Params; 3405545e166a956a20d7a6b58408e251a1119025485Douglas Gregor QualType T = InstantiateFunctionType(D, Params); 3412dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (T.isNull()) 3422dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return 0; 3432dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 3442dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // Build the instantiated method declaration. 3452dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(Owner); 3462dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor CXXMethodDecl *Method 3472dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor = CXXMethodDecl::Create(SemaRef.Context, Record, D->getLocation(), 3482dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor D->getDeclName(), T, D->isStatic(), 3492dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor D->isInline()); 3501eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor Method->setInstantiationOfMemberFunction(D); 3512dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 3525545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // Attach the parameters 3535545e166a956a20d7a6b58408e251a1119025485Douglas Gregor for (unsigned P = 0; P < Params.size(); ++P) 3545545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Params[P]->setOwningFunction(Method); 355beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad Method->setParams(SemaRef.Context, Params.data(), Params.size()); 3565545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 3575545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (InitMethodInstantiation(Method, D)) 3585545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Method->setInvalidDecl(); 3592dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 3602dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor NamedDecl *PrevDecl 3612dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor = SemaRef.LookupQualifiedName(Owner, Method->getDeclName(), 3622dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor Sema::LookupOrdinaryName, true); 3632dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // In C++, the previous declaration we find might be a tag type 3642dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // (class or enum). In this case, the new declaration will hide the 3652dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // tag type. Note that this does does not apply if we're declaring a 3662dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // typedef (C++ [dcl.typedef]p4). 3672dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (PrevDecl && PrevDecl->getIdentifierNamespace() == Decl::IDNS_Tag) 3682dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor PrevDecl = 0; 3692dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor bool Redeclaration = false; 3702dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor bool OverloadableAttrRequired = false; 371eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner SemaRef.CheckFunctionDeclaration(Method, PrevDecl, Redeclaration, 372eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner /*FIXME:*/OverloadableAttrRequired); 3732dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 3742dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (!Method->isInvalidDecl() || !PrevDecl) 3756ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor Owner->addDecl(SemaRef.Context, Method); 3762dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return Method; 3772dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor} 3782dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 379615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 380e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // FIXME: Look for existing, explicit specializations. 38148dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor Sema::LocalInstantiationScope Scope(SemaRef); 38248dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor 3830ca20ac8cea99c43d89510f29cf3dc876f9c9111Douglas Gregor llvm::SmallVector<ParmVarDecl *, 4> Params; 384615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor QualType T = InstantiateFunctionType(D, Params); 385615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor if (T.isNull()) 386615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor return 0; 387615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 388615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // Build the instantiated method declaration. 389615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(Owner); 390615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor QualType ClassTy = SemaRef.Context.getTypeDeclType(Record); 391615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor DeclarationName Name 39249f25ecf7ff358039ce4c9254b867f32110e660eDouglas Gregor = SemaRef.Context.DeclarationNames.getCXXConstructorName( 39349f25ecf7ff358039ce4c9254b867f32110e660eDouglas Gregor SemaRef.Context.getCanonicalType(ClassTy)); 394615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor CXXConstructorDecl *Constructor 395615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor = CXXConstructorDecl::Create(SemaRef.Context, Record, D->getLocation(), 396615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor Name, T, D->isExplicit(), D->isInline(), 397615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor false); 3981eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor Constructor->setInstantiationOfMemberFunction(D); 399615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 400615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // Attach the parameters 401615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor for (unsigned P = 0; P < Params.size(); ++P) 402615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor Params[P]->setOwningFunction(Constructor); 403beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad Constructor->setParams(SemaRef.Context, Params.data(), Params.size()); 404615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 405615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor if (InitMethodInstantiation(Constructor, D)) 406615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor Constructor->setInvalidDecl(); 407615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 408615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor NamedDecl *PrevDecl 409615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor = SemaRef.LookupQualifiedName(Owner, Name, Sema::LookupOrdinaryName, true); 410615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 411615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // In C++, the previous declaration we find might be a tag type 412615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // (class or enum). In this case, the new declaration will hide the 413615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // tag type. Note that this does does not apply if we're declaring a 414615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // typedef (C++ [dcl.typedef]p4). 415615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor if (PrevDecl && PrevDecl->getIdentifierNamespace() == Decl::IDNS_Tag) 416615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor PrevDecl = 0; 417615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor bool Redeclaration = false; 418615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor bool OverloadableAttrRequired = false; 419eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner SemaRef.CheckFunctionDeclaration(Constructor, PrevDecl, Redeclaration, 420eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner /*FIXME:*/OverloadableAttrRequired); 421615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 42249f25ecf7ff358039ce4c9254b867f32110e660eDouglas Gregor Record->addedConstructor(SemaRef.Context, Constructor); 423eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner Owner->addDecl(SemaRef.Context, Constructor); 424615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor return Constructor; 425615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor} 426615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 42703b2b07aaef3a585aec13048a33356c7f635de72Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 428e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // FIXME: Look for existing, explicit specializations. 42948dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor Sema::LocalInstantiationScope Scope(SemaRef); 43048dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor 4310ca20ac8cea99c43d89510f29cf3dc876f9c9111Douglas Gregor llvm::SmallVector<ParmVarDecl *, 4> Params; 4325545e166a956a20d7a6b58408e251a1119025485Douglas Gregor QualType T = InstantiateFunctionType(D, Params); 43303b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor if (T.isNull()) 43403b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor return 0; 4355545e166a956a20d7a6b58408e251a1119025485Douglas Gregor assert(Params.size() == 0 && "Destructor with parameters?"); 4365545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 43703b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor // Build the instantiated destructor declaration. 43803b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(Owner); 43949f25ecf7ff358039ce4c9254b867f32110e660eDouglas Gregor QualType ClassTy = 44049f25ecf7ff358039ce4c9254b867f32110e660eDouglas Gregor SemaRef.Context.getCanonicalType(SemaRef.Context.getTypeDeclType(Record)); 44103b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor CXXDestructorDecl *Destructor 44203b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor = CXXDestructorDecl::Create(SemaRef.Context, Record, 44303b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor D->getLocation(), 44403b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor SemaRef.Context.DeclarationNames.getCXXDestructorName(ClassTy), 44503b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor T, D->isInline(), false); 4461eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor Destructor->setInstantiationOfMemberFunction(D); 4475545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (InitMethodInstantiation(Destructor, D)) 4485545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Destructor->setInvalidDecl(); 44903b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor 45003b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor bool Redeclaration = false; 45103b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor bool OverloadableAttrRequired = false; 45203b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor NamedDecl *PrevDecl = 0; 453eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner SemaRef.CheckFunctionDeclaration(Destructor, PrevDecl, Redeclaration, 454eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner /*FIXME:*/OverloadableAttrRequired); 4556ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor Owner->addDecl(SemaRef.Context, Destructor); 45603b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor return Destructor; 45703b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor} 45803b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor 459bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXConversionDecl(CXXConversionDecl *D) { 460e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // FIXME: Look for existing, explicit specializations. 46148dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor Sema::LocalInstantiationScope Scope(SemaRef); 46248dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor 4630ca20ac8cea99c43d89510f29cf3dc876f9c9111Douglas Gregor llvm::SmallVector<ParmVarDecl *, 4> Params; 464bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor QualType T = InstantiateFunctionType(D, Params); 465bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor if (T.isNull()) 466bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor return 0; 467bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor assert(Params.size() == 0 && "Destructor with parameters?"); 468bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor 469bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor // Build the instantiated conversion declaration. 470bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(Owner); 471bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor QualType ClassTy = SemaRef.Context.getTypeDeclType(Record); 472bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor QualType ConvTy 473bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor = SemaRef.Context.getCanonicalType(T->getAsFunctionType()->getResultType()); 474bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor CXXConversionDecl *Conversion 475bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor = CXXConversionDecl::Create(SemaRef.Context, Record, 476bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor D->getLocation(), 477bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor SemaRef.Context.DeclarationNames.getCXXConversionFunctionName(ConvTy), 478bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor T, D->isInline(), D->isExplicit()); 4791eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor Conversion->setInstantiationOfMemberFunction(D); 480bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor if (InitMethodInstantiation(Conversion, D)) 481bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor Conversion->setInvalidDecl(); 482bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor 483bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor bool Redeclaration = false; 484bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor bool OverloadableAttrRequired = false; 485bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor NamedDecl *PrevDecl = 0; 486eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner SemaRef.CheckFunctionDeclaration(Conversion, PrevDecl, Redeclaration, 487eaaebc7cf10dc1a2016183a262ad3256bc468759Chris Lattner /*FIXME:*/OverloadableAttrRequired); 4886ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor Owner->addDecl(SemaRef.Context, Conversion); 489bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor return Conversion; 490bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor} 491bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor 4926477b69cc93e0a0ff15036d60d604f3544da0f29Douglas GregorParmVarDecl *TemplateDeclInstantiator::VisitParmVarDecl(ParmVarDecl *D) { 4932dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor QualType OrigT = SemaRef.InstantiateType(D->getOriginalType(), TemplateArgs, 4947e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor D->getLocation(), D->getDeclName()); 4952dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (OrigT.isNull()) 4962dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return 0; 4972dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 4982dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor QualType T = SemaRef.adjustParameterType(OrigT); 4992dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 5002dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (D->getDefaultArg()) { 5012dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // FIXME: Leave a marker for "uninstantiated" default 5022dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // arguments. They only get instantiated on demand at the call 5032dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // site. 5042dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor unsigned DiagID = SemaRef.Diags.getCustomDiagID(Diagnostic::Warning, 5052dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor "sorry, dropping default argument during template instantiation"); 5062dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor SemaRef.Diag(D->getDefaultArg()->getSourceRange().getBegin(), DiagID) 5072dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor << D->getDefaultArg()->getSourceRange(); 5082dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor } 5092dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 5102dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // Allocate the parameter 5112dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor ParmVarDecl *Param = 0; 5122dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (T == OrigT) 5132dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor Param = ParmVarDecl::Create(SemaRef.Context, Owner, D->getLocation(), 5142dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor D->getIdentifier(), T, D->getStorageClass(), 5152dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 0); 5162dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor else 5172dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor Param = OriginalParmVarDecl::Create(SemaRef.Context, Owner, 5182dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor D->getLocation(), D->getIdentifier(), 5192dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor T, OrigT, D->getStorageClass(), 0); 5202dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 5212dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // Note: we don't try to instantiate function parameters until after 5222dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // we've instantiated the function's type. Therefore, we don't have 5232dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // to check for 'void' parameter types here. 52448dd19b19ddb9e105f8cf0bf6f0732ca4e6a385bDouglas Gregor SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param); 5252dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return Param; 5262dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor} 5272dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 5282dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas GregorDecl * 5292dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas GregorTemplateDeclInstantiator::VisitOriginalParmVarDecl(OriginalParmVarDecl *D) { 5302dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // Since parameter types can decay either before or after 5312dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // instantiation, we simply treat OriginalParmVarDecls as 5322dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // ParmVarDecls the same way, and create one or the other depending 5332dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // on what happens after template instantiation. 5342dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return VisitParmVarDecl(D); 5352dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor} 5362dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 5378dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *Sema::InstantiateDecl(Decl *D, DeclContext *Owner, 5387e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor const TemplateArgumentList &TemplateArgs) { 5397e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor TemplateDeclInstantiator Instantiator(*this, Owner, TemplateArgs); 5408dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Instantiator.Visit(D); 5418dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 5428dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 5435545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \brief Instantiates the type of the given function, including 5445545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// instantiating all of the function parameters. 5455545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// 5465545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \param D The function that we will be instantiated 5475545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// 5485545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \param Params the instantiated parameter declarations 5495545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5505545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \returns the instantiated function's type if successfull, a NULL 5515545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// type if there was an error. 5525545e166a956a20d7a6b58408e251a1119025485Douglas GregorQualType 5535545e166a956a20d7a6b58408e251a1119025485Douglas GregorTemplateDeclInstantiator::InstantiateFunctionType(FunctionDecl *D, 5545545e166a956a20d7a6b58408e251a1119025485Douglas Gregor llvm::SmallVectorImpl<ParmVarDecl *> &Params) { 5555545e166a956a20d7a6b58408e251a1119025485Douglas Gregor bool InvalidDecl = false; 5565545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5575545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // Instantiate the function parameters 5587e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor TemplateDeclInstantiator ParamInstantiator(SemaRef, 0, TemplateArgs); 5590ca20ac8cea99c43d89510f29cf3dc876f9c9111Douglas Gregor llvm::SmallVector<QualType, 4> ParamTys; 5605545e166a956a20d7a6b58408e251a1119025485Douglas Gregor for (FunctionDecl::param_iterator P = D->param_begin(), 5615545e166a956a20d7a6b58408e251a1119025485Douglas Gregor PEnd = D->param_end(); 5625545e166a956a20d7a6b58408e251a1119025485Douglas Gregor P != PEnd; ++P) { 5636477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor if (ParmVarDecl *PInst = ParamInstantiator.VisitParmVarDecl(*P)) { 5645545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (PInst->getType()->isVoidType()) { 5655545e166a956a20d7a6b58408e251a1119025485Douglas Gregor SemaRef.Diag(PInst->getLocation(), diag::err_param_with_void_type); 5665545e166a956a20d7a6b58408e251a1119025485Douglas Gregor PInst->setInvalidDecl(); 5675545e166a956a20d7a6b58408e251a1119025485Douglas Gregor } 5685545e166a956a20d7a6b58408e251a1119025485Douglas Gregor else if (SemaRef.RequireNonAbstractType(PInst->getLocation(), 5695545e166a956a20d7a6b58408e251a1119025485Douglas Gregor PInst->getType(), 5705545e166a956a20d7a6b58408e251a1119025485Douglas Gregor diag::err_abstract_type_in_decl, 5718211effbd3abc5948a5d6924c87e72323016a376Anders Carlsson Sema::AbstractParamType)) 5725545e166a956a20d7a6b58408e251a1119025485Douglas Gregor PInst->setInvalidDecl(); 5735545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5745545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Params.push_back(PInst); 5755545e166a956a20d7a6b58408e251a1119025485Douglas Gregor ParamTys.push_back(PInst->getType()); 5765545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5775545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (PInst->isInvalidDecl()) 5785545e166a956a20d7a6b58408e251a1119025485Douglas Gregor InvalidDecl = true; 5795545e166a956a20d7a6b58408e251a1119025485Douglas Gregor } else 5805545e166a956a20d7a6b58408e251a1119025485Douglas Gregor InvalidDecl = true; 5815545e166a956a20d7a6b58408e251a1119025485Douglas Gregor } 5825545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5835545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // FIXME: Deallocate dead declarations. 5845545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (InvalidDecl) 5855545e166a956a20d7a6b58408e251a1119025485Douglas Gregor return QualType(); 5865545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5875545e166a956a20d7a6b58408e251a1119025485Douglas Gregor const FunctionProtoType *Proto = D->getType()->getAsFunctionProtoType(); 5885545e166a956a20d7a6b58408e251a1119025485Douglas Gregor assert(Proto && "Missing prototype?"); 5895545e166a956a20d7a6b58408e251a1119025485Douglas Gregor QualType ResultType 5901eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor = SemaRef.InstantiateType(Proto->getResultType(), TemplateArgs, 5915545e166a956a20d7a6b58408e251a1119025485Douglas Gregor D->getLocation(), D->getDeclName()); 5925545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (ResultType.isNull()) 5935545e166a956a20d7a6b58408e251a1119025485Douglas Gregor return QualType(); 5945545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 595beaaccd8e2a8748f77b66e2b330fb9136937e14cJay Foad return SemaRef.BuildFunctionType(ResultType, ParamTys.data(), ParamTys.size(), 5965545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Proto->isVariadic(), Proto->getTypeQuals(), 5975545e166a956a20d7a6b58408e251a1119025485Douglas Gregor D->getLocation(), D->getDeclName()); 5985545e166a956a20d7a6b58408e251a1119025485Douglas Gregor} 5995545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 600e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor/// \brief Initializes the common fields of an instantiation function 601e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor/// declaration (New) from the corresponding fields of its template (Tmpl). 602e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor/// 603e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor/// \returns true if there was an error 604e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregorbool 605e53060fa78ad7e98352049f72787bdb7543e2a48Douglas GregorTemplateDeclInstantiator::InitFunctionInstantiation(FunctionDecl *New, 606e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor FunctionDecl *Tmpl) { 607e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (Tmpl->isDeleted()) 608e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor New->setDeleted(); 609e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor return false; 610e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor} 611e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 6125545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \brief Initializes common fields of an instantiated method 6135545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// declaration (New) from the corresponding fields of its template 6145545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// (Tmpl). 6155545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// 6165545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \returns true if there was an error 6175545e166a956a20d7a6b58408e251a1119025485Douglas Gregorbool 6185545e166a956a20d7a6b58408e251a1119025485Douglas GregorTemplateDeclInstantiator::InitMethodInstantiation(CXXMethodDecl *New, 6195545e166a956a20d7a6b58408e251a1119025485Douglas Gregor CXXMethodDecl *Tmpl) { 620e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (InitFunctionInstantiation(New, Tmpl)) 621e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor return true; 622e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 6235545e166a956a20d7a6b58408e251a1119025485Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(Owner); 6245545e166a956a20d7a6b58408e251a1119025485Douglas Gregor New->setAccess(Tmpl->getAccess()); 62577b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson if (Tmpl->isVirtualAsWritten()) { 62677b7f1d4fb782c9152f91b76f9f8b1d1af21bd35Anders Carlsson New->setVirtualAsWritten(true); 6275545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Record->setAggregate(false); 6285545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Record->setPOD(false); 6295545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Record->setPolymorphic(true); 6305545e166a956a20d7a6b58408e251a1119025485Douglas Gregor } 6315545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (Tmpl->isPure()) { 6325545e166a956a20d7a6b58408e251a1119025485Douglas Gregor New->setPure(); 6335545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Record->setAbstract(true); 6345545e166a956a20d7a6b58408e251a1119025485Douglas Gregor } 6355545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 6365545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // FIXME: attributes 6375545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // FIXME: New needs a pointer to Tmpl 6385545e166a956a20d7a6b58408e251a1119025485Douglas Gregor return false; 6395545e166a956a20d7a6b58408e251a1119025485Douglas Gregor} 640a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor 641a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// \brief Instantiate the definition of the given function from its 642a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// template. 643a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// 644a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// \param Function the already-instantiated declaration of a 645a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// function. 646f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregorvoid Sema::InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, 647f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor FunctionDecl *Function) { 6481eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor // FIXME: make this work for function template specializations, too. 6491eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor 65054dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor if (Function->isInvalidDecl()) 65154dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor return; 65254dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor 653d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor assert(!Function->getBody(Context) && "Already instantiated!"); 654d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor 6551eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor // Find the function body that we'll be substituting. 6561eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor const FunctionDecl *PatternDecl 6571eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor = Function->getInstantiatedFromMemberFunction(); 6581eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor Stmt *Pattern = 0; 6591eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor if (PatternDecl) 6601eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor Pattern = PatternDecl->getBody(Context, PatternDecl); 6611eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor 6621eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor if (!Pattern) 6631eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor return; 6641eee0e753fb390b04848846e837714ec774b7bfdDouglas Gregor 665f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor InstantiatingTemplate Inst(*this, PointOfInstantiation, Function); 666f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor if (Inst) 667f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor return; 668b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor 669e2c31ff0bc622e6fd7d47d7e08b53840f3be6c89Douglas Gregor ActOnStartOfFunctionDef(0, DeclPtrTy::make(Function)); 670e2c31ff0bc622e6fd7d47d7e08b53840f3be6c89Douglas Gregor 67154dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor // Introduce a new scope where local variable instantiations will be 67254dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor // recorded. 67354dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor LocalInstantiationScope Scope(*this); 67454dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor 67554dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor // Introduce the instantiated function parameters into the local 67654dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor // instantiation scope. 67754dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor for (unsigned I = 0, N = PatternDecl->getNumParams(); I != N; ++I) 67854dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor Scope.InstantiatedLocal(PatternDecl->getParamDecl(I), 67954dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor Function->getParamDecl(I)); 68054dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor 681b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor // Enter the scope of this instantiation. We don't use 682b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor // PushDeclContext because we don't have a scope. 683b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor DeclContext *PreviousContext = CurContext; 684b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor CurContext = Function; 685b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor 68654dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor // Instantiate the function body. 68754dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor OwningStmtResult Body 68854dabfca850ca9e60e9ffb60003529f868d4d127Douglas Gregor = InstantiateStmt(Pattern, getTemplateInstantiationArgs(Function)); 689e2c31ff0bc622e6fd7d47d7e08b53840f3be6c89Douglas Gregor 690e2c31ff0bc622e6fd7d47d7e08b53840f3be6c89Douglas Gregor ActOnFinishFunctionBody(DeclPtrTy::make(Function), move(Body), 691e2c31ff0bc622e6fd7d47d7e08b53840f3be6c89Douglas Gregor /*IsInstantiation=*/true); 692b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor 693b9f1b8d877541e76390cd3807c2dcff2f950360aDouglas Gregor CurContext = PreviousContext; 694aba43bb13b3aa3e81990989375fba3a902bfe1c2Douglas Gregor 695aba43bb13b3aa3e81990989375fba3a902bfe1c2Douglas Gregor DeclGroupRef DG(Function); 696aba43bb13b3aa3e81990989375fba3a902bfe1c2Douglas Gregor Consumer.HandleTopLevelDecl(DG); 697a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor} 698a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor 699a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// \brief Instantiate the definition of the given variable from its 700a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// template. 701a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// 702a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor/// \param Var the already-instantiated declaration of a variable. 703a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregorvoid Sema::InstantiateVariableDefinition(VarDecl *Var) { 704a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor // FIXME: Implement this! 705a58861f6490780baec50689e06ca65f7438b85dcDouglas Gregor} 706815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 707815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregorstatic bool isInstantiationOf(ASTContext &Ctx, NamedDecl *D, Decl *Other) { 708815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (D->getKind() != Other->getKind()) 709815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return false; 710815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 711815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(Other)) 712815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return Ctx.getCanonicalDecl(Record->getInstantiatedFromMemberClass()) 713815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor == Ctx.getCanonicalDecl(D); 714815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 715815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Other)) 716815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return Ctx.getCanonicalDecl(Function->getInstantiatedFromMemberFunction()) 717815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor == Ctx.getCanonicalDecl(D); 718815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 7198dbc3c64965f99e48830885835b7d2fc26ec3cf5Douglas Gregor if (EnumDecl *Enum = dyn_cast<EnumDecl>(Other)) 7208dbc3c64965f99e48830885835b7d2fc26ec3cf5Douglas Gregor return Ctx.getCanonicalDecl(Enum->getInstantiatedFromMemberEnum()) 7218dbc3c64965f99e48830885835b7d2fc26ec3cf5Douglas Gregor == Ctx.getCanonicalDecl(D); 722815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 723815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // FIXME: How can we find instantiations of anonymous unions? 724815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 725815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return D->getDeclName() && isa<NamedDecl>(Other) && 726815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor D->getDeclName() == cast<NamedDecl>(Other)->getDeclName(); 727815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor} 728815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 729815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregortemplate<typename ForwardIterator> 730815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregorstatic NamedDecl *findInstantiationOf(ASTContext &Ctx, 731815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor NamedDecl *D, 732815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor ForwardIterator first, 733815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor ForwardIterator last) { 734815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor for (; first != last; ++first) 735815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (isInstantiationOf(Ctx, D, *first)) 736815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return cast<NamedDecl>(*first); 737815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 738815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return 0; 739815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor} 740815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 741ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// \brief Find the instantiation of the given declaration within the 742ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// current instantiation. 743815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 744815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// This routine is intended to be used when \p D is a declaration 745815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// referenced from within a template, that needs to mapped into the 746815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// corresponding declaration within an instantiation. For example, 747815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// given: 748815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 749815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// \code 750815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// template<typename T> 751815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// struct X { 752815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// enum Kind { 753815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// KnownValue = sizeof(T) 754815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// }; 755815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 756815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// bool getKind() const { return KnownValue; } 757815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// }; 758815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 759815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// template struct X<int>; 760815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// \endcode 761815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// 762815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// In the instantiation of X<int>::getKind(), we need to map the 763815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// EnumConstantDecl for KnownValue (which refers to 764815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor/// X<T>::<Kind>::KnownValue) to its instantiation 765ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// (X<int>::<Kind>::KnownValue). InstantiateCurrentDeclRef() performs 766ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor/// this mapping from within the instantiation of X<int>. 767ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas GregorNamedDecl * Sema::InstantiateCurrentDeclRef(NamedDecl *D) { 768815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor DeclContext *ParentDC = D->getDeclContext(); 7692bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor if (isa<ParmVarDecl>(D) || ParentDC->isFunctionOrMethod()) { 7702bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor // D is a local of some kind. Look into the map of local 7712bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor // declarations to their instantiations. 7722bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor return cast<NamedDecl>(CurrentInstantiationScope->getInstantiationOf(D)); 7732bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor } 774815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 7752bba76b0ec4c2f2134eebb1a2bbfe102f36c2f6eDouglas Gregor if (NamedDecl *ParentDecl = dyn_cast<NamedDecl>(ParentDC)) { 776ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor ParentDecl = InstantiateCurrentDeclRef(ParentDecl); 777815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (!ParentDecl) 778815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return 0; 779815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 780815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor ParentDC = cast<DeclContext>(ParentDecl); 781815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } 782815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 783815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (ParentDC != D->getDeclContext()) { 784815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // We performed some kind of instantiation in the parent context, 785815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // so now we need to look into the instantiated parent context to 786815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // find the instantiation of the declaration D. 787815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor NamedDecl *Result = 0; 788815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (D->getDeclName()) { 789815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor DeclContext::lookup_result Found 790815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor = ParentDC->lookup(Context, D->getDeclName()); 791815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor Result = findInstantiationOf(Context, D, Found.first, Found.second); 792815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } else { 793815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // Since we don't have a name for the entity we're looking for, 794815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // our only option is to walk through all of the declarations to 795815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // find that name. This will occur in a few cases: 796815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // 797815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // - anonymous struct/union within a template 798815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // - unnamed class/struct/union/enum within a template 799815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // 800815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor // FIXME: Find a better way to find these instantiations! 801815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor Result = findInstantiationOf(Context, D, 802815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor ParentDC->decls_begin(Context), 803815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor ParentDC->decls_end(Context)); 804815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } 805815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor assert(Result && "Unable to find instantiation of declaration!"); 806815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor D = Result; 807815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } 808815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 809815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(D)) 810ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor if (ClassTemplateDecl *ClassTemplate 811ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor = Record->getDescribedClassTemplate()) { 812ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor // When the declaration D was parsed, it referred to the current 813ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor // instantiation. Therefore, look through the current context, 814ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor // which contains actual instantiations, to find the 815ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor // instantiation of the "current instantiation" that D refers 816ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor // to. Alternatively, we could just instantiate the 817ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor // injected-class-name with the current template arguments, but 818ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor // such an instantiation is far more expensive. 819ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor for (DeclContext *DC = CurContext; !DC->isFileContext(); 820ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor DC = DC->getParent()) { 821ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor if (ClassTemplateSpecializationDecl *Spec 822ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor = dyn_cast<ClassTemplateSpecializationDecl>(DC)) 823ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor if (Context.getCanonicalDecl(Spec->getSpecializedTemplate()) 824ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor == Context.getCanonicalDecl(ClassTemplate)) 825ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor return Spec; 826ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor } 827ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor 828ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor assert(false && 829ed961e7fffc268eeace169869f5a059bcbd5fcbdDouglas Gregor "Unable to find declaration for the current instantiation"); 830815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor } 831815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor 832815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor return D; 833815215daf8f642b53a28212313fca7b9f77e5b9dDouglas Gregor} 834d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor 835d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor/// \brief Performs template instantiation for all implicit template 836d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor/// instantiations we have seen until this point. 837d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregorvoid Sema::PerformPendingImplicitInstantiations() { 838d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor while (!PendingImplicitInstantiations.empty()) { 839d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor PendingImplicitInstantiation Inst = PendingImplicitInstantiations.front(); 840d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor PendingImplicitInstantiations.pop(); 841d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor 842d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor if (FunctionDecl *Function = dyn_cast<FunctionDecl>(Inst.first)) 843d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor if (!Function->getBody(Context)) 844d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor InstantiateFunctionDefinition(/*FIXME:*/Inst.second, Function); 845d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor 846d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor // FIXME: instantiation static member variables 847d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor } 848d7f37bf8b9a211455c5037df7b7e88e5a9510119Douglas Gregor} 849