SemaTemplateInstantiateDecl.cpp revision b28317a8e5e0e2953d1e5406d753d6c3c7f1e7d2
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" 138dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#include "clang/AST/ASTContext.h" 148dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#include "clang/AST/DeclTemplate.h" 158dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#include "clang/AST/DeclVisitor.h" 168dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#include "clang/AST/Expr.h" 178dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor#include "llvm/Support/Compiler.h" 188dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 198dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregorusing namespace clang; 208dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 218dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregornamespace { 228dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor class VISIBILITY_HIDDEN TemplateDeclInstantiator 23b28317a8e5e0e2953d1e5406d753d6c3c7f1e7d2Chris Lattner : public DeclVisitor<TemplateDeclInstantiator, Decl *> { 248dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Sema &SemaRef; 258dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor DeclContext *Owner; 268dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor const TemplateArgument *TemplateArgs; 278dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor unsigned NumTemplateArgs; 288dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 298dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor public: 308dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor typedef Sema::OwningExprResult OwningExprResult; 318dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 328dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor TemplateDeclInstantiator(Sema &SemaRef, DeclContext *Owner, 338dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor const TemplateArgument *TemplateArgs, 348dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor unsigned NumTemplateArgs) 358dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor : SemaRef(SemaRef), Owner(Owner), TemplateArgs(TemplateArgs), 368dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor NumTemplateArgs(NumTemplateArgs) { } 378dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 388dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // FIXME: Once we get closer to completion, replace these 398dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // manually-written declarations with automatically-generated ones 408dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // from clang/AST/DeclNodes.def. 414f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor Decl *VisitTranslationUnitDecl(TranslationUnitDecl *D); 424f722be4587a7a0dece399fb5405dda158971ae1Douglas Gregor Decl *VisitNamespaceDecl(NamespaceDecl *D); 438dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Decl *VisitTypedefDecl(TypedefDecl *D); 443d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor Decl *VisitVarDecl(VarDecl *D); 458dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Decl *VisitFieldDecl(FieldDecl *D); 468dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Decl *VisitStaticAssertDecl(StaticAssertDecl *D); 478dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Decl *VisitEnumDecl(EnumDecl *D); 486477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor Decl *VisitEnumConstantDecl(EnumConstantDecl *D); 49d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor Decl *VisitCXXRecordDecl(CXXRecordDecl *D); 502dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor Decl *VisitCXXMethodDecl(CXXMethodDecl *D); 51615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor Decl *VisitCXXConstructorDecl(CXXConstructorDecl *D); 5203b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor Decl *VisitCXXDestructorDecl(CXXDestructorDecl *D); 53bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor Decl *VisitCXXConversionDecl(CXXConversionDecl *D); 546477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor ParmVarDecl *VisitParmVarDecl(ParmVarDecl *D); 552dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor Decl *VisitOriginalParmVarDecl(OriginalParmVarDecl *D); 565545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 578dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // Base case. FIXME: Remove once we can instantiate everything. 588dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Decl *VisitDecl(Decl *) { 593d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor assert(false && "Template instantiation of unknown declaration kind!"); 608dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return 0; 618dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 625545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 635545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // Helper functions for instantiating methods. 645545e166a956a20d7a6b58408e251a1119025485Douglas Gregor QualType InstantiateFunctionType(FunctionDecl *D, 655545e166a956a20d7a6b58408e251a1119025485Douglas Gregor llvm::SmallVectorImpl<ParmVarDecl *> &Params); 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()) { 868dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor T = SemaRef.InstantiateType(T, TemplateArgs, NumTemplateArgs, 878dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getLocation(), 888dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getDeclName()); 898dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (T.isNull()) { 908dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Invalid = true; 918dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor T = SemaRef.Context.IntTy; 928dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 938dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 948dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 958dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // Create the new typedef 968dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor TypedefDecl *Typedef 978dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor = TypedefDecl::Create(SemaRef.Context, Owner, D->getLocation(), 988dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getIdentifier(), T); 998dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Invalid) 1008dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Typedef->setInvalidDecl(); 1018dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1028dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Owner->addDecl(Typedef); 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 NumTemplateArgs, 1103d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor D->getTypeSpecStartLoc(), 1113d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor D->getDeclName()); 1123d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor if (T.isNull()) 1133d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor return 0; 1143d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 1153d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor // Build the instantiataed declaration 1163d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor VarDecl *Var = VarDecl::Create(SemaRef.Context, Owner, 1173d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor D->getLocation(), D->getIdentifier(), 1183d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor T, D->getStorageClass(), 1193d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor D->getTypeSpecStartLoc()); 1203d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor Var->setThreadSpecified(D->isThreadSpecified()); 1213d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor Var->setCXXDirectInitializer(D->hasCXXDirectInitializer()); 1223d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor Var->setDeclaredInCondition(D->isDeclaredInCondition()); 1233d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 1243d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor // FIXME: In theory, we could have a previous declaration for 1253d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor // variables that are not static data members. 1263d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor bool Redeclaration = false; 1273d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor if (SemaRef.CheckVariableDeclaration(Var, 0, Redeclaration)) 1283d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor Var->setInvalidDecl(); 1293d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 1303d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor Owner->addDecl(Var); 1313d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 1323d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor if (D->getInit()) { 1333d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor OwningExprResult Init 1343d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor = SemaRef.InstantiateExpr(D->getInit(), TemplateArgs, NumTemplateArgs); 1353d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor if (Init.isInvalid()) 1363d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor Var->setInvalidDecl(); 1373d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor else 138b28317a8e5e0e2953d1e5406d753d6c3c7f1e7d2Chris Lattner SemaRef.AddInitializerToDecl(Sema::DeclPtrTy::make(Var), move(Init), 1393d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor D->hasCXXDirectInitializer()); 1403d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor } 1413d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 1423d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor return Var; 1433d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor} 1443d7a12a50558c31d4351e923c15ab57688f4fdf2Douglas Gregor 1458dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *TemplateDeclInstantiator::VisitFieldDecl(FieldDecl *D) { 1468dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor bool Invalid = false; 1478dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor QualType T = D->getType(); 1488dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (T->isDependentType()) { 1498dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor T = SemaRef.InstantiateType(T, TemplateArgs, NumTemplateArgs, 1508dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getLocation(), 1518dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getDeclName()); 1528dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (!T.isNull() && T->isFunctionType()) { 1538dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // C++ [temp.arg.type]p3: 1548dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // If a declaration acquires a function type through a type 1558dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // dependent on a template-parameter and this causes a 1568dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // declaration that does not use the syntactic form of a 1578dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // function declarator to have function type, the program is 1588dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // ill-formed. 1598dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor SemaRef.Diag(D->getLocation(), diag::err_field_instantiates_to_function) 1608dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor << T; 1618dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor T = QualType(); 1628dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Invalid = true; 1638dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 1648dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 1658dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1668dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Expr *BitWidth = D->getBitWidth(); 1678dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Invalid) 1688dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor BitWidth = 0; 1698dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor else if (BitWidth) { 1708dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor OwningExprResult InstantiatedBitWidth 1718dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor = SemaRef.InstantiateExpr(BitWidth, TemplateArgs, NumTemplateArgs); 1728dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (InstantiatedBitWidth.isInvalid()) { 1738dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Invalid = true; 1748dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor BitWidth = 0; 1758dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } else 1768dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor BitWidth = (Expr *)InstantiatedBitWidth.release(); 1778dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 1788dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1798dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor FieldDecl *Field = SemaRef.CheckFieldDecl(D->getDeclName(), T, 1808dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor cast<RecordDecl>(Owner), 1818dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getLocation(), 1828dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->isMutable(), 1838dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor BitWidth, 1848dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getAccess(), 1858dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 0); 1868dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Field) { 1878dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Invalid) 1888dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Field->setInvalidDecl(); 1898dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1908dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Owner->addDecl(Field); 1918dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 1928dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1938dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Field; 1948dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 1958dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1968dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *TemplateDeclInstantiator::VisitStaticAssertDecl(StaticAssertDecl *D) { 1978dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Expr *AssertExpr = D->getAssertExpr(); 1988dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 1998dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor OwningExprResult InstantiatedAssertExpr 2008dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor = SemaRef.InstantiateExpr(AssertExpr, TemplateArgs, NumTemplateArgs); 2018dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (InstantiatedAssertExpr.isInvalid()) 2028dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return 0; 2038dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2048dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor OwningExprResult Message = SemaRef.Clone(D->getMessage()); 2058dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Decl *StaticAssert 206b28317a8e5e0e2953d1e5406d753d6c3c7f1e7d2Chris Lattner = SemaRef.ActOnStaticAssertDeclaration(D->getLocation(), 207b28317a8e5e0e2953d1e5406d753d6c3c7f1e7d2Chris Lattner move(InstantiatedAssertExpr), 208b28317a8e5e0e2953d1e5406d753d6c3c7f1e7d2Chris Lattner move(Message)).getAs<Decl>(); 2098dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return StaticAssert; 2108dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 2118dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2128dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *TemplateDeclInstantiator::VisitEnumDecl(EnumDecl *D) { 2138dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EnumDecl *Enum = EnumDecl::Create(SemaRef.Context, Owner, 2148dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor D->getLocation(), D->getIdentifier(), 2158dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor /*PrevDecl=*/0); 21606c0fecd197fef21e265a41bca8dc5022de1f864Douglas Gregor Enum->setAccess(D->getAccess()); 2178dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Owner->addDecl(Enum); 2188dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Enum->startDefinition(); 2198dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 220b28317a8e5e0e2953d1e5406d753d6c3c7f1e7d2Chris Lattner llvm::SmallVector<Sema::DeclPtrTy, 16> Enumerators; 2218dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2228dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EnumConstantDecl *LastEnumConst = 0; 2238dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor for (EnumDecl::enumerator_iterator EC = D->enumerator_begin(), 2248dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor ECEnd = D->enumerator_end(); 2258dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EC != ECEnd; ++EC) { 2268dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // The specified value for the enumerator. 2278dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor OwningExprResult Value = SemaRef.Owned((Expr *)0); 2288dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Expr *UninstValue = EC->getInitExpr()) 2298dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Value = SemaRef.InstantiateExpr(UninstValue, 2308dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor TemplateArgs, NumTemplateArgs); 2318dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2328dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor // Drop the initial value and continue. 2338dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor bool isInvalid = false; 2348dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (Value.isInvalid()) { 2358dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Value = SemaRef.Owned((Expr *)0); 2368dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor isInvalid = true; 2378dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 2388dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2398dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EnumConstantDecl *EnumConst 2408dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor = SemaRef.CheckEnumConstant(Enum, LastEnumConst, 2418dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EC->getLocation(), EC->getIdentifier(), 2428dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor move(Value)); 2438dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2448dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (isInvalid) { 2458dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (EnumConst) 2468dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor EnumConst->setInvalidDecl(); 2478dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Enum->setInvalidDecl(); 2488dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 2498dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2508dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor if (EnumConst) { 2518dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor Enum->addDecl(EnumConst); 252b28317a8e5e0e2953d1e5406d753d6c3c7f1e7d2Chris Lattner Enumerators.push_back(Sema::DeclPtrTy::make(EnumConst)); 2538dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor LastEnumConst = EnumConst; 2548dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 2558dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor } 2568dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 257b28317a8e5e0e2953d1e5406d753d6c3c7f1e7d2Chris Lattner SemaRef.ActOnEnumBody(Enum->getLocation(), Sema::DeclPtrTy::make(Enum), 2588dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor &Enumerators[0], Enumerators.size()); 2598dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2608dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Enum; 2618dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 2628dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 2636477b69cc93e0a0ff15036d60d604f3544da0f29Douglas GregorDecl *TemplateDeclInstantiator::VisitEnumConstantDecl(EnumConstantDecl *D) { 2646477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor assert(false && "EnumConstantDecls can only occur within EnumDecls."); 2656477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor return 0; 2666477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor} 2676477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor 268d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas GregorDecl *TemplateDeclInstantiator::VisitCXXRecordDecl(CXXRecordDecl *D) { 269d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor CXXRecordDecl *PrevDecl = 0; 270d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor if (D->isInjectedClassName()) 271d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor PrevDecl = cast<CXXRecordDecl>(Owner); 272d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor 273d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor CXXRecordDecl *Record 274d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor = CXXRecordDecl::Create(SemaRef.Context, D->getTagKind(), Owner, 275d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor D->getLocation(), D->getIdentifier(), PrevDecl); 276d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor Record->setImplicit(D->isImplicit()); 277d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor Record->setAccess(D->getAccess()); 278d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor 279d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor if (!D->isInjectedClassName()) 280d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor Record->setInstantiationOfMemberClass(D); 281befc20e1dc869edb0e7b560e69f32d5c71f867abDouglas Gregor else 282befc20e1dc869edb0e7b560e69f32d5c71f867abDouglas Gregor Record->setDescribedClassTemplate(D->getDescribedClassTemplate()); 283d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor 284d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor Owner->addDecl(Record); 285d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor return Record; 286d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor} 287d475b8d9e6f5ff0e6ab8d15667ce8a64c7cb9a4dDouglas Gregor 2882dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXMethodDecl(CXXMethodDecl *D) { 2892dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // Only handle actual methods; we'll deal with constructors, 2902dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // destructors, etc. separately. 2912dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (D->getKind() != Decl::CXXMethod) 2922dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return 0; 2932dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 2945545e166a956a20d7a6b58408e251a1119025485Douglas Gregor llvm::SmallVector<ParmVarDecl *, 16> Params; 2955545e166a956a20d7a6b58408e251a1119025485Douglas Gregor QualType T = InstantiateFunctionType(D, Params); 2962dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (T.isNull()) 2972dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return 0; 2982dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 2992dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // Build the instantiated method declaration. 3002dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(Owner); 3012dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor CXXMethodDecl *Method 3022dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor = CXXMethodDecl::Create(SemaRef.Context, Record, D->getLocation(), 3032dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor D->getDeclName(), T, D->isStatic(), 3042dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor D->isInline()); 3052dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 3065545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // Attach the parameters 3075545e166a956a20d7a6b58408e251a1119025485Douglas Gregor for (unsigned P = 0; P < Params.size(); ++P) 3085545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Params[P]->setOwningFunction(Method); 3095545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Method->setParams(SemaRef.Context, &Params[0], Params.size()); 3105545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 3115545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (InitMethodInstantiation(Method, D)) 3125545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Method->setInvalidDecl(); 3132dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 3142dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor NamedDecl *PrevDecl 3152dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor = SemaRef.LookupQualifiedName(Owner, Method->getDeclName(), 3162dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor Sema::LookupOrdinaryName, true); 3172dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // In C++, the previous declaration we find might be a tag type 3182dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // (class or enum). In this case, the new declaration will hide the 3192dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // tag type. Note that this does does not apply if we're declaring a 3202dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // typedef (C++ [dcl.typedef]p4). 3212dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (PrevDecl && PrevDecl->getIdentifierNamespace() == Decl::IDNS_Tag) 3222dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor PrevDecl = 0; 3232dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor bool Redeclaration = false; 3242dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor bool OverloadableAttrRequired = false; 3252dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (SemaRef.CheckFunctionDeclaration(Method, PrevDecl, Redeclaration, 3262dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor /*FIXME:*/OverloadableAttrRequired)) 3272dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor Method->setInvalidDecl(); 3282dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 3292dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (!Method->isInvalidDecl() || !PrevDecl) 3302dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor Owner->addDecl(Method); 3312dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return Method; 3322dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor} 3332dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 334615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXConstructorDecl(CXXConstructorDecl *D) { 335615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor llvm::SmallVector<ParmVarDecl *, 16> Params; 336615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor QualType T = InstantiateFunctionType(D, Params); 337615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor if (T.isNull()) 338615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor return 0; 339615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 340615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // Build the instantiated method declaration. 341615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(Owner); 342615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor QualType ClassTy = SemaRef.Context.getTypeDeclType(Record); 343615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor DeclarationName Name 344615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXConstructorName(ClassTy); 345615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor CXXConstructorDecl *Constructor 346615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor = CXXConstructorDecl::Create(SemaRef.Context, Record, D->getLocation(), 347615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor Name, T, D->isExplicit(), D->isInline(), 348615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor false); 349615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 350615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // Attach the parameters 351615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor for (unsigned P = 0; P < Params.size(); ++P) 352615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor Params[P]->setOwningFunction(Constructor); 353615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor Constructor->setParams(SemaRef.Context, &Params[0], Params.size()); 354615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 355615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor if (InitMethodInstantiation(Constructor, D)) 356615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor Constructor->setInvalidDecl(); 357615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 358615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor NamedDecl *PrevDecl 359615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor = SemaRef.LookupQualifiedName(Owner, Name, Sema::LookupOrdinaryName, true); 360615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 361615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // In C++, the previous declaration we find might be a tag type 362615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // (class or enum). In this case, the new declaration will hide the 363615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // tag type. Note that this does does not apply if we're declaring a 364615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor // typedef (C++ [dcl.typedef]p4). 365615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor if (PrevDecl && PrevDecl->getIdentifierNamespace() == Decl::IDNS_Tag) 366615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor PrevDecl = 0; 367615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor bool Redeclaration = false; 368615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor bool OverloadableAttrRequired = false; 369615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor if (SemaRef.CheckFunctionDeclaration(Constructor, PrevDecl, Redeclaration, 370615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor /*FIXME:*/OverloadableAttrRequired)) 371615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor Constructor->setInvalidDecl(); 372615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 373615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor if (!Constructor->isInvalidDecl()) 374615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor Owner->addDecl(Constructor); 375615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor return Constructor; 376615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor} 377615c5d4674355ba830b9978f462ca7a8c5d15f85Douglas Gregor 37803b2b07aaef3a585aec13048a33356c7f635de72Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXDestructorDecl(CXXDestructorDecl *D) { 3795545e166a956a20d7a6b58408e251a1119025485Douglas Gregor llvm::SmallVector<ParmVarDecl *, 16> Params; 3805545e166a956a20d7a6b58408e251a1119025485Douglas Gregor QualType T = InstantiateFunctionType(D, Params); 38103b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor if (T.isNull()) 38203b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor return 0; 3835545e166a956a20d7a6b58408e251a1119025485Douglas Gregor assert(Params.size() == 0 && "Destructor with parameters?"); 3845545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 38503b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor // Build the instantiated destructor declaration. 38603b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(Owner); 38703b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor QualType ClassTy = SemaRef.Context.getTypeDeclType(Record); 38803b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor CXXDestructorDecl *Destructor 38903b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor = CXXDestructorDecl::Create(SemaRef.Context, Record, 39003b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor D->getLocation(), 39103b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor SemaRef.Context.DeclarationNames.getCXXDestructorName(ClassTy), 39203b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor T, D->isInline(), false); 3935545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (InitMethodInstantiation(Destructor, D)) 3945545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Destructor->setInvalidDecl(); 39503b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor 39603b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor bool Redeclaration = false; 39703b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor bool OverloadableAttrRequired = false; 39803b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor NamedDecl *PrevDecl = 0; 39903b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor if (SemaRef.CheckFunctionDeclaration(Destructor, PrevDecl, Redeclaration, 40003b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor /*FIXME:*/OverloadableAttrRequired)) 40103b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor Destructor->setInvalidDecl(); 40203b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor Owner->addDecl(Destructor); 40303b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor return Destructor; 40403b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor} 40503b2b07aaef3a585aec13048a33356c7f635de72Douglas Gregor 406bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas GregorDecl *TemplateDeclInstantiator::VisitCXXConversionDecl(CXXConversionDecl *D) { 407bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor llvm::SmallVector<ParmVarDecl *, 16> Params; 408bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor QualType T = InstantiateFunctionType(D, Params); 409bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor if (T.isNull()) 410bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor return 0; 411bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor assert(Params.size() == 0 && "Destructor with parameters?"); 412bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor 413bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor // Build the instantiated conversion declaration. 414bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(Owner); 415bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor QualType ClassTy = SemaRef.Context.getTypeDeclType(Record); 416bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor QualType ConvTy 417bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor = SemaRef.Context.getCanonicalType(T->getAsFunctionType()->getResultType()); 418bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor CXXConversionDecl *Conversion 419bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor = CXXConversionDecl::Create(SemaRef.Context, Record, 420bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor D->getLocation(), 421bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor SemaRef.Context.DeclarationNames.getCXXConversionFunctionName(ConvTy), 422bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor T, D->isInline(), D->isExplicit()); 423bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor if (InitMethodInstantiation(Conversion, D)) 424bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor Conversion->setInvalidDecl(); 425bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor 426bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor bool Redeclaration = false; 427bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor bool OverloadableAttrRequired = false; 428bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor NamedDecl *PrevDecl = 0; 429bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor if (SemaRef.CheckFunctionDeclaration(Conversion, PrevDecl, Redeclaration, 430bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor /*FIXME:*/OverloadableAttrRequired)) 431bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor Conversion->setInvalidDecl(); 432bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor Owner->addDecl(Conversion); 433bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor return Conversion; 434bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor} 435bb969ed4193e2eadabfaa0dfd0b94312b6146349Douglas Gregor 4366477b69cc93e0a0ff15036d60d604f3544da0f29Douglas GregorParmVarDecl *TemplateDeclInstantiator::VisitParmVarDecl(ParmVarDecl *D) { 4372dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor QualType OrigT = SemaRef.InstantiateType(D->getOriginalType(), TemplateArgs, 4382dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor NumTemplateArgs, D->getLocation(), 4392dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor D->getDeclName()); 4402dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (OrigT.isNull()) 4412dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return 0; 4422dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 4432dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor QualType T = SemaRef.adjustParameterType(OrigT); 4442dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 4452dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (D->getDefaultArg()) { 4462dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // FIXME: Leave a marker for "uninstantiated" default 4472dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // arguments. They only get instantiated on demand at the call 4482dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // site. 4492dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor unsigned DiagID = SemaRef.Diags.getCustomDiagID(Diagnostic::Warning, 4502dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor "sorry, dropping default argument during template instantiation"); 4512dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor SemaRef.Diag(D->getDefaultArg()->getSourceRange().getBegin(), DiagID) 4522dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor << D->getDefaultArg()->getSourceRange(); 4532dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor } 4542dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 4552dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // Allocate the parameter 4562dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor ParmVarDecl *Param = 0; 4572dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor if (T == OrigT) 4582dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor Param = ParmVarDecl::Create(SemaRef.Context, Owner, D->getLocation(), 4592dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor D->getIdentifier(), T, D->getStorageClass(), 4602dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 0); 4612dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor else 4622dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor Param = OriginalParmVarDecl::Create(SemaRef.Context, Owner, 4632dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor D->getLocation(), D->getIdentifier(), 4642dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor T, OrigT, D->getStorageClass(), 0); 4652dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 4662dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // Note: we don't try to instantiate function parameters until after 4672dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // we've instantiated the function's type. Therefore, we don't have 4682dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // to check for 'void' parameter types here. 4692dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return Param; 4702dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor} 4712dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 4722dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas GregorDecl * 4732dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas GregorTemplateDeclInstantiator::VisitOriginalParmVarDecl(OriginalParmVarDecl *D) { 4742dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // Since parameter types can decay either before or after 4752dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // instantiation, we simply treat OriginalParmVarDecls as 4762dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // ParmVarDecls the same way, and create one or the other depending 4772dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor // on what happens after template instantiation. 4782dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor return VisitParmVarDecl(D); 4792dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor} 4802dc0e64e57b2a1786fa53a7dbd1d5c8e255eadb0Douglas Gregor 4818dbc2694424b4e842b1d5ea39744a137b58600c3Douglas GregorDecl *Sema::InstantiateDecl(Decl *D, DeclContext *Owner, 4828dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor const TemplateArgument *TemplateArgs, 4838dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor unsigned NumTemplateArgs) { 4848dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor TemplateDeclInstantiator Instantiator(*this, Owner, TemplateArgs, 4858dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor NumTemplateArgs); 4868dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor return Instantiator.Visit(D); 4878dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor} 4888dbc2694424b4e842b1d5ea39744a137b58600c3Douglas Gregor 4895545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \brief Instantiates the type of the given function, including 4905545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// instantiating all of the function parameters. 4915545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// 4925545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \param D The function that we will be instantiated 4935545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// 4945545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \param Params the instantiated parameter declarations 4955545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 4965545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \returns the instantiated function's type if successfull, a NULL 4975545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// type if there was an error. 4985545e166a956a20d7a6b58408e251a1119025485Douglas GregorQualType 4995545e166a956a20d7a6b58408e251a1119025485Douglas GregorTemplateDeclInstantiator::InstantiateFunctionType(FunctionDecl *D, 5005545e166a956a20d7a6b58408e251a1119025485Douglas Gregor llvm::SmallVectorImpl<ParmVarDecl *> &Params) { 5015545e166a956a20d7a6b58408e251a1119025485Douglas Gregor bool InvalidDecl = false; 5025545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5035545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // Instantiate the function parameters 5045545e166a956a20d7a6b58408e251a1119025485Douglas Gregor TemplateDeclInstantiator ParamInstantiator(SemaRef, 0, 5055545e166a956a20d7a6b58408e251a1119025485Douglas Gregor TemplateArgs, NumTemplateArgs); 5065545e166a956a20d7a6b58408e251a1119025485Douglas Gregor llvm::SmallVector<QualType, 16> ParamTys; 5075545e166a956a20d7a6b58408e251a1119025485Douglas Gregor for (FunctionDecl::param_iterator P = D->param_begin(), 5085545e166a956a20d7a6b58408e251a1119025485Douglas Gregor PEnd = D->param_end(); 5095545e166a956a20d7a6b58408e251a1119025485Douglas Gregor P != PEnd; ++P) { 5106477b69cc93e0a0ff15036d60d604f3544da0f29Douglas Gregor if (ParmVarDecl *PInst = ParamInstantiator.VisitParmVarDecl(*P)) { 5115545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (PInst->getType()->isVoidType()) { 5125545e166a956a20d7a6b58408e251a1119025485Douglas Gregor SemaRef.Diag(PInst->getLocation(), diag::err_param_with_void_type); 5135545e166a956a20d7a6b58408e251a1119025485Douglas Gregor PInst->setInvalidDecl(); 5145545e166a956a20d7a6b58408e251a1119025485Douglas Gregor } 5155545e166a956a20d7a6b58408e251a1119025485Douglas Gregor else if (SemaRef.RequireNonAbstractType(PInst->getLocation(), 5165545e166a956a20d7a6b58408e251a1119025485Douglas Gregor PInst->getType(), 5175545e166a956a20d7a6b58408e251a1119025485Douglas Gregor diag::err_abstract_type_in_decl, 5188211effbd3abc5948a5d6924c87e72323016a376Anders Carlsson Sema::AbstractParamType)) 5195545e166a956a20d7a6b58408e251a1119025485Douglas Gregor PInst->setInvalidDecl(); 5205545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5215545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Params.push_back(PInst); 5225545e166a956a20d7a6b58408e251a1119025485Douglas Gregor ParamTys.push_back(PInst->getType()); 5235545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5245545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (PInst->isInvalidDecl()) 5255545e166a956a20d7a6b58408e251a1119025485Douglas Gregor InvalidDecl = true; 5265545e166a956a20d7a6b58408e251a1119025485Douglas Gregor } else 5275545e166a956a20d7a6b58408e251a1119025485Douglas Gregor InvalidDecl = true; 5285545e166a956a20d7a6b58408e251a1119025485Douglas Gregor } 5295545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5305545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // FIXME: Deallocate dead declarations. 5315545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (InvalidDecl) 5325545e166a956a20d7a6b58408e251a1119025485Douglas Gregor return QualType(); 5335545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5345545e166a956a20d7a6b58408e251a1119025485Douglas Gregor const FunctionProtoType *Proto = D->getType()->getAsFunctionProtoType(); 5355545e166a956a20d7a6b58408e251a1119025485Douglas Gregor assert(Proto && "Missing prototype?"); 5365545e166a956a20d7a6b58408e251a1119025485Douglas Gregor QualType ResultType 5375545e166a956a20d7a6b58408e251a1119025485Douglas Gregor = SemaRef.InstantiateType(Proto->getResultType(), 5385545e166a956a20d7a6b58408e251a1119025485Douglas Gregor TemplateArgs, NumTemplateArgs, 5395545e166a956a20d7a6b58408e251a1119025485Douglas Gregor D->getLocation(), D->getDeclName()); 5405545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (ResultType.isNull()) 5415545e166a956a20d7a6b58408e251a1119025485Douglas Gregor return QualType(); 5425545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5435545e166a956a20d7a6b58408e251a1119025485Douglas Gregor return SemaRef.BuildFunctionType(ResultType, &ParamTys[0], ParamTys.size(), 5445545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Proto->isVariadic(), Proto->getTypeQuals(), 5455545e166a956a20d7a6b58408e251a1119025485Douglas Gregor D->getLocation(), D->getDeclName()); 5465545e166a956a20d7a6b58408e251a1119025485Douglas Gregor} 5475545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5485545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \brief Initializes common fields of an instantiated method 5495545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// declaration (New) from the corresponding fields of its template 5505545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// (Tmpl). 5515545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// 5525545e166a956a20d7a6b58408e251a1119025485Douglas Gregor/// \returns true if there was an error 5535545e166a956a20d7a6b58408e251a1119025485Douglas Gregorbool 5545545e166a956a20d7a6b58408e251a1119025485Douglas GregorTemplateDeclInstantiator::InitMethodInstantiation(CXXMethodDecl *New, 5555545e166a956a20d7a6b58408e251a1119025485Douglas Gregor CXXMethodDecl *Tmpl) { 5565545e166a956a20d7a6b58408e251a1119025485Douglas Gregor CXXRecordDecl *Record = cast<CXXRecordDecl>(Owner); 5575545e166a956a20d7a6b58408e251a1119025485Douglas Gregor New->setAccess(Tmpl->getAccess()); 5585545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (Tmpl->isVirtual()) { 5595545e166a956a20d7a6b58408e251a1119025485Douglas Gregor New->setVirtual(); 5605545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Record->setAggregate(false); 5615545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Record->setPOD(false); 5625545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Record->setPolymorphic(true); 5635545e166a956a20d7a6b58408e251a1119025485Douglas Gregor } 5645545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (Tmpl->isDeleted()) 5655545e166a956a20d7a6b58408e251a1119025485Douglas Gregor New->setDeleted(); 5665545e166a956a20d7a6b58408e251a1119025485Douglas Gregor if (Tmpl->isPure()) { 5675545e166a956a20d7a6b58408e251a1119025485Douglas Gregor New->setPure(); 5685545e166a956a20d7a6b58408e251a1119025485Douglas Gregor Record->setAbstract(true); 5695545e166a956a20d7a6b58408e251a1119025485Douglas Gregor } 5705545e166a956a20d7a6b58408e251a1119025485Douglas Gregor 5715545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // FIXME: attributes 5725545e166a956a20d7a6b58408e251a1119025485Douglas Gregor // FIXME: New needs a pointer to Tmpl 5735545e166a956a20d7a6b58408e251a1119025485Douglas Gregor return false; 5745545e166a956a20d7a6b58408e251a1119025485Douglas Gregor} 575