SemaTemplateInstantiate.cpp revision ab452ba8323d1985e08bade2bced588cddf2cc28
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/ASTContext.h" 15#include "clang/AST/Expr.h" 16#include "clang/AST/DeclTemplate.h" 17#include "clang/Parse/DeclSpec.h" 18#include "clang/Basic/LangOptions.h" 19#include "llvm/Support/Compiler.h" 20 21using namespace clang; 22 23//===----------------------------------------------------------------------===/ 24// Template Instantiation Support 25//===----------------------------------------------------------------------===/ 26 27Sema::InstantiatingTemplate:: 28InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, 29 CXXRecordDecl *Entity, 30 SourceRange InstantiationRange) 31 : SemaRef(SemaRef) { 32 33 Invalid = CheckInstantiationDepth(PointOfInstantiation, 34 InstantiationRange); 35 if (!Invalid) { 36 ActiveTemplateInstantiation Inst; 37 Inst.Kind = ActiveTemplateInstantiation::TemplateInstantiation; 38 Inst.PointOfInstantiation = PointOfInstantiation; 39 Inst.Entity = reinterpret_cast<uintptr_t>(Entity); 40 Inst.TemplateArgs = 0; 41 Inst.NumTemplateArgs = 0; 42 Inst.InstantiationRange = InstantiationRange; 43 SemaRef.ActiveTemplateInstantiations.push_back(Inst); 44 Invalid = false; 45 } 46} 47 48Sema::InstantiatingTemplate::InstantiatingTemplate(Sema &SemaRef, 49 SourceLocation PointOfInstantiation, 50 TemplateDecl *Template, 51 const TemplateArgument *TemplateArgs, 52 unsigned NumTemplateArgs, 53 SourceRange InstantiationRange) 54 : SemaRef(SemaRef) { 55 56 Invalid = CheckInstantiationDepth(PointOfInstantiation, 57 InstantiationRange); 58 if (!Invalid) { 59 ActiveTemplateInstantiation Inst; 60 Inst.Kind 61 = ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation; 62 Inst.PointOfInstantiation = PointOfInstantiation; 63 Inst.Entity = reinterpret_cast<uintptr_t>(Template); 64 Inst.TemplateArgs = TemplateArgs; 65 Inst.NumTemplateArgs = NumTemplateArgs; 66 Inst.InstantiationRange = InstantiationRange; 67 SemaRef.ActiveTemplateInstantiations.push_back(Inst); 68 Invalid = false; 69 } 70} 71 72Sema::InstantiatingTemplate::~InstantiatingTemplate() { 73 if (!Invalid) 74 SemaRef.ActiveTemplateInstantiations.pop_back(); 75} 76 77bool Sema::InstantiatingTemplate::CheckInstantiationDepth( 78 SourceLocation PointOfInstantiation, 79 SourceRange InstantiationRange) { 80 if (SemaRef.ActiveTemplateInstantiations.size() 81 <= SemaRef.getLangOptions().InstantiationDepth) 82 return false; 83 84 SemaRef.Diag(PointOfInstantiation, 85 diag::err_template_recursion_depth_exceeded) 86 << SemaRef.getLangOptions().InstantiationDepth 87 << InstantiationRange; 88 SemaRef.Diag(PointOfInstantiation, diag::note_template_recursion_depth) 89 << SemaRef.getLangOptions().InstantiationDepth; 90 return true; 91} 92 93/// \brief Prints the current instantiation stack through a series of 94/// notes. 95void Sema::PrintInstantiationStack() { 96 for (llvm::SmallVector<ActiveTemplateInstantiation, 16>::reverse_iterator 97 Active = ActiveTemplateInstantiations.rbegin(), 98 ActiveEnd = ActiveTemplateInstantiations.rend(); 99 Active != ActiveEnd; 100 ++Active) { 101 switch (Active->Kind) { 102 case ActiveTemplateInstantiation::TemplateInstantiation: { 103 unsigned DiagID = diag::note_template_member_class_here; 104 CXXRecordDecl *Record = (CXXRecordDecl *)Active->Entity; 105 if (isa<ClassTemplateSpecializationDecl>(Record)) 106 DiagID = diag::note_template_class_instantiation_here; 107 Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr), 108 DiagID) 109 << Context.getTypeDeclType(Record) 110 << Active->InstantiationRange; 111 break; 112 } 113 114 case ActiveTemplateInstantiation::DefaultTemplateArgumentInstantiation: { 115 TemplateDecl *Template = cast<TemplateDecl>((Decl *)Active->Entity); 116 std::string TemplateArgsStr 117 = ClassTemplateSpecializationType::PrintTemplateArgumentList( 118 Active->TemplateArgs, 119 Active->NumTemplateArgs); 120 Diags.Report(FullSourceLoc(Active->PointOfInstantiation, SourceMgr), 121 diag::note_default_arg_instantiation_here) 122 << (Template->getNameAsString() + TemplateArgsStr) 123 << Active->InstantiationRange; 124 break; 125 } 126 } 127 } 128} 129 130//===----------------------------------------------------------------------===/ 131// Template Instantiation for Types 132//===----------------------------------------------------------------------===/ 133namespace { 134 class VISIBILITY_HIDDEN TemplateTypeInstantiator { 135 Sema &SemaRef; 136 const TemplateArgument *TemplateArgs; 137 unsigned NumTemplateArgs; 138 SourceLocation Loc; 139 DeclarationName Entity; 140 141 public: 142 TemplateTypeInstantiator(Sema &SemaRef, 143 const TemplateArgument *TemplateArgs, 144 unsigned NumTemplateArgs, 145 SourceLocation Loc, 146 DeclarationName Entity) 147 : SemaRef(SemaRef), TemplateArgs(TemplateArgs), 148 NumTemplateArgs(NumTemplateArgs), Loc(Loc), Entity(Entity) { } 149 150 QualType operator()(QualType T) const { return Instantiate(T); } 151 152 QualType Instantiate(QualType T) const; 153 154 // Declare instantiate functions for each type. 155#define TYPE(Class, Base) \ 156 QualType Instantiate##Class##Type(const Class##Type *T, \ 157 unsigned Quals) const; 158#define ABSTRACT_TYPE(Class, Base) 159#include "clang/AST/TypeNodes.def" 160 }; 161} 162 163QualType 164TemplateTypeInstantiator::InstantiateExtQualType(const ExtQualType *T, 165 unsigned Quals) const { 166 // FIXME: Implement this 167 assert(false && "Cannot instantiate ExtQualType yet"); 168 return QualType(); 169} 170 171QualType 172TemplateTypeInstantiator::InstantiateBuiltinType(const BuiltinType *T, 173 unsigned Quals) const { 174 assert(false && "Builtin types are not dependent and cannot be instantiated"); 175 return QualType(T, Quals); 176} 177 178QualType 179TemplateTypeInstantiator:: 180InstantiateFixedWidthIntType(const FixedWidthIntType *T, unsigned Quals) const { 181 // FIXME: Implement this 182 assert(false && "Cannot instantiate FixedWidthIntType yet"); 183 return QualType(); 184} 185 186QualType 187TemplateTypeInstantiator::InstantiateComplexType(const ComplexType *T, 188 unsigned Quals) const { 189 // FIXME: Implement this 190 assert(false && "Cannot instantiate ComplexType yet"); 191 return QualType(); 192} 193 194QualType 195TemplateTypeInstantiator::InstantiatePointerType(const PointerType *T, 196 unsigned Quals) const { 197 QualType PointeeType = Instantiate(T->getPointeeType()); 198 if (PointeeType.isNull()) 199 return QualType(); 200 201 return SemaRef.BuildPointerType(PointeeType, Quals, Loc, Entity); 202} 203 204QualType 205TemplateTypeInstantiator::InstantiateBlockPointerType(const BlockPointerType *T, 206 unsigned Quals) const { 207 // FIXME: Implement this 208 assert(false && "Cannot instantiate BlockPointerType yet"); 209 return QualType(); 210} 211 212QualType 213TemplateTypeInstantiator::InstantiateLValueReferenceType( 214 const LValueReferenceType *T, unsigned Quals) const { 215 QualType ReferentType = Instantiate(T->getPointeeType()); 216 if (ReferentType.isNull()) 217 return QualType(); 218 219 return SemaRef.BuildReferenceType(ReferentType, true, Quals, Loc, Entity); 220} 221 222QualType 223TemplateTypeInstantiator::InstantiateRValueReferenceType( 224 const RValueReferenceType *T, unsigned Quals) const { 225 QualType ReferentType = Instantiate(T->getPointeeType()); 226 if (ReferentType.isNull()) 227 return QualType(); 228 229 return SemaRef.BuildReferenceType(ReferentType, false, Quals, Loc, Entity); 230} 231 232QualType 233TemplateTypeInstantiator:: 234InstantiateMemberPointerType(const MemberPointerType *T, 235 unsigned Quals) const { 236 // FIXME: Implement this 237 assert(false && "Cannot instantiate MemberPointerType yet"); 238 return QualType(); 239} 240 241QualType 242TemplateTypeInstantiator:: 243InstantiateConstantArrayType(const ConstantArrayType *T, 244 unsigned Quals) const { 245 QualType ElementType = Instantiate(T->getElementType()); 246 if (ElementType.isNull()) 247 return ElementType; 248 249 // Build a temporary integer literal to specify the size for 250 // BuildArrayType. Since we have already checked the size as part of 251 // creating the dependent array type in the first place, we know 252 // there aren't any errors. 253 // FIXME: Is IntTy big enough? Maybe not, but LongLongTy causes 254 // problems that I have yet to investigate. 255 IntegerLiteral ArraySize(T->getSize(), SemaRef.Context.IntTy, Loc); 256 return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(), 257 &ArraySize, T->getIndexTypeQualifier(), 258 Loc, Entity); 259} 260 261QualType 262TemplateTypeInstantiator:: 263InstantiateIncompleteArrayType(const IncompleteArrayType *T, 264 unsigned Quals) const { 265 QualType ElementType = Instantiate(T->getElementType()); 266 if (ElementType.isNull()) 267 return ElementType; 268 269 return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(), 270 0, T->getIndexTypeQualifier(), 271 Loc, Entity); 272} 273 274QualType 275TemplateTypeInstantiator:: 276InstantiateVariableArrayType(const VariableArrayType *T, 277 unsigned Quals) const { 278 // FIXME: Implement this 279 assert(false && "Cannot instantiate VariableArrayType yet"); 280 return QualType(); 281} 282 283QualType 284TemplateTypeInstantiator:: 285InstantiateDependentSizedArrayType(const DependentSizedArrayType *T, 286 unsigned Quals) const { 287 Expr *ArraySize = T->getSizeExpr(); 288 assert(ArraySize->isValueDependent() && 289 "dependent sized array types must have value dependent size expr"); 290 291 // Instantiate the element type if needed 292 QualType ElementType = T->getElementType(); 293 if (ElementType->isDependentType()) { 294 ElementType = Instantiate(ElementType); 295 if (ElementType.isNull()) 296 return QualType(); 297 } 298 299 // Instantiate the size expression 300 Sema::OwningExprResult InstantiatedArraySize = 301 SemaRef.InstantiateExpr(ArraySize, TemplateArgs, NumTemplateArgs); 302 if (InstantiatedArraySize.isInvalid()) 303 return QualType(); 304 305 return SemaRef.BuildArrayType(ElementType, T->getSizeModifier(), 306 (Expr *)InstantiatedArraySize.release(), 307 T->getIndexTypeQualifier(), Loc, Entity); 308} 309 310QualType 311TemplateTypeInstantiator::InstantiateVectorType(const VectorType *T, 312 unsigned Quals) const { 313 // FIXME: Implement this 314 assert(false && "Cannot instantiate VectorType yet"); 315 return QualType(); 316} 317 318QualType 319TemplateTypeInstantiator::InstantiateExtVectorType(const ExtVectorType *T, 320 unsigned Quals) const { 321 // FIXME: Implement this 322 assert(false && "Cannot instantiate ExtVectorType yet"); 323 return QualType(); 324} 325 326QualType 327TemplateTypeInstantiator:: 328InstantiateFunctionProtoType(const FunctionProtoType *T, 329 unsigned Quals) const { 330 QualType ResultType = Instantiate(T->getResultType()); 331 if (ResultType.isNull()) 332 return ResultType; 333 334 llvm::SmallVector<QualType, 16> ParamTypes; 335 for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(), 336 ParamEnd = T->arg_type_end(); 337 Param != ParamEnd; ++Param) { 338 QualType P = Instantiate(*Param); 339 if (P.isNull()) 340 return P; 341 342 ParamTypes.push_back(P); 343 } 344 345 return SemaRef.BuildFunctionType(ResultType, &ParamTypes[0], 346 ParamTypes.size(), 347 T->isVariadic(), T->getTypeQuals(), 348 Loc, Entity); 349} 350 351QualType 352TemplateTypeInstantiator:: 353InstantiateFunctionNoProtoType(const FunctionNoProtoType *T, 354 unsigned Quals) const { 355 assert(false && "Functions without prototypes cannot be dependent."); 356 return QualType(); 357} 358 359QualType 360TemplateTypeInstantiator::InstantiateTypedefType(const TypedefType *T, 361 unsigned Quals) const { 362 // FIXME: Implement this 363 assert(false && "Cannot instantiate TypedefType yet"); 364 return QualType(); 365} 366 367QualType 368TemplateTypeInstantiator::InstantiateTypeOfExprType(const TypeOfExprType *T, 369 unsigned Quals) const { 370 // FIXME: Implement this 371 assert(false && "Cannot instantiate TypeOfExprType yet"); 372 return QualType(); 373} 374 375QualType 376TemplateTypeInstantiator::InstantiateTypeOfType(const TypeOfType *T, 377 unsigned Quals) const { 378 // FIXME: Implement this 379 assert(false && "Cannot instantiate TypeOfType yet"); 380 return QualType(); 381} 382 383QualType 384TemplateTypeInstantiator::InstantiateRecordType(const RecordType *T, 385 unsigned Quals) const { 386 // FIXME: Implement this 387 assert(false && "Cannot instantiate RecordType yet"); 388 return QualType(); 389} 390 391QualType 392TemplateTypeInstantiator::InstantiateEnumType(const EnumType *T, 393 unsigned Quals) const { 394 // FIXME: Implement this 395 assert(false && "Cannot instantiate EnumType yet"); 396 return QualType(); 397} 398 399QualType 400TemplateTypeInstantiator:: 401InstantiateTemplateTypeParmType(const TemplateTypeParmType *T, 402 unsigned Quals) const { 403 if (T->getDepth() == 0) { 404 // Replace the template type parameter with its corresponding 405 // template argument. 406 assert(T->getIndex() < NumTemplateArgs && "Wrong # of template args"); 407 assert(TemplateArgs[T->getIndex()].getKind() == TemplateArgument::Type && 408 "Template argument kind mismatch"); 409 QualType Result = TemplateArgs[T->getIndex()].getAsType(); 410 if (Result.isNull() || !Quals) 411 return Result; 412 413 // C++ [dcl.ref]p1: 414 // [...] Cv-qualified references are ill-formed except when 415 // the cv-qualifiers are introduced through the use of a 416 // typedef (7.1.3) or of a template type argument (14.3), in 417 // which case the cv-qualifiers are ignored. 418 if (Quals && Result->isReferenceType()) 419 Quals = 0; 420 421 return QualType(Result.getTypePtr(), Quals | Result.getCVRQualifiers()); 422 } 423 424 // The template type parameter comes from an inner template (e.g., 425 // the template parameter list of a member template inside the 426 // template we are instantiating). Create a new template type 427 // parameter with the template "level" reduced by one. 428 return SemaRef.Context.getTemplateTypeParmType(T->getDepth() - 1, 429 T->getIndex(), 430 T->getName()) 431 .getQualifiedType(Quals); 432} 433 434QualType 435TemplateTypeInstantiator:: 436InstantiateClassTemplateSpecializationType( 437 const ClassTemplateSpecializationType *T, 438 unsigned Quals) const { 439 llvm::SmallVector<TemplateArgument, 16> InstantiatedTemplateArgs; 440 InstantiatedTemplateArgs.reserve(T->getNumArgs()); 441 for (ClassTemplateSpecializationType::iterator Arg = T->begin(), 442 ArgEnd = T->end(); 443 Arg != ArgEnd; ++Arg) { 444 switch (Arg->getKind()) { 445 case TemplateArgument::Type: { 446 QualType T = SemaRef.InstantiateType(Arg->getAsType(), 447 TemplateArgs, NumTemplateArgs, 448 Arg->getLocation(), 449 DeclarationName()); 450 if (T.isNull()) 451 return QualType(); 452 453 InstantiatedTemplateArgs.push_back( 454 TemplateArgument(Arg->getLocation(), T)); 455 break; 456 } 457 458 case TemplateArgument::Declaration: 459 case TemplateArgument::Integral: 460 InstantiatedTemplateArgs.push_back(*Arg); 461 break; 462 463 case TemplateArgument::Expression: 464 Sema::OwningExprResult E 465 = SemaRef.InstantiateExpr(Arg->getAsExpr(), TemplateArgs, 466 NumTemplateArgs); 467 if (E.isInvalid()) 468 return QualType(); 469 InstantiatedTemplateArgs.push_back((Expr *)E.release()); 470 break; 471 } 472 } 473 474 // FIXME: We're missing the locations of the template name, '<', and 475 // '>'. 476 return SemaRef.CheckClassTemplateId(cast<ClassTemplateDecl>(T->getTemplate()), 477 Loc, 478 SourceLocation(), 479 &InstantiatedTemplateArgs[0], 480 InstantiatedTemplateArgs.size(), 481 SourceLocation()); 482} 483 484QualType 485TemplateTypeInstantiator:: 486InstantiateQualifiedNameType(const QualifiedNameType *T, 487 unsigned Quals) const { 488 assert(false && "Cannot have dependent qualified name types (yet)"); 489 return QualType(); 490} 491 492QualType 493TemplateTypeInstantiator:: 494InstantiateObjCInterfaceType(const ObjCInterfaceType *T, 495 unsigned Quals) const { 496 assert(false && "Objective-C types cannot be dependent"); 497 return QualType(); 498} 499 500QualType 501TemplateTypeInstantiator:: 502InstantiateObjCQualifiedInterfaceType(const ObjCQualifiedInterfaceType *T, 503 unsigned Quals) const { 504 assert(false && "Objective-C types cannot be dependent"); 505 return QualType(); 506} 507 508QualType 509TemplateTypeInstantiator:: 510InstantiateObjCQualifiedIdType(const ObjCQualifiedIdType *T, 511 unsigned Quals) const { 512 assert(false && "Objective-C types cannot be dependent"); 513 return QualType(); 514} 515 516QualType 517TemplateTypeInstantiator:: 518InstantiateObjCQualifiedClassType(const ObjCQualifiedClassType *T, 519 unsigned Quals) const { 520 assert(false && "Objective-C types cannot be dependent"); 521 return QualType(); 522} 523 524/// \brief The actual implementation of Sema::InstantiateType(). 525QualType TemplateTypeInstantiator::Instantiate(QualType T) const { 526 // If T is not a dependent type, there is nothing to do. 527 if (!T->isDependentType()) 528 return T; 529 530 switch (T->getTypeClass()) { 531#define TYPE(Class, Base) \ 532 case Type::Class: \ 533 return Instantiate##Class##Type(cast<Class##Type>(T.getTypePtr()), \ 534 T.getCVRQualifiers()); 535#define ABSTRACT_TYPE(Class, Base) 536#include "clang/AST/TypeNodes.def" 537 } 538 539 assert(false && "Not all types have been decoded for instantiation"); 540 return QualType(); 541} 542 543/// \brief Instantiate the type T with a given set of template arguments. 544/// 545/// This routine substitutes the given template arguments into the 546/// type T and produces the instantiated type. 547/// 548/// \param T the type into which the template arguments will be 549/// substituted. If this type is not dependent, it will be returned 550/// immediately. 551/// 552/// \param TemplateArgs the template arguments that will be 553/// substituted for the top-level template parameters within T. 554/// 555/// \param NumTemplateArgs the number of template arguments provided 556/// by TemplateArgs. 557/// 558/// \param Loc the location in the source code where this substitution 559/// is being performed. It will typically be the location of the 560/// declarator (if we're instantiating the type of some declaration) 561/// or the location of the type in the source code (if, e.g., we're 562/// instantiating the type of a cast expression). 563/// 564/// \param Entity the name of the entity associated with a declaration 565/// being instantiated (if any). May be empty to indicate that there 566/// is no such entity (if, e.g., this is a type that occurs as part of 567/// a cast expression) or that the entity has no name (e.g., an 568/// unnamed function parameter). 569/// 570/// \returns If the instantiation succeeds, the instantiated 571/// type. Otherwise, produces diagnostics and returns a NULL type. 572QualType Sema::InstantiateType(QualType T, 573 const TemplateArgument *TemplateArgs, 574 unsigned NumTemplateArgs, 575 SourceLocation Loc, DeclarationName Entity) { 576 assert(!ActiveTemplateInstantiations.empty() && 577 "Cannot perform an instantiation without some context on the " 578 "instantiation stack"); 579 580 // If T is not a dependent type, there is nothing to do. 581 if (!T->isDependentType()) 582 return T; 583 584 TemplateTypeInstantiator Instantiator(*this, TemplateArgs, NumTemplateArgs, 585 Loc, Entity); 586 return Instantiator(T); 587} 588 589/// \brief Instantiate the base class specifiers of the given class 590/// template specialization. 591/// 592/// Produces a diagnostic and returns true on error, returns false and 593/// attaches the instantiated base classes to the class template 594/// specialization if successful. 595bool 596Sema::InstantiateBaseSpecifiers(CXXRecordDecl *Instantiation, 597 CXXRecordDecl *Pattern, 598 const TemplateArgument *TemplateArgs, 599 unsigned NumTemplateArgs) { 600 bool Invalid = false; 601 llvm::SmallVector<CXXBaseSpecifier*, 8> InstantiatedBases; 602 for (ClassTemplateSpecializationDecl::base_class_iterator 603 Base = Pattern->bases_begin(), BaseEnd = Pattern->bases_end(); 604 Base != BaseEnd; ++Base) { 605 if (!Base->getType()->isDependentType()) { 606 // FIXME: Allocate via ASTContext 607 InstantiatedBases.push_back(new CXXBaseSpecifier(*Base)); 608 continue; 609 } 610 611 QualType BaseType = InstantiateType(Base->getType(), 612 TemplateArgs, NumTemplateArgs, 613 Base->getSourceRange().getBegin(), 614 DeclarationName()); 615 if (BaseType.isNull()) { 616 Invalid = true; 617 continue; 618 } 619 620 if (CXXBaseSpecifier *InstantiatedBase 621 = CheckBaseSpecifier(Instantiation, 622 Base->getSourceRange(), 623 Base->isVirtual(), 624 Base->getAccessSpecifierAsWritten(), 625 BaseType, 626 /*FIXME: Not totally accurate */ 627 Base->getSourceRange().getBegin())) 628 InstantiatedBases.push_back(InstantiatedBase); 629 else 630 Invalid = true; 631 } 632 633 if (!Invalid && 634 AttachBaseSpecifiers(Instantiation, &InstantiatedBases[0], 635 InstantiatedBases.size())) 636 Invalid = true; 637 638 return Invalid; 639} 640 641/// \brief Instantiate the definition of a class from a given pattern. 642/// 643/// \param PointOfInstantiation The point of instantiation within the 644/// source code. 645/// 646/// \param Instantiation is the declaration whose definition is being 647/// instantiated. This will be either a class template specialization 648/// or a member class of a class template specialization. 649/// 650/// \param Pattern is the pattern from which the instantiation 651/// occurs. This will be either the declaration of a class template or 652/// the declaration of a member class of a class template. 653/// 654/// \param TemplateArgs The template arguments to be substituted into 655/// the pattern. 656/// 657/// \param NumTemplateArgs The number of templates arguments in 658/// TemplateArgs. 659/// 660/// \returns true if an error occurred, false otherwise. 661bool 662Sema::InstantiateClass(SourceLocation PointOfInstantiation, 663 CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, 664 const TemplateArgument *TemplateArgs, 665 unsigned NumTemplateArgs) { 666 bool Invalid = false; 667 668 CXXRecordDecl *PatternDef 669 = cast_or_null<CXXRecordDecl>(Pattern->getDefinition(Context)); 670 if (!PatternDef) { 671 if (Pattern == Instantiation->getInstantiatedFromMemberClass()) { 672 Diag(PointOfInstantiation, 673 diag::err_implicit_instantiate_member_undefined) 674 << Context.getTypeDeclType(Instantiation); 675 Diag(Pattern->getLocation(), diag::note_member_of_template_here); 676 } else { 677 Diag(PointOfInstantiation, 678 diag::err_template_implicit_instantiate_undefined) 679 << Context.getTypeDeclType(Instantiation); 680 Diag(Pattern->getLocation(), diag::note_template_decl_here); 681 } 682 return true; 683 } 684 Pattern = PatternDef; 685 686 InstantiatingTemplate Inst(*this, PointOfInstantiation, Instantiation); 687 if (Inst) 688 return true; 689 690 // Enter the scope of this instantiation. We don't use 691 // PushDeclContext because we don't have a scope. 692 DeclContext *PreviousContext = CurContext; 693 CurContext = Instantiation; 694 695 // Start the definition of this instantiation. 696 Instantiation->startDefinition(); 697 698 // Instantiate the base class specifiers. 699 if (InstantiateBaseSpecifiers(Instantiation, Pattern, TemplateArgs, 700 NumTemplateArgs)) 701 Invalid = true; 702 703 llvm::SmallVector<DeclTy *, 32> Fields; 704 for (RecordDecl::decl_iterator Member = Pattern->decls_begin(), 705 MemberEnd = Pattern->decls_end(); 706 Member != MemberEnd; ++Member) { 707 Decl *NewMember = InstantiateDecl(*Member, Instantiation, 708 TemplateArgs, NumTemplateArgs); 709 if (NewMember) { 710 if (NewMember->isInvalidDecl()) 711 Invalid = true; 712 else if (FieldDecl *Field = dyn_cast<FieldDecl>(NewMember)) 713 Fields.push_back(Field); 714 } else { 715 // FIXME: Eventually, a NULL return will mean that one of the 716 // instantiations was a semantic disaster, and we'll want to set 717 // Invalid = true. For now, we expect to skip some members that 718 // we can't yet handle. 719 } 720 } 721 722 // Finish checking fields. 723 ActOnFields(0, Instantiation->getLocation(), Instantiation, 724 &Fields[0], Fields.size(), SourceLocation(), SourceLocation(), 725 0); 726 727 // Add any implicitly-declared members that we might need. 728 AddImplicitlyDeclaredMembersToClass(Instantiation); 729 730 // Exit the scope of this instantiation. 731 CurContext = PreviousContext; 732 733 return Invalid; 734} 735 736bool 737Sema::InstantiateClassTemplateSpecialization( 738 ClassTemplateSpecializationDecl *ClassTemplateSpec, 739 bool ExplicitInstantiation) { 740 // Perform the actual instantiation on the canonical declaration. 741 ClassTemplateSpec = cast<ClassTemplateSpecializationDecl>( 742 Context.getCanonicalDecl(ClassTemplateSpec)); 743 744 // We can only instantiate something that hasn't already been 745 // instantiated or specialized. Fail without any diagnostics: our 746 // caller will provide an error message. 747 if (ClassTemplateSpec->getSpecializationKind() != TSK_Undeclared) 748 return true; 749 750 // FIXME: Push this class template instantiation onto the 751 // instantiation stack, checking for recursion that exceeds a 752 // certain depth. 753 754 // FIXME: Perform class template partial specialization to select 755 // the best template. 756 ClassTemplateDecl *Template = ClassTemplateSpec->getSpecializedTemplate(); 757 758 CXXRecordDecl *Pattern = Template->getTemplatedDecl(); 759 760 // Note that this is an instantiation. 761 ClassTemplateSpec->setSpecializationKind( 762 ExplicitInstantiation? TSK_ExplicitInstantiation 763 : TSK_ImplicitInstantiation); 764 765 return InstantiateClass(ClassTemplateSpec->getLocation(), 766 ClassTemplateSpec, Pattern, 767 ClassTemplateSpec->getTemplateArgs(), 768 ClassTemplateSpec->getNumTemplateArgs()); 769} 770 771/// \brief Instantiate a nested-name-specifier. 772NestedNameSpecifier * 773Sema::InstantiateNestedNameSpecifier(NestedNameSpecifier *NNS, 774 SourceRange Range, 775 const TemplateArgument *TemplateArgs, 776 unsigned NumTemplateArgs) { 777 // Instantiate the prefix of this nested name specifier. 778 NestedNameSpecifier *Prefix = NNS->getPrefix(); 779 if (Prefix) { 780 Prefix = InstantiateNestedNameSpecifier(Prefix, Range, TemplateArgs, 781 NumTemplateArgs); 782 if (!Prefix) 783 return 0; 784 } 785 786 switch (NNS->getKind()) { 787 case NestedNameSpecifier::Identifier: 788 // FIXME: Implement this lookup! 789 assert(false && "Cannot instantiate this nested-name-specifier"); 790 break; 791 792 case NestedNameSpecifier::Namespace: 793 case NestedNameSpecifier::Global: 794 return NNS; 795 796 case NestedNameSpecifier::TypeSpecWithTemplate: 797 case NestedNameSpecifier::TypeSpec: { 798 QualType T = QualType(NNS->getAsType(), 0); 799 if (!T->isDependentType()) 800 return NNS; 801 802 T = InstantiateType(T, TemplateArgs, NumTemplateArgs, Range.getBegin(), 803 DeclarationName()); 804 if (T.isNull()) 805 return 0; 806 807 // Note that T.getTypePtr(), below, strips cv-qualifiers. This is 808 // perfectly reasonable, since cv-qualified types in 809 // nested-name-specifiers don't matter. 810 // FIXME: we need to perform more checking on this type. 811 return NestedNameSpecifier::Create(Context, Prefix, 812 NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 813 T.getTypePtr()); 814 } 815 } 816 817 // Required to silence GCC warning. 818 return 0; 819} 820