SemaTemplateVariadic.cpp revision 88530d5e138f36ea80a7d70c14f37095b8eba85b
1//===------- SemaTemplateVariadic.cpp - C++ Variadic Templates ------------===/ 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 semantic analysis for C++0x variadic templates. 10//===----------------------------------------------------------------------===/ 11 12#include "clang/Sema/Sema.h" 13#include "clang/Sema/Lookup.h" 14#include "clang/Sema/ParsedTemplate.h" 15#include "clang/Sema/SemaInternal.h" 16#include "clang/Sema/Template.h" 17#include "clang/AST/Expr.h" 18#include "clang/AST/RecursiveASTVisitor.h" 19#include "clang/AST/TypeLoc.h" 20 21using namespace clang; 22 23//---------------------------------------------------------------------------- 24// Visitor that collects unexpanded parameter packs 25//---------------------------------------------------------------------------- 26 27namespace { 28 /// \brief A class that collects unexpanded parameter packs. 29 class CollectUnexpandedParameterPacksVisitor : 30 public RecursiveASTVisitor<CollectUnexpandedParameterPacksVisitor> 31 { 32 typedef RecursiveASTVisitor<CollectUnexpandedParameterPacksVisitor> 33 inherited; 34 35 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded; 36 37 public: 38 explicit CollectUnexpandedParameterPacksVisitor( 39 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) 40 : Unexpanded(Unexpanded) { } 41 42 bool shouldWalkTypesOfTypeLocs() const { return false; } 43 44 //------------------------------------------------------------------------ 45 // Recording occurrences of (unexpanded) parameter packs. 46 //------------------------------------------------------------------------ 47 48 /// \brief Record occurrences of template type parameter packs. 49 bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 50 if (TL.getTypePtr()->isParameterPack()) 51 Unexpanded.push_back(std::make_pair(TL.getTypePtr(), TL.getNameLoc())); 52 return true; 53 } 54 55 /// \brief Record occurrences of template type parameter packs 56 /// when we don't have proper source-location information for 57 /// them. 58 /// 59 /// Ideally, this routine would never be used. 60 bool VisitTemplateTypeParmType(TemplateTypeParmType *T) { 61 if (T->isParameterPack()) 62 Unexpanded.push_back(std::make_pair(T, SourceLocation())); 63 64 return true; 65 } 66 67 /// \brief Record occurrences of function and non-type template 68 /// parameter packs in an expression. 69 bool VisitDeclRefExpr(DeclRefExpr *E) { 70 if (E->getDecl()->isParameterPack()) 71 Unexpanded.push_back(std::make_pair(E->getDecl(), E->getLocation())); 72 73 return true; 74 } 75 76 // \brief Record occurrences of function and non-type template parameter 77 // packs in a block-captured expression. 78 bool VisitBlockDeclRefExpr(BlockDeclRefExpr *E) { 79 if (E->getDecl()->isParameterPack()) 80 Unexpanded.push_back(std::make_pair(E->getDecl(), E->getLocation())); 81 82 return true; 83 } 84 85 /// \brief Record occurrences of template template parameter packs. 86 bool TraverseTemplateName(TemplateName Template) { 87 if (TemplateTemplateParmDecl *TTP 88 = dyn_cast_or_null<TemplateTemplateParmDecl>( 89 Template.getAsTemplateDecl())) 90 if (TTP->isParameterPack()) 91 Unexpanded.push_back(std::make_pair(TTP, SourceLocation())); 92 93 return inherited::TraverseTemplateName(Template); 94 } 95 96 //------------------------------------------------------------------------ 97 // Pruning the search for unexpanded parameter packs. 98 //------------------------------------------------------------------------ 99 100 /// \brief Suppress traversal into statements and expressions that 101 /// do not contain unexpanded parameter packs. 102 bool TraverseStmt(Stmt *S) { 103 if (Expr *E = dyn_cast_or_null<Expr>(S)) 104 if (E->containsUnexpandedParameterPack()) 105 return inherited::TraverseStmt(E); 106 107 return true; 108 } 109 110 /// \brief Suppress traversal into types that do not contain 111 /// unexpanded parameter packs. 112 bool TraverseType(QualType T) { 113 if (!T.isNull() && T->containsUnexpandedParameterPack()) 114 return inherited::TraverseType(T); 115 116 return true; 117 } 118 119 /// \brief Suppress traversel into types with location information 120 /// that do not contain unexpanded parameter packs. 121 bool TraverseTypeLoc(TypeLoc TL) { 122 if (!TL.getType().isNull() && 123 TL.getType()->containsUnexpandedParameterPack()) 124 return inherited::TraverseTypeLoc(TL); 125 126 return true; 127 } 128 129 /// \brief Suppress traversal of non-parameter declarations, since 130 /// they cannot contain unexpanded parameter packs. 131 bool TraverseDecl(Decl *D) { 132 if (D && isa<ParmVarDecl>(D)) 133 return inherited::TraverseDecl(D); 134 135 return true; 136 } 137 138 /// \brief Suppress traversal of template argument pack expansions. 139 bool TraverseTemplateArgument(const TemplateArgument &Arg) { 140 if (Arg.isPackExpansion()) 141 return true; 142 143 return inherited::TraverseTemplateArgument(Arg); 144 } 145 146 /// \brief Suppress traversal of template argument pack expansions. 147 bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc) { 148 if (ArgLoc.getArgument().isPackExpansion()) 149 return true; 150 151 return inherited::TraverseTemplateArgumentLoc(ArgLoc); 152 } 153 }; 154} 155 156/// \brief Diagnose all of the unexpanded parameter packs in the given 157/// vector. 158void 159Sema::DiagnoseUnexpandedParameterPacks(SourceLocation Loc, 160 UnexpandedParameterPackContext UPPC, 161 ArrayRef<UnexpandedParameterPack> Unexpanded) { 162 if (Unexpanded.empty()) 163 return; 164 165 SmallVector<SourceLocation, 4> Locations; 166 SmallVector<IdentifierInfo *, 4> Names; 167 llvm::SmallPtrSet<IdentifierInfo *, 4> NamesKnown; 168 169 for (unsigned I = 0, N = Unexpanded.size(); I != N; ++I) { 170 IdentifierInfo *Name = 0; 171 if (const TemplateTypeParmType *TTP 172 = Unexpanded[I].first.dyn_cast<const TemplateTypeParmType *>()) 173 Name = TTP->getIdentifier(); 174 else 175 Name = Unexpanded[I].first.get<NamedDecl *>()->getIdentifier(); 176 177 if (Name && NamesKnown.insert(Name)) 178 Names.push_back(Name); 179 180 if (Unexpanded[I].second.isValid()) 181 Locations.push_back(Unexpanded[I].second); 182 } 183 184 DiagnosticBuilder DB 185 = Names.size() == 0? Diag(Loc, diag::err_unexpanded_parameter_pack_0) 186 << (int)UPPC 187 : Names.size() == 1? Diag(Loc, diag::err_unexpanded_parameter_pack_1) 188 << (int)UPPC << Names[0] 189 : Names.size() == 2? Diag(Loc, diag::err_unexpanded_parameter_pack_2) 190 << (int)UPPC << Names[0] << Names[1] 191 : Diag(Loc, diag::err_unexpanded_parameter_pack_3_or_more) 192 << (int)UPPC << Names[0] << Names[1]; 193 194 for (unsigned I = 0, N = Locations.size(); I != N; ++I) 195 DB << SourceRange(Locations[I]); 196} 197 198bool Sema::DiagnoseUnexpandedParameterPack(SourceLocation Loc, 199 TypeSourceInfo *T, 200 UnexpandedParameterPackContext UPPC) { 201 // C++0x [temp.variadic]p5: 202 // An appearance of a name of a parameter pack that is not expanded is 203 // ill-formed. 204 if (!T->getType()->containsUnexpandedParameterPack()) 205 return false; 206 207 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 208 CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseTypeLoc( 209 T->getTypeLoc()); 210 assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs"); 211 DiagnoseUnexpandedParameterPacks(Loc, UPPC, Unexpanded); 212 return true; 213} 214 215bool Sema::DiagnoseUnexpandedParameterPack(Expr *E, 216 UnexpandedParameterPackContext UPPC) { 217 // C++0x [temp.variadic]p5: 218 // An appearance of a name of a parameter pack that is not expanded is 219 // ill-formed. 220 if (!E->containsUnexpandedParameterPack()) 221 return false; 222 223 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 224 CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseStmt(E); 225 assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs"); 226 DiagnoseUnexpandedParameterPacks(E->getLocStart(), UPPC, Unexpanded); 227 return true; 228} 229 230bool Sema::DiagnoseUnexpandedParameterPack(const CXXScopeSpec &SS, 231 UnexpandedParameterPackContext UPPC) { 232 // C++0x [temp.variadic]p5: 233 // An appearance of a name of a parameter pack that is not expanded is 234 // ill-formed. 235 if (!SS.getScopeRep() || 236 !SS.getScopeRep()->containsUnexpandedParameterPack()) 237 return false; 238 239 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 240 CollectUnexpandedParameterPacksVisitor(Unexpanded) 241 .TraverseNestedNameSpecifier(SS.getScopeRep()); 242 assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs"); 243 DiagnoseUnexpandedParameterPacks(SS.getRange().getBegin(), 244 UPPC, Unexpanded); 245 return true; 246} 247 248bool Sema::DiagnoseUnexpandedParameterPack(const DeclarationNameInfo &NameInfo, 249 UnexpandedParameterPackContext UPPC) { 250 // C++0x [temp.variadic]p5: 251 // An appearance of a name of a parameter pack that is not expanded is 252 // ill-formed. 253 switch (NameInfo.getName().getNameKind()) { 254 case DeclarationName::Identifier: 255 case DeclarationName::ObjCZeroArgSelector: 256 case DeclarationName::ObjCOneArgSelector: 257 case DeclarationName::ObjCMultiArgSelector: 258 case DeclarationName::CXXOperatorName: 259 case DeclarationName::CXXLiteralOperatorName: 260 case DeclarationName::CXXUsingDirective: 261 return false; 262 263 case DeclarationName::CXXConstructorName: 264 case DeclarationName::CXXDestructorName: 265 case DeclarationName::CXXConversionFunctionName: 266 // FIXME: We shouldn't need this null check! 267 if (TypeSourceInfo *TSInfo = NameInfo.getNamedTypeInfo()) 268 return DiagnoseUnexpandedParameterPack(NameInfo.getLoc(), TSInfo, UPPC); 269 270 if (!NameInfo.getName().getCXXNameType()->containsUnexpandedParameterPack()) 271 return false; 272 273 break; 274 } 275 276 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 277 CollectUnexpandedParameterPacksVisitor(Unexpanded) 278 .TraverseType(NameInfo.getName().getCXXNameType()); 279 assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs"); 280 DiagnoseUnexpandedParameterPacks(NameInfo.getLoc(), UPPC, Unexpanded); 281 return true; 282} 283 284bool Sema::DiagnoseUnexpandedParameterPack(SourceLocation Loc, 285 TemplateName Template, 286 UnexpandedParameterPackContext UPPC) { 287 288 if (Template.isNull() || !Template.containsUnexpandedParameterPack()) 289 return false; 290 291 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 292 CollectUnexpandedParameterPacksVisitor(Unexpanded) 293 .TraverseTemplateName(Template); 294 assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs"); 295 DiagnoseUnexpandedParameterPacks(Loc, UPPC, Unexpanded); 296 return true; 297} 298 299bool Sema::DiagnoseUnexpandedParameterPack(TemplateArgumentLoc Arg, 300 UnexpandedParameterPackContext UPPC) { 301 if (Arg.getArgument().isNull() || 302 !Arg.getArgument().containsUnexpandedParameterPack()) 303 return false; 304 305 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 306 CollectUnexpandedParameterPacksVisitor(Unexpanded) 307 .TraverseTemplateArgumentLoc(Arg); 308 assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs"); 309 DiagnoseUnexpandedParameterPacks(Arg.getLocation(), UPPC, Unexpanded); 310 return true; 311} 312 313void Sema::collectUnexpandedParameterPacks(TemplateArgument Arg, 314 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) { 315 CollectUnexpandedParameterPacksVisitor(Unexpanded) 316 .TraverseTemplateArgument(Arg); 317} 318 319void Sema::collectUnexpandedParameterPacks(TemplateArgumentLoc Arg, 320 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) { 321 CollectUnexpandedParameterPacksVisitor(Unexpanded) 322 .TraverseTemplateArgumentLoc(Arg); 323} 324 325void Sema::collectUnexpandedParameterPacks(QualType T, 326 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) { 327 CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseType(T); 328} 329 330void Sema::collectUnexpandedParameterPacks(TypeLoc TL, 331 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) { 332 CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseTypeLoc(TL); 333} 334 335void Sema::collectUnexpandedParameterPacks(CXXScopeSpec &SS, 336 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) { 337 NestedNameSpecifier *Qualifier = SS.getScopeRep(); 338 if (!Qualifier) 339 return; 340 341 NestedNameSpecifierLoc QualifierLoc(Qualifier, SS.location_data()); 342 CollectUnexpandedParameterPacksVisitor(Unexpanded) 343 .TraverseNestedNameSpecifierLoc(QualifierLoc); 344} 345 346void Sema::collectUnexpandedParameterPacks(const DeclarationNameInfo &NameInfo, 347 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) { 348 CollectUnexpandedParameterPacksVisitor(Unexpanded) 349 .TraverseDeclarationNameInfo(NameInfo); 350} 351 352 353ParsedTemplateArgument 354Sema::ActOnPackExpansion(const ParsedTemplateArgument &Arg, 355 SourceLocation EllipsisLoc) { 356 if (Arg.isInvalid()) 357 return Arg; 358 359 switch (Arg.getKind()) { 360 case ParsedTemplateArgument::Type: { 361 TypeResult Result = ActOnPackExpansion(Arg.getAsType(), EllipsisLoc); 362 if (Result.isInvalid()) 363 return ParsedTemplateArgument(); 364 365 return ParsedTemplateArgument(Arg.getKind(), Result.get().getAsOpaquePtr(), 366 Arg.getLocation()); 367 } 368 369 case ParsedTemplateArgument::NonType: { 370 ExprResult Result = ActOnPackExpansion(Arg.getAsExpr(), EllipsisLoc); 371 if (Result.isInvalid()) 372 return ParsedTemplateArgument(); 373 374 return ParsedTemplateArgument(Arg.getKind(), Result.get(), 375 Arg.getLocation()); 376 } 377 378 case ParsedTemplateArgument::Template: 379 if (!Arg.getAsTemplate().get().containsUnexpandedParameterPack()) { 380 SourceRange R(Arg.getLocation()); 381 if (Arg.getScopeSpec().isValid()) 382 R.setBegin(Arg.getScopeSpec().getBeginLoc()); 383 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs) 384 << R; 385 return ParsedTemplateArgument(); 386 } 387 388 return Arg.getTemplatePackExpansion(EllipsisLoc); 389 } 390 llvm_unreachable("Unhandled template argument kind?"); 391} 392 393TypeResult Sema::ActOnPackExpansion(ParsedType Type, 394 SourceLocation EllipsisLoc) { 395 TypeSourceInfo *TSInfo; 396 GetTypeFromParser(Type, &TSInfo); 397 if (!TSInfo) 398 return true; 399 400 TypeSourceInfo *TSResult = CheckPackExpansion(TSInfo, EllipsisLoc, 401 llvm::Optional<unsigned>()); 402 if (!TSResult) 403 return true; 404 405 return CreateParsedType(TSResult->getType(), TSResult); 406} 407 408TypeSourceInfo *Sema::CheckPackExpansion(TypeSourceInfo *Pattern, 409 SourceLocation EllipsisLoc, 410 llvm::Optional<unsigned> NumExpansions) { 411 // Create the pack expansion type and source-location information. 412 QualType Result = CheckPackExpansion(Pattern->getType(), 413 Pattern->getTypeLoc().getSourceRange(), 414 EllipsisLoc, NumExpansions); 415 if (Result.isNull()) 416 return 0; 417 418 TypeSourceInfo *TSResult = Context.CreateTypeSourceInfo(Result); 419 PackExpansionTypeLoc TL = cast<PackExpansionTypeLoc>(TSResult->getTypeLoc()); 420 TL.setEllipsisLoc(EllipsisLoc); 421 422 // Copy over the source-location information from the type. 423 memcpy(TL.getNextTypeLoc().getOpaqueData(), 424 Pattern->getTypeLoc().getOpaqueData(), 425 Pattern->getTypeLoc().getFullDataSize()); 426 return TSResult; 427} 428 429QualType Sema::CheckPackExpansion(QualType Pattern, 430 SourceRange PatternRange, 431 SourceLocation EllipsisLoc, 432 llvm::Optional<unsigned> NumExpansions) { 433 // C++0x [temp.variadic]p5: 434 // The pattern of a pack expansion shall name one or more 435 // parameter packs that are not expanded by a nested pack 436 // expansion. 437 if (!Pattern->containsUnexpandedParameterPack()) { 438 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs) 439 << PatternRange; 440 return QualType(); 441 } 442 443 return Context.getPackExpansionType(Pattern, NumExpansions); 444} 445 446ExprResult Sema::ActOnPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc) { 447 return CheckPackExpansion(Pattern, EllipsisLoc, llvm::Optional<unsigned>()); 448} 449 450ExprResult Sema::CheckPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 451 llvm::Optional<unsigned> NumExpansions) { 452 if (!Pattern) 453 return ExprError(); 454 455 // C++0x [temp.variadic]p5: 456 // The pattern of a pack expansion shall name one or more 457 // parameter packs that are not expanded by a nested pack 458 // expansion. 459 if (!Pattern->containsUnexpandedParameterPack()) { 460 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs) 461 << Pattern->getSourceRange(); 462 return ExprError(); 463 } 464 465 // Create the pack expansion expression and source-location information. 466 return Owned(new (Context) PackExpansionExpr(Context.DependentTy, Pattern, 467 EllipsisLoc, NumExpansions)); 468} 469 470/// \brief Retrieve the depth and index of a parameter pack. 471static std::pair<unsigned, unsigned> 472getDepthAndIndex(NamedDecl *ND) { 473 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(ND)) 474 return std::make_pair(TTP->getDepth(), TTP->getIndex()); 475 476 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(ND)) 477 return std::make_pair(NTTP->getDepth(), NTTP->getIndex()); 478 479 TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(ND); 480 return std::make_pair(TTP->getDepth(), TTP->getIndex()); 481} 482 483bool Sema::CheckParameterPacksForExpansion(SourceLocation EllipsisLoc, 484 SourceRange PatternRange, 485 ArrayRef<UnexpandedParameterPack> Unexpanded, 486 const MultiLevelTemplateArgumentList &TemplateArgs, 487 bool &ShouldExpand, 488 bool &RetainExpansion, 489 llvm::Optional<unsigned> &NumExpansions) { 490 ShouldExpand = true; 491 RetainExpansion = false; 492 std::pair<IdentifierInfo *, SourceLocation> FirstPack; 493 bool HaveFirstPack = false; 494 495 for (ArrayRef<UnexpandedParameterPack>::iterator i = Unexpanded.begin(), 496 end = Unexpanded.end(); 497 i != end; ++i) { 498 // Compute the depth and index for this parameter pack. 499 unsigned Depth = 0, Index = 0; 500 IdentifierInfo *Name; 501 bool IsFunctionParameterPack = false; 502 503 if (const TemplateTypeParmType *TTP 504 = i->first.dyn_cast<const TemplateTypeParmType *>()) { 505 Depth = TTP->getDepth(); 506 Index = TTP->getIndex(); 507 Name = TTP->getIdentifier(); 508 } else { 509 NamedDecl *ND = i->first.get<NamedDecl *>(); 510 if (isa<ParmVarDecl>(ND)) 511 IsFunctionParameterPack = true; 512 else 513 llvm::tie(Depth, Index) = getDepthAndIndex(ND); 514 515 Name = ND->getIdentifier(); 516 } 517 518 // Determine the size of this argument pack. 519 unsigned NewPackSize; 520 if (IsFunctionParameterPack) { 521 // Figure out whether we're instantiating to an argument pack or not. 522 typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack; 523 524 llvm::PointerUnion<Decl *, DeclArgumentPack *> *Instantiation 525 = CurrentInstantiationScope->findInstantiationOf( 526 i->first.get<NamedDecl *>()); 527 if (Instantiation->is<DeclArgumentPack *>()) { 528 // We could expand this function parameter pack. 529 NewPackSize = Instantiation->get<DeclArgumentPack *>()->size(); 530 } else { 531 // We can't expand this function parameter pack, so we can't expand 532 // the pack expansion. 533 ShouldExpand = false; 534 continue; 535 } 536 } else { 537 // If we don't have a template argument at this depth/index, then we 538 // cannot expand the pack expansion. Make a note of this, but we still 539 // want to check any parameter packs we *do* have arguments for. 540 if (Depth >= TemplateArgs.getNumLevels() || 541 !TemplateArgs.hasTemplateArgument(Depth, Index)) { 542 ShouldExpand = false; 543 continue; 544 } 545 546 // Determine the size of the argument pack. 547 NewPackSize = TemplateArgs(Depth, Index).pack_size(); 548 } 549 550 // C++0x [temp.arg.explicit]p9: 551 // Template argument deduction can extend the sequence of template 552 // arguments corresponding to a template parameter pack, even when the 553 // sequence contains explicitly specified template arguments. 554 if (!IsFunctionParameterPack) { 555 if (NamedDecl *PartialPack 556 = CurrentInstantiationScope->getPartiallySubstitutedPack()){ 557 unsigned PartialDepth, PartialIndex; 558 llvm::tie(PartialDepth, PartialIndex) = getDepthAndIndex(PartialPack); 559 if (PartialDepth == Depth && PartialIndex == Index) 560 RetainExpansion = true; 561 } 562 } 563 564 if (!NumExpansions) { 565 // The is the first pack we've seen for which we have an argument. 566 // Record it. 567 NumExpansions = NewPackSize; 568 FirstPack.first = Name; 569 FirstPack.second = i->second; 570 HaveFirstPack = true; 571 continue; 572 } 573 574 if (NewPackSize != *NumExpansions) { 575 // C++0x [temp.variadic]p5: 576 // All of the parameter packs expanded by a pack expansion shall have 577 // the same number of arguments specified. 578 if (HaveFirstPack) 579 Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict) 580 << FirstPack.first << Name << *NumExpansions << NewPackSize 581 << SourceRange(FirstPack.second) << SourceRange(i->second); 582 else 583 Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict_multilevel) 584 << Name << *NumExpansions << NewPackSize 585 << SourceRange(i->second); 586 return true; 587 } 588 } 589 590 return false; 591} 592 593unsigned Sema::getNumArgumentsInExpansion(QualType T, 594 const MultiLevelTemplateArgumentList &TemplateArgs) { 595 QualType Pattern = cast<PackExpansionType>(T)->getPattern(); 596 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 597 CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseType(Pattern); 598 599 for (unsigned I = 0, N = Unexpanded.size(); I != N; ++I) { 600 // Compute the depth and index for this parameter pack. 601 unsigned Depth; 602 unsigned Index; 603 604 if (const TemplateTypeParmType *TTP 605 = Unexpanded[I].first.dyn_cast<const TemplateTypeParmType *>()) { 606 Depth = TTP->getDepth(); 607 Index = TTP->getIndex(); 608 } else { 609 NamedDecl *ND = Unexpanded[I].first.get<NamedDecl *>(); 610 if (isa<ParmVarDecl>(ND)) { 611 // Function parameter pack. 612 typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack; 613 614 llvm::PointerUnion<Decl *, DeclArgumentPack *> *Instantiation 615 = CurrentInstantiationScope->findInstantiationOf( 616 Unexpanded[I].first.get<NamedDecl *>()); 617 if (Instantiation->is<DeclArgumentPack *>()) 618 return Instantiation->get<DeclArgumentPack *>()->size(); 619 620 continue; 621 } 622 623 llvm::tie(Depth, Index) = getDepthAndIndex(ND); 624 } 625 if (Depth >= TemplateArgs.getNumLevels() || 626 !TemplateArgs.hasTemplateArgument(Depth, Index)) 627 continue; 628 629 // Determine the size of the argument pack. 630 return TemplateArgs(Depth, Index).pack_size(); 631 } 632 633 llvm_unreachable("No unexpanded parameter packs in type expansion."); 634} 635 636bool Sema::containsUnexpandedParameterPacks(Declarator &D) { 637 const DeclSpec &DS = D.getDeclSpec(); 638 switch (DS.getTypeSpecType()) { 639 case TST_typename: 640 case TST_typeofType: 641 case TST_underlyingType: 642 case TST_atomic: { 643 QualType T = DS.getRepAsType().get(); 644 if (!T.isNull() && T->containsUnexpandedParameterPack()) 645 return true; 646 break; 647 } 648 649 case TST_typeofExpr: 650 case TST_decltype: 651 if (DS.getRepAsExpr() && 652 DS.getRepAsExpr()->containsUnexpandedParameterPack()) 653 return true; 654 break; 655 656 case TST_unspecified: 657 case TST_void: 658 case TST_char: 659 case TST_wchar: 660 case TST_char16: 661 case TST_char32: 662 case TST_int: 663 case TST_half: 664 case TST_float: 665 case TST_double: 666 case TST_bool: 667 case TST_decimal32: 668 case TST_decimal64: 669 case TST_decimal128: 670 case TST_enum: 671 case TST_union: 672 case TST_struct: 673 case TST_class: 674 case TST_auto: 675 case TST_unknown_anytype: 676 case TST_error: 677 break; 678 } 679 680 for (unsigned I = 0, N = D.getNumTypeObjects(); I != N; ++I) { 681 const DeclaratorChunk &Chunk = D.getTypeObject(I); 682 switch (Chunk.Kind) { 683 case DeclaratorChunk::Pointer: 684 case DeclaratorChunk::Reference: 685 case DeclaratorChunk::Paren: 686 // These declarator chunks cannot contain any parameter packs. 687 break; 688 689 case DeclaratorChunk::Array: 690 case DeclaratorChunk::Function: 691 case DeclaratorChunk::BlockPointer: 692 // Syntactically, these kinds of declarator chunks all come after the 693 // declarator-id (conceptually), so the parser should not invoke this 694 // routine at this time. 695 llvm_unreachable("Could not have seen this kind of declarator chunk"); 696 697 case DeclaratorChunk::MemberPointer: 698 if (Chunk.Mem.Scope().getScopeRep() && 699 Chunk.Mem.Scope().getScopeRep()->containsUnexpandedParameterPack()) 700 return true; 701 break; 702 } 703 } 704 705 return false; 706} 707 708namespace { 709 710// Callback to only accept typo corrections that refer to parameter packs. 711class ParameterPackValidatorCCC : public CorrectionCandidateCallback { 712 public: 713 virtual bool ValidateCandidate(const TypoCorrection &candidate) { 714 NamedDecl *ND = candidate.getCorrectionDecl(); 715 return ND && ND->isParameterPack(); 716 } 717}; 718 719} 720 721/// \brief Called when an expression computing the size of a parameter pack 722/// is parsed. 723/// 724/// \code 725/// template<typename ...Types> struct count { 726/// static const unsigned value = sizeof...(Types); 727/// }; 728/// \endcode 729/// 730// 731/// \param OpLoc The location of the "sizeof" keyword. 732/// \param Name The name of the parameter pack whose size will be determined. 733/// \param NameLoc The source location of the name of the parameter pack. 734/// \param RParenLoc The location of the closing parentheses. 735ExprResult Sema::ActOnSizeofParameterPackExpr(Scope *S, 736 SourceLocation OpLoc, 737 IdentifierInfo &Name, 738 SourceLocation NameLoc, 739 SourceLocation RParenLoc) { 740 // C++0x [expr.sizeof]p5: 741 // The identifier in a sizeof... expression shall name a parameter pack. 742 LookupResult R(*this, &Name, NameLoc, LookupOrdinaryName); 743 LookupName(R, S); 744 745 NamedDecl *ParameterPack = 0; 746 ParameterPackValidatorCCC Validator; 747 switch (R.getResultKind()) { 748 case LookupResult::Found: 749 ParameterPack = R.getFoundDecl(); 750 break; 751 752 case LookupResult::NotFound: 753 case LookupResult::NotFoundInCurrentInstantiation: 754 if (TypoCorrection Corrected = CorrectTypo(R.getLookupNameInfo(), 755 R.getLookupKind(), S, 0, 756 Validator)) { 757 std::string CorrectedQuotedStr(Corrected.getQuoted(getLangOptions())); 758 ParameterPack = Corrected.getCorrectionDecl(); 759 Diag(NameLoc, diag::err_sizeof_pack_no_pack_name_suggest) 760 << &Name << CorrectedQuotedStr 761 << FixItHint::CreateReplacement( 762 NameLoc, Corrected.getAsString(getLangOptions())); 763 Diag(ParameterPack->getLocation(), diag::note_parameter_pack_here) 764 << CorrectedQuotedStr; 765 } 766 767 case LookupResult::FoundOverloaded: 768 case LookupResult::FoundUnresolvedValue: 769 break; 770 771 case LookupResult::Ambiguous: 772 DiagnoseAmbiguousLookup(R); 773 return ExprError(); 774 } 775 776 if (!ParameterPack || !ParameterPack->isParameterPack()) { 777 Diag(NameLoc, diag::err_sizeof_pack_no_pack_name) 778 << &Name; 779 return ExprError(); 780 } 781 782 MarkAnyDeclReferenced(OpLoc, ParameterPack); 783 784 return new (Context) SizeOfPackExpr(Context.getSizeType(), OpLoc, 785 ParameterPack, NameLoc, RParenLoc); 786} 787