SemaTemplateInstantiate.cpp revision 0b9247f129401b4849682b2e2bcdea8fc977068a
1//===------- SemaTemplateInstantiate.cpp - C++ Template Instantiation ------===/ 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7//===----------------------------------------------------------------------===/ 8// 9// This file implements C++ template instantiation. 10// 11//===----------------------------------------------------------------------===/ 12 13#include "Sema.h" 14#include "clang/AST/ASTConsumer.h" 15#include "clang/AST/ASTContext.h" 16#include "clang/AST/Expr.h" 17#include "clang/AST/DeclTemplate.h" 18#include "clang/Parse/DeclSpec.h" 19#include "clang/Basic/LangOptions.h" 20#include "llvm/Support/Compiler.h" 21 22using namespace clang; 23 24//===----------------------------------------------------------------------===/ 25// Template Instantiation Support 26//===----------------------------------------------------------------------===/ 27 28/// \brief Retrieve the template argument list that should be used to 29/// instantiate the given declaration. 30const TemplateArgumentList & 31Sema::getTemplateInstantiationArgs(NamedDecl *D) { 32 if (ClassTemplateSpecializationDecl *Spec 33 = dyn_cast<ClassTemplateSpecializationDecl>(D)) 34 return Spec->getTemplateArgs(); 35 36 DeclContext *EnclosingTemplateCtx = D->getDeclContext(); 37 while (!isa<ClassTemplateSpecializationDecl>(EnclosingTemplateCtx)) { 38 assert(!EnclosingTemplateCtx->isFileContext() && 39 "Tried to get the instantiation arguments of a non-template"); 40 EnclosingTemplateCtx = EnclosingTemplateCtx->getParent(); 41 } 42 43 ClassTemplateSpecializationDecl *EnclosingTemplate 44 = cast<ClassTemplateSpecializationDecl>(EnclosingTemplateCtx); 45 return EnclosingTemplate->getTemplateArgs(); 46} 47 48Sema::InstantiatingTemplate:: 49InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, 50 Decl *Entity, 51 SourceRange InstantiationRange) 52 : SemaRef(SemaRef) { 53 54 Invalid = CheckInstantiationDepth(PointOfInstantiation, 55 InstantiationRange); 56 if (!Invalid) { 57 ActiveTemplateInstantiation Inst; 58 Inst.Kind = ActiveTemplateInstantiation::TemplateInstantiation; 59 Inst.PointOfInstantiation = PointOfInstantiation; 60 Inst.Entity = reinterpret_cast<uintptr_t>(Entity); 61 Inst.TemplateArgs = 0; 62 Inst.NumTemplateArgs = 0; 63 Inst.InstantiationRange = InstantiationRange; 64 SemaRef.ActiveTemplateInstantiations.push_back(Inst); 65 Invalid = false; 66 } 67} 68 69Sema::InstantiatingTemplate::InstantiatingTemplate(Sema &SemaRef, 70 SourceLocation PointOfInstantiation, 71 TemplateDecl *Template, 72 const TemplateArgument *TemplateArgs, 73 unsigned NumTemplateArgs, 74 SourceRange InstantiationRange) 75 : SemaRef(SemaRef) { 76 77 Invalid = CheckInstantiationDepth(PointOfInstantiation, 78 InstantiationRange); 79 if (!Invalid) { 80 ActiveTemplateInstantiation Inst; 81 Inst.Kind 82 = ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation; 83 Inst.PointOfInstantiation = PointOfInstantiation; 84 Inst.Entity = reinterpret_cast<uintptr_t>(Template); 85 Inst.TemplateArgs = TemplateArgs; 86 Inst.NumTemplateArgs = NumTemplateArgs; 87 Inst.InstantiationRange = InstantiationRange; 88 SemaRef.ActiveTemplateInstantiations.push_back(Inst); 89 Invalid = false; 90 } 91} 92 93void Sema::InstantiatingTemplate::Clear() { 94 if (!Invalid) { 95 SemaRef.ActiveTemplateInstantiations.pop_back(); 96 Invalid = true; 97 } 98} 99 100bool Sema::InstantiatingTemplate::CheckInstantiationDepth( 101 SourceLocation PointOfInstantiation, 102 SourceRange InstantiationRange) { 103 if (SemaRef.ActiveTemplateInstantiations.size() 104 <= SemaRef.getLangOptions().InstantiationDepth) 105 return false; 106 107 SemaRef.Diag(PointOfInstantiation, 108 diag::err_template_recursion_depth_exceeded) 109 << SemaRef.getLangOptions().InstantiationDepth 110 << InstantiationRange; 111 SemaRef.Diag(PointOfInstantiation, diag::note_template_recursion_depth) 112 << SemaRef.getLangOptions().InstantiationDepth; 113 return true; 114} 115 116/// \brief Prints the current instantiation stack through a series of 117/// notes. 118void Sema::PrintInstantiationStack() { 119 for (llvm::SmallVector<ActiveTemplateInstantiation, 16>::reverse_iterator 120 Active = ActiveTemplateInstantiations.rbegin(), 121 ActiveEnd = ActiveTemplateInstantiations.rend(); 122 Active != ActiveEnd; 123 ++Active) { 124 switch (Active->Kind) { 125 case ActiveTemplateInstantiation::TemplateInstantiation: { 126 Decl *D = reinterpret_cast<Decl *>(Active->Entity); 127 if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(D)) { 128 unsigned DiagID = diag::note_template_member_class_here; 129 if (isa<ClassTemplateSpecializationDecl>(Record)) 130 DiagID = diag::note_template_class_instantiation_here; 131 Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr), 132 DiagID) 133 << Context.getTypeDeclType(Record) 134 << Active->InstantiationRange; 135 } else { 136 FunctionDecl *Function = cast<FunctionDecl>(D); 137 unsigned DiagID = diag::note_template_member_function_here; 138 // FIXME: check for a function template 139 Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr), 140 DiagID) 141 << Function 142 << Active->InstantiationRange; 143 } 144 break; 145 } 146 147 case ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation: { 148 TemplateDecl *Template = cast<TemplateDecl>((Decl *)Active->Entity); 149 std::string TemplateArgsStr 150 = TemplateSpecializationType::PrintTemplateArgumentList( 151 Active->TemplateArgs, 152 Active->NumTemplateArgs, 153 Context.PrintingPolicy); 154 Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr), 155 diag::note_default_arg_instantiation_here) 156 << (Template->getNameAsString() + TemplateArgsStr) 157 << Active->InstantiationRange; 158 break; 159 } 160 } 161 } 162} 163 164//===----------------------------------------------------------------------===/ 165// Template Instantiation for Types 166//===----------------------------------------------------------------------===/ 167namespace { 168 class VISIBILITY_HIDDEN TemplateTypeInstantiator { 169 Sema &SemaRef; 170 const TemplateArgumentList &TemplateArgs; 171 SourceLocation Loc; 172 DeclarationName Entity; 173 174 public: 175 TemplateTypeInstantiator(Sema &SemaRef, 176 const TemplateArgumentList &TemplateArgs, 177 SourceLocation Loc, 178 DeclarationName Entity) 179 : SemaRef(SemaRef), TemplateArgs(TemplateArgs), 180 Loc(Loc), Entity(Entity) { } 181 182 QualType operator()(QualType T) const { return Instantiate(T); } 183 184 QualType Instantiate(QualType T) const; 185 186 // Declare instantiate functions for each type. 187#define TYPE(Class, Base) \ 188 QualType Instantiate##Class##Type(const Class##Type *T, \ 189 unsigned Quals) const; 190#define ABSTRACT_TYPE(Class, Base) 191#include "clang/AST/TypeNodes.def" 192 }; 193} 194 195QualType 196TemplateTypeInstantiator::InstantiateExtQualType(const ExtQualType *T, 197 unsigned Quals) const { 198 // FIXME: Implement this 199 assert(false && "Cannot instantiate ExtQualType yet"); 200 return QualType(); 201} 202 203QualType 204TemplateTypeInstantiator::InstantiateBuiltinType(const BuiltinType *T, 205 unsigned Quals) const { 206 assert(false && "Builtin types are not dependent and cannot be instantiated"); 207 return QualType(T, Quals); 208} 209 210QualType 211TemplateTypeInstantiator:: 212InstantiateFixedWidthIntType(const FixedWidthIntType *T, unsigned Quals) const { 213 // FIXME: Implement this 214 assert(false && "Cannot instantiate FixedWidthIntType yet"); 215 return QualType(); 216} 217 218QualType 219TemplateTypeInstantiator::InstantiateComplexType(const ComplexType *T, 220 unsigned Quals) const { 221 // FIXME: Implement this 222 assert(false && "Cannot instantiate ComplexType yet"); 223 return QualType(); 224} 225 226QualType 227TemplateTypeInstantiator::InstantiatePointerType(const PointerType *T, 228 unsigned Quals) const { 229 QualType PointeeType = Instantiate(T->getPointeeType()); 230 if (PointeeType.isNull()) 231 return QualType(); 232 233 return SemaRef.BuildPointerType(PointeeType, Quals, Loc, Entity); 234} 235 236QualType 237TemplateTypeInstantiator::InstantiateBlockPointerType(const BlockPointerType *T, 238 unsigned Quals) const { 239 // FIXME: Implement this 240 assert(false && "Cannot instantiate BlockPointerType yet"); 241 return QualType(); 242} 243 244QualType 245TemplateTypeInstantiator::InstantiateLValueReferenceType( 246 const LValueReferenceType *T, unsigned Quals) const { 247 QualType ReferentType = Instantiate(T->getPointeeType()); 248 if (ReferentType.isNull()) 249 return QualType(); 250 251 return SemaRef.BuildReferenceType(ReferentType, true, Quals, Loc, Entity); 252} 253 254QualType 255TemplateTypeInstantiator::InstantiateRValueReferenceType( 256 const RValueReferenceType *T, unsigned Quals) const { 257 QualType ReferentType = Instantiate(T->getPointeeType()); 258 if (ReferentType.isNull()) 259 return QualType(); 260 261 return SemaRef.BuildReferenceType(ReferentType, false, Quals, Loc, Entity); 262} 263 264QualType 265TemplateTypeInstantiator:: 266InstantiateMemberPointerType(const MemberPointerType *T, 267 unsigned Quals) const { 268 // FIXME: Implement this 269 assert(false && "Cannot instantiate MemberPointerType yet"); 270 return QualType(); 271} 272 273QualType 274TemplateTypeInstantiator:: 275InstantiateConstantArrayType(const ConstantArrayType *T, 276 unsigned Quals) const { 277 QualType ElementType = Instantiate(T->getElementType()); 278 if (ElementType.isNull()) 279 return ElementType; 280 281 // Build a temporary integer literal to specify the size for 282 // BuildArrayType. Since we have already checked the size as part of 283 // creating the dependent array type in the first place, we know 284 // there aren't any errors. However, we do need to determine what 285 // C++ type to give the size expression. 286 llvm::APInt Size = T->getSize(); 287 QualType Types[] = { 288 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 289 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 290 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 291 }; 292 const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 293 QualType SizeType; 294 for (unsigned I = 0; I != NumTypes; ++I) 295 if (Size.getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 296 SizeType = Types[I]; 297 break; 298 } 299 300 if (SizeType.isNull()) 301 SizeType = SemaRef.Context.getFixedWidthIntType(Size.getBitWidth(), false); 302 303 IntegerLiteral ArraySize(Size, SizeType, Loc); 304 return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(), 305 &ArraySize, T->getIndexTypeQualifier(), 306 Loc, Entity); 307} 308 309QualType 310TemplateTypeInstantiator:: 311InstantiateIncompleteArrayType(const IncompleteArrayType *T, 312 unsigned Quals) const { 313 QualType ElementType = Instantiate(T->getElementType()); 314 if (ElementType.isNull()) 315 return ElementType; 316 317 return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(), 318 0, T->getIndexTypeQualifier(), 319 Loc, Entity); 320} 321 322QualType 323TemplateTypeInstantiator:: 324InstantiateVariableArrayType(const VariableArrayType *T, 325 unsigned Quals) const { 326 // FIXME: Implement this 327 assert(false && "Cannot instantiate VariableArrayType yet"); 328 return QualType(); 329} 330 331QualType 332TemplateTypeInstantiator:: 333InstantiateDependentSizedArrayType(const DependentSizedArrayType *T, 334 unsigned Quals) const { 335 Expr *ArraySize = T->getSizeExpr(); 336 assert(ArraySize->isValueDependent() && 337 "dependent sized array types must have value dependent size expr"); 338 339 // Instantiate the element type if needed 340 QualType ElementType = T->getElementType(); 341 if (ElementType->isDependentType()) { 342 ElementType = Instantiate(ElementType); 343 if (ElementType.isNull()) 344 return QualType(); 345 } 346 347 // Instantiate the size expression 348 Sema::OwningExprResult InstantiatedArraySize = 349 SemaRef.InstantiateExpr(ArraySize, TemplateArgs); 350 if (InstantiatedArraySize.isInvalid()) 351 return QualType(); 352 353 return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(), 354 InstantiatedArraySize.takeAs<Expr>(), 355 T->getIndexTypeQualifier(), Loc, Entity); 356} 357 358QualType 359TemplateTypeInstantiator::InstantiateVectorType(const VectorType *T, 360 unsigned Quals) const { 361 // FIXME: Implement this 362 assert(false && "Cannot instantiate VectorType yet"); 363 return QualType(); 364} 365 366QualType 367TemplateTypeInstantiator::InstantiateExtVectorType(const ExtVectorType *T, 368 unsigned Quals) const { 369 // FIXME: Implement this 370 assert(false && "Cannot instantiate ExtVectorType yet"); 371 return QualType(); 372} 373 374QualType 375TemplateTypeInstantiator:: 376InstantiateFunctionProtoType(const FunctionProtoType *T, 377 unsigned Quals) const { 378 QualType ResultType = Instantiate(T->getResultType()); 379 if (ResultType.isNull()) 380 return ResultType; 381 382 llvm::SmallVector<QualType, 4> ParamTypes; 383 for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(), 384 ParamEnd = T->arg_type_end(); 385 Param != ParamEnd; ++Param) { 386 QualType P = Instantiate(*Param); 387 if (P.isNull()) 388 return P; 389 390 ParamTypes.push_back(P); 391 } 392 393 return SemaRef.BuildFunctionType(ResultType, &ParamTypes[0], 394 ParamTypes.size(), 395 T->isVariadic(), T->getTypeQuals(), 396 Loc, Entity); 397} 398 399QualType 400TemplateTypeInstantiator:: 401InstantiateFunctionNoProtoType(const FunctionNoProtoType *T, 402 unsigned Quals) const { 403 assert(false && "Functions without prototypes cannot be dependent."); 404 return QualType(); 405} 406 407QualType 408TemplateTypeInstantiator::InstantiateTypedefType(const TypedefType *T, 409 unsigned Quals) const { 410 TypedefDecl *Typedef 411 = cast_or_null<TypedefDecl>( 412 SemaRef.InstantiateCurrentDeclRef(T->getDecl())); 413 if (!Typedef) 414 return QualType(); 415 416 return SemaRef.Context.getTypeDeclType(Typedef); 417} 418 419QualType 420TemplateTypeInstantiator::InstantiateTypeOfExprType(const TypeOfExprType *T, 421 unsigned Quals) const { 422 Sema::OwningExprResult E 423 = SemaRef.InstantiateExpr(T->getUnderlyingExpr(), TemplateArgs); 424 if (E.isInvalid()) 425 return QualType(); 426 427 return SemaRef.Context.getTypeOfExprType(E.takeAs<Expr>()); 428} 429 430QualType 431TemplateTypeInstantiator::InstantiateTypeOfType(const TypeOfType *T, 432 unsigned Quals) const { 433 QualType Underlying = Instantiate(T->getUnderlyingType()); 434 if (Underlying.isNull()) 435 return QualType(); 436 437 return SemaRef.Context.getTypeOfType(Underlying); 438} 439 440QualType 441TemplateTypeInstantiator::InstantiateRecordType(const RecordType *T, 442 unsigned Quals) const { 443 RecordDecl *Record 444 = cast_or_null<RecordDecl>(SemaRef.InstantiateCurrentDeclRef(T->getDecl())); 445 if (!Record) 446 return QualType(); 447 448 return SemaRef.Context.getTypeDeclType(Record); 449} 450 451QualType 452TemplateTypeInstantiator::InstantiateEnumType(const EnumType *T, 453 unsigned Quals) const { 454 EnumDecl *Enum 455 = cast_or_null<EnumDecl>(SemaRef.InstantiateCurrentDeclRef(T->getDecl())); 456 if (!Enum) 457 return QualType(); 458 459 return SemaRef.Context.getTypeDeclType(Enum); 460} 461 462QualType 463TemplateTypeInstantiator:: 464InstantiateTemplateTypeParmType(const TemplateTypeParmType *T, 465 unsigned Quals) const { 466 if (T->getDepth() == 0) { 467 // Replace the template type parameter with its corresponding 468 // template argument. 469 assert(TemplateArgs[T->getIndex()].getKind() == TemplateArgument::Type && 470 "Template argument kind mismatch"); 471 QualType Result = TemplateArgs[T->getIndex()].getAsType(); 472 if (Result.isNull() || !Quals) 473 return Result; 474 475 // C++ [dcl.ref]p1: 476 // [...] Cv-qualified references are ill-formed except when 477 // the cv-qualifiers are introduced through the use of a 478 // typedef (7.1.3) or of a template type argument (14.3), in 479 // which case the cv-qualifiers are ignored. 480 if (Quals && Result->isReferenceType()) 481 Quals = 0; 482 483 return QualType(Result.getTypePtr(), Quals | Result.getCVRQualifiers()); 484 } 485 486 // The template type parameter comes from an inner template (e.g., 487 // the template parameter list of a member template inside the 488 // template we are instantiating). Create a new template type 489 // parameter with the template "level" reduced by one. 490 return SemaRef.Context.getTemplateTypeParmType(T->getDepth() - 1, 491 T->getIndex(), 492 T->getName()) 493 .getQualifiedType(Quals); 494} 495 496QualType 497TemplateTypeInstantiator:: 498InstantiateTemplateSpecializationType( 499 const TemplateSpecializationType *T, 500 unsigned Quals) const { 501 llvm::SmallVector<TemplateArgument, 4> InstantiatedTemplateArgs; 502 InstantiatedTemplateArgs.reserve(T->getNumArgs()); 503 for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end(); 504 Arg != ArgEnd; ++Arg) { 505 switch (Arg->getKind()) { 506 case TemplateArgument::Null: 507 assert(false && "Should never have a NULL template argument"); 508 break; 509 510 case TemplateArgument::Type: { 511 QualType T = SemaRef.InstantiateType(Arg->getAsType(), 512 TemplateArgs, 513 Arg->getLocation(), 514 DeclarationName()); 515 if (T.isNull()) 516 return QualType(); 517 518 InstantiatedTemplateArgs.push_back( 519 TemplateArgument(Arg->getLocation(), T)); 520 break; 521 } 522 523 case TemplateArgument::Declaration: 524 case TemplateArgument::Integral: 525 InstantiatedTemplateArgs.push_back(*Arg); 526 break; 527 528 case TemplateArgument::Expression: 529 Sema::OwningExprResult E 530 = SemaRef.InstantiateExpr(Arg->getAsExpr(), TemplateArgs); 531 if (E.isInvalid()) 532 return QualType(); 533 InstantiatedTemplateArgs.push_back(E.takeAs<Expr>()); 534 break; 535 } 536 } 537 538 // FIXME: We're missing the locations of the template name, '<', and '>'. 539 540 TemplateName Name = SemaRef.InstantiateTemplateName(T->getTemplateName(), 541 Loc, 542 TemplateArgs); 543 544 return SemaRef.CheckTemplateIdType(Name, Loc, SourceLocation(), 545 &InstantiatedTemplateArgs[0], 546 InstantiatedTemplateArgs.size(), 547 SourceLocation()); 548} 549 550QualType 551TemplateTypeInstantiator:: 552InstantiateQualifiedNameType(const QualifiedNameType *T, 553 unsigned Quals) const { 554 // When we instantiated a qualified name type, there's no point in 555 // keeping the qualification around in the instantiated result. So, 556 // just instantiate the named type. 557 return (*this)(T->getNamedType()); 558} 559 560QualType 561TemplateTypeInstantiator:: 562InstantiateTypenameType(const TypenameType *T, unsigned Quals) const { 563 if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) { 564 // When the typename type refers to a template-id, the template-id 565 // is dependent and has enough information to instantiate the 566 // result of the typename type. Since we don't care about keeping 567 // the spelling of the typename type in template instantiations, 568 // we just instantiate the template-id. 569 return InstantiateTemplateSpecializationType(TemplateId, Quals); 570 } 571 572 NestedNameSpecifier *NNS 573 = SemaRef.InstantiateNestedNameSpecifier(T->getQualifier(), 574 SourceRange(Loc), 575 TemplateArgs); 576 if (!NNS) 577 return QualType(); 578 579 return SemaRef.CheckTypenameType(NNS, *T->getIdentifier(), SourceRange(Loc)); 580} 581 582QualType 583TemplateTypeInstantiator:: 584InstantiateObjCInterfaceType(const ObjCInterfaceType *T, 585 unsigned Quals) const { 586 assert(false && "Objective-C types cannot be dependent"); 587 return QualType(); 588} 589 590QualType 591TemplateTypeInstantiator:: 592InstantiateObjCQualifiedInterfaceType(const ObjCQualifiedInterfaceType *T, 593 unsigned Quals) const { 594 assert(false && "Objective-C types cannot be dependent"); 595 return QualType(); 596} 597 598QualType 599TemplateTypeInstantiator:: 600InstantiateObjCQualifiedIdType(const ObjCQualifiedIdType *T, 601 unsigned Quals) const { 602 assert(false && "Objective-C types cannot be dependent"); 603 return QualType(); 604} 605 606/// \brief The actual implementation of Sema::InstantiateType(). 607QualType TemplateTypeInstantiator::Instantiate(QualType T) const { 608 // If T is not a dependent type, there is nothing to do. 609 if (!T->isDependentType()) 610 return T; 611 612 switch (T->getTypeClass()) { 613#define TYPE(Class, Base) \ 614 case Type::Class: \ 615 return Instantiate##Class##Type(cast<Class##Type>(T.getTypePtr()), \ 616 T.getCVRQualifiers()); 617#define ABSTRACT_TYPE(Class, Base) 618#include "clang/AST/TypeNodes.def" 619 } 620 621 assert(false && "Not all types have been decoded for instantiation"); 622 return QualType(); 623} 624 625/// \brief Instantiate the type T with a given set of template arguments. 626/// 627/// This routine substitutes the given template arguments into the 628/// type T and produces the instantiated type. 629/// 630/// \param T the type into which the template arguments will be 631/// substituted. If this type is not dependent, it will be returned 632/// immediately. 633/// 634/// \param TemplateArgs the template arguments that will be 635/// substituted for the top-level template parameters within T. 636/// 637/// \param Loc the location in the source code where this substitution 638/// is being performed. It will typically be the location of the 639/// declarator (if we're instantiating the type of some declaration) 640/// or the location of the type in the source code (if, e.g., we're 641/// instantiating the type of a cast expression). 642/// 643/// \param Entity the name of the entity associated with a declaration 644/// being instantiated (if any). May be empty to indicate that there 645/// is no such entity (if, e.g., this is a type that occurs as part of 646/// a cast expression) or that the entity has no name (e.g., an 647/// unnamed function parameter). 648/// 649/// \returns If the instantiation succeeds, the instantiated 650/// type. Otherwise, produces diagnostics and returns a NULL type. 651QualType Sema::InstantiateType(QualType T, 652 const TemplateArgumentList &TemplateArgs, 653 SourceLocation Loc, DeclarationName Entity) { 654 assert(!ActiveTemplateInstantiations.empty() && 655 "Cannot perform an instantiation without some context on the " 656 "instantiation stack"); 657 658 // If T is not a dependent type, there is nothing to do. 659 if (!T->isDependentType()) 660 return T; 661 662 TemplateTypeInstantiator Instantiator(*this, TemplateArgs, Loc, Entity); 663 return Instantiator(T); 664} 665 666/// \brief Instantiate the base class specifiers of the given class 667/// template specialization. 668/// 669/// Produces a diagnostic and returns true on error, returns false and 670/// attaches the instantiated base classes to the class template 671/// specialization if successful. 672bool 673Sema::InstantiateBaseSpecifiers(CXXRecordDecl *Instantiation, 674 CXXRecordDecl *Pattern, 675 const TemplateArgumentList &TemplateArgs) { 676 bool Invalid = false; 677 llvm::SmallVector<CXXBaseSpecifier*, 4> InstantiatedBases; 678 for (ClassTemplateSpecializationDecl::base_class_iterator 679 Base = Pattern->bases_begin(), BaseEnd = Pattern->bases_end(); 680 Base != BaseEnd; ++Base) { 681 if (!Base->getType()->isDependentType()) { 682 // FIXME: Allocate via ASTContext 683 InstantiatedBases.push_back(new CXXBaseSpecifier(*Base)); 684 continue; 685 } 686 687 QualType BaseType = InstantiateType(Base->getType(), 688 TemplateArgs, 689 Base->getSourceRange().getBegin(), 690 DeclarationName()); 691 if (BaseType.isNull()) { 692 Invalid = true; 693 continue; 694 } 695 696 if (CXXBaseSpecifier *InstantiatedBase 697 = CheckBaseSpecifier(Instantiation, 698 Base->getSourceRange(), 699 Base->isVirtual(), 700 Base->getAccessSpecifierAsWritten(), 701 BaseType, 702 /*FIXME: Not totally accurate */ 703 Base->getSourceRange().getBegin())) 704 InstantiatedBases.push_back(InstantiatedBase); 705 else 706 Invalid = true; 707 } 708 709 if (!Invalid && 710 AttachBaseSpecifiers(Instantiation, InstantiatedBases.data(), 711 InstantiatedBases.size())) 712 Invalid = true; 713 714 return Invalid; 715} 716 717/// \brief Instantiate the definition of a class from a given pattern. 718/// 719/// \param PointOfInstantiation The point of instantiation within the 720/// source code. 721/// 722/// \param Instantiation is the declaration whose definition is being 723/// instantiated. This will be either a class template specialization 724/// or a member class of a class template specialization. 725/// 726/// \param Pattern is the pattern from which the instantiation 727/// occurs. This will be either the declaration of a class template or 728/// the declaration of a member class of a class template. 729/// 730/// \param TemplateArgs The template arguments to be substituted into 731/// the pattern. 732/// 733/// \returns true if an error occurred, false otherwise. 734bool 735Sema::InstantiateClass(SourceLocation PointOfInstantiation, 736 CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, 737 const TemplateArgumentList &TemplateArgs, 738 bool ExplicitInstantiation) { 739 bool Invalid = false; 740 741 CXXRecordDecl *PatternDef 742 = cast_or_null<CXXRecordDecl>(Pattern->getDefinition(Context)); 743 if (!PatternDef) { 744 if (Pattern == Instantiation->getInstantiatedFromMemberClass()) { 745 Diag(PointOfInstantiation, 746 diag::err_implicit_instantiate_member_undefined) 747 << Context.getTypeDeclType(Instantiation); 748 Diag(Pattern->getLocation(), diag::note_member_of_template_here); 749 } else { 750 Diag(PointOfInstantiation, diag::err_template_instantiate_undefined) 751 << ExplicitInstantiation 752 << Context.getTypeDeclType(Instantiation); 753 Diag(Pattern->getLocation(), diag::note_template_decl_here); 754 } 755 return true; 756 } 757 Pattern = PatternDef; 758 759 InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation); 760 if (Inst) 761 return true; 762 763 // Enter the scope of this instantiation. We don't use 764 // PushDeclContext because we don't have a scope. 765 DeclContext *PreviousContext = CurContext; 766 CurContext = Instantiation; 767 768 // Start the definition of this instantiation. 769 Instantiation->startDefinition(); 770 771 // Instantiate the base class specifiers. 772 if (InstantiateBaseSpecifiers(Instantiation, Pattern, TemplateArgs)) 773 Invalid = true; 774 775 llvm::SmallVector<DeclPtrTy, 4> Fields; 776 for (RecordDecl::decl_iterator Member = Pattern->decls_begin(Context), 777 MemberEnd = Pattern->decls_end(Context); 778 Member != MemberEnd; ++Member) { 779 Decl *NewMember = InstantiateDecl(*Member, Instantiation, TemplateArgs); 780 if (NewMember) { 781 if (NewMember->isInvalidDecl()) 782 Invalid = true; 783 else if (FieldDecl *Field = dyn_cast<FieldDecl>(NewMember)) 784 Fields.push_back(DeclPtrTy::make(Field)); 785 } else { 786 // FIXME: Eventually, a NULL return will mean that one of the 787 // instantiations was a semantic disaster, and we'll want to set Invalid = 788 // true. For now, we expect to skip some members that we can't yet handle. 789 } 790 } 791 792 // Finish checking fields. 793 ActOnFields(0, Instantiation->getLocation(), DeclPtrTy::make(Instantiation), 794 Fields.data(), Fields.size(), SourceLocation(), SourceLocation(), 795 0); 796 797 // Add any implicitly-declared members that we might need. 798 AddImplicitlyDeclaredMembersToClass(Instantiation); 799 800 // Exit the scope of this instantiation. 801 CurContext = PreviousContext; 802 803 if (!Invalid) 804 Consumer.HandleTagDeclDefinition(Instantiation); 805 806 // If this is an explicit instantiation, instantiate our members, too. 807 if (!Invalid && ExplicitInstantiation) { 808 Inst.Clear(); 809 InstantiateClassMembers(PointOfInstantiation, Instantiation, TemplateArgs); 810 } 811 812 return Invalid; 813} 814 815bool 816Sema::InstantiateClassTemplateSpecialization( 817 ClassTemplateSpecializationDecl *ClassTemplateSpec, 818 bool ExplicitInstantiation) { 819 // Perform the actual instantiation on the canonical declaration. 820 ClassTemplateSpec = cast<ClassTemplateSpecializationDecl>( 821 Context.getCanonicalDecl(ClassTemplateSpec)); 822 823 // We can only instantiate something that hasn't already been 824 // instantiated or specialized. Fail without any diagnostics: our 825 // caller will provide an error message. 826 if (ClassTemplateSpec->getSpecializationKind() != TSK_Undeclared) 827 return true; 828 829 ClassTemplateDecl *Template = ClassTemplateSpec->getSpecializedTemplate(); 830 CXXRecordDecl *Pattern = Template->getTemplatedDecl(); 831 const TemplateArgumentList *TemplateArgs 832 = &ClassTemplateSpec->getTemplateArgs(); 833 834 // Determine whether any class template partial specializations 835 // match the given template arguments. 836 llvm::SmallVector<ClassTemplatePartialSpecializationDecl *, 4> Matched; 837 for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 838 Partial = Template->getPartialSpecializations().begin(), 839 PartialEnd = Template->getPartialSpecializations().end(); 840 Partial != PartialEnd; 841 ++Partial) { 842 if (DeduceTemplateArguments(&*Partial, ClassTemplateSpec->getTemplateArgs())) 843 Matched.push_back(&*Partial); 844 } 845 846 if (Matched.size() == 1) { 847 Pattern = Matched[0]; 848 // FIXME: set TemplateArgs to the template arguments of the 849 // partial specialization, instantiated with the deduced template 850 // arguments. 851 } else if (Matched.size() > 1) { 852 // FIXME: Implement partial ordering of class template partial 853 // specializations. 854 Diag(ClassTemplateSpec->getLocation(), 855 diag::unsup_template_partial_spec_ordering); 856 } 857 858 // Note that this is an instantiation. 859 ClassTemplateSpec->setSpecializationKind( 860 ExplicitInstantiation? TSK_ExplicitInstantiation 861 : TSK_ImplicitInstantiation); 862 863 return InstantiateClass(ClassTemplateSpec->getLocation(), 864 ClassTemplateSpec, Pattern, *TemplateArgs, 865 ExplicitInstantiation); 866} 867 868/// \brief Instantiate the definitions of all of the member of the 869/// given class, which is an instantiation of a class template or a 870/// member class of a template. 871void 872Sema::InstantiateClassMembers(SourceLocation PointOfInstantiation, 873 CXXRecordDecl *Instantiation, 874 const TemplateArgumentList &TemplateArgs) { 875 for (DeclContext::decl_iterator D = Instantiation->decls_begin(Context), 876 DEnd = Instantiation->decls_end(Context); 877 D != DEnd; ++D) { 878 if (FunctionDecl *Function = dyn_cast<FunctionDecl>(*D)) { 879 if (!Function->getBody(Context)) 880 InstantiateFunctionDefinition(PointOfInstantiation, Function); 881 } else if (VarDecl *Var = dyn_cast<VarDecl>(*D)) { 882 const VarDecl *Def = 0; 883 if (!Var->getDefinition(Def)) 884 InstantiateVariableDefinition(Var); 885 } else if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(*D)) { 886 if (!Record->isInjectedClassName() && !Record->getDefinition(Context)) { 887 assert(Record->getInstantiatedFromMemberClass() && 888 "Missing instantiated-from-template information"); 889 InstantiateClass(PointOfInstantiation, Record, 890 Record->getInstantiatedFromMemberClass(), 891 TemplateArgs, true); 892 } 893 } 894 } 895} 896 897/// \brief Instantiate the definitions of all of the members of the 898/// given class template specialization, which was named as part of an 899/// explicit instantiation. 900void Sema::InstantiateClassTemplateSpecializationMembers( 901 SourceLocation PointOfInstantiation, 902 ClassTemplateSpecializationDecl *ClassTemplateSpec) { 903 // C++0x [temp.explicit]p7: 904 // An explicit instantiation that names a class template 905 // specialization is an explicit instantion of the same kind 906 // (declaration or definition) of each of its members (not 907 // including members inherited from base classes) that has not 908 // been previously explicitly specialized in the translation unit 909 // containing the explicit instantiation, except as described 910 // below. 911 InstantiateClassMembers(PointOfInstantiation, ClassTemplateSpec, 912 ClassTemplateSpec->getTemplateArgs()); 913} 914 915/// \brief Instantiate a nested-name-specifier. 916NestedNameSpecifier * 917Sema::InstantiateNestedNameSpecifier(NestedNameSpecifier *NNS, 918 SourceRange Range, 919 const TemplateArgumentList &TemplateArgs) { 920 // Instantiate the prefix of this nested name specifier. 921 NestedNameSpecifier *Prefix = NNS->getPrefix(); 922 if (Prefix) { 923 Prefix = InstantiateNestedNameSpecifier(Prefix, Range, TemplateArgs); 924 if (!Prefix) 925 return 0; 926 } 927 928 switch (NNS->getKind()) { 929 case NestedNameSpecifier::Identifier: { 930 assert(Prefix && 931 "Can't have an identifier nested-name-specifier with no prefix"); 932 CXXScopeSpec SS; 933 // FIXME: The source location information is all wrong. 934 SS.setRange(Range); 935 SS.setScopeRep(Prefix); 936 return static_cast<NestedNameSpecifier *>( 937 ActOnCXXNestedNameSpecifier(0, SS, 938 Range.getEnd(), 939 Range.getEnd(), 940 *NNS->getAsIdentifier())); 941 break; 942 } 943 944 case NestedNameSpecifier::Namespace: 945 case NestedNameSpecifier::Global: 946 return NNS; 947 948 case NestedNameSpecifier::TypeSpecWithTemplate: 949 case NestedNameSpecifier::TypeSpec: { 950 QualType T = QualType(NNS->getAsType(), 0); 951 if (!T->isDependentType()) 952 return NNS; 953 954 T = InstantiateType(T, TemplateArgs, Range.getBegin(), DeclarationName()); 955 if (T.isNull()) 956 return 0; 957 958 if (T->isRecordType() || 959 (getLangOptions().CPlusPlus0x && T->isEnumeralType())) { 960 assert(T.getCVRQualifiers() == 0 && "Can't get cv-qualifiers here"); 961 return NestedNameSpecifier::Create(Context, Prefix, 962 NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 963 T.getTypePtr()); 964 } 965 966 Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T; 967 return 0; 968 } 969 } 970 971 // Required to silence a GCC warning 972 return 0; 973} 974 975TemplateName 976Sema::InstantiateTemplateName(TemplateName Name, SourceLocation Loc, 977 const TemplateArgumentList &TemplateArgs) { 978 if (TemplateTemplateParmDecl *TTP 979 = dyn_cast_or_null<TemplateTemplateParmDecl>( 980 Name.getAsTemplateDecl())) { 981 assert(TTP->getDepth() == 0 && 982 "Cannot reduce depth of a template template parameter"); 983 assert(TemplateArgs[TTP->getPosition()].getAsDecl() && 984 "Wrong kind of template template argument"); 985 ClassTemplateDecl *ClassTemplate 986 = dyn_cast<ClassTemplateDecl>( 987 TemplateArgs[TTP->getPosition()].getAsDecl()); 988 assert(ClassTemplate && "Expected a class template"); 989 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 990 NestedNameSpecifier *NNS 991 = InstantiateNestedNameSpecifier(QTN->getQualifier(), 992 /*FIXME=*/SourceRange(Loc), 993 TemplateArgs); 994 if (NNS) 995 return Context.getQualifiedTemplateName(NNS, 996 QTN->hasTemplateKeyword(), 997 ClassTemplate); 998 } 999 1000 return TemplateName(ClassTemplate); 1001 } else if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 1002 NestedNameSpecifier *NNS 1003 = InstantiateNestedNameSpecifier(DTN->getQualifier(), 1004 /*FIXME=*/SourceRange(Loc), 1005 TemplateArgs); 1006 1007 if (!NNS) // FIXME: Not the best recovery strategy. 1008 return Name; 1009 1010 if (NNS->isDependent()) 1011 return Context.getDependentTemplateName(NNS, DTN->getName()); 1012 1013 // Somewhat redundant with ActOnDependentTemplateName. 1014 CXXScopeSpec SS; 1015 SS.setRange(SourceRange(Loc)); 1016 SS.setScopeRep(NNS); 1017 TemplateTy Template; 1018 TemplateNameKind TNK = isTemplateName(*DTN->getName(), 0, Template, &SS); 1019 if (TNK == TNK_Non_template) { 1020 Diag(Loc, diag::err_template_kw_refers_to_non_template) 1021 << DTN->getName(); 1022 return Name; 1023 } else if (TNK == TNK_Function_template) { 1024 Diag(Loc, diag::err_template_kw_refers_to_non_template) 1025 << DTN->getName(); 1026 return Name; 1027 } 1028 1029 return Template.getAsVal<TemplateName>(); 1030 } 1031 1032 1033 1034 // FIXME: Even if we're referring to a Decl that isn't a template template 1035 // parameter, we may need to instantiate the outer contexts of that 1036 // Decl. However, this won't be needed until we implement member templates. 1037 return Name; 1038} 1039