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