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