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 "TypeLocBuilder.h" 14 #include "clang/AST/Expr.h" 15 #include "clang/AST/RecursiveASTVisitor.h" 16 #include "clang/AST/TypeLoc.h" 17 #include "clang/Sema/Lookup.h" 18 #include "clang/Sema/ParsedTemplate.h" 19 #include "clang/Sema/ScopeInfo.h" 20 #include "clang/Sema/SemaInternal.h" 21 #include "clang/Sema/Template.h" 22 23 using namespace clang; 24 25 //---------------------------------------------------------------------------- 26 // Visitor that collects unexpanded parameter packs 27 //---------------------------------------------------------------------------- 28 29 /// Retrieve the depth and index of a parameter pack. 30 static std::pair<unsigned, unsigned> 31 getDepthAndIndex(NamedDecl *ND) { 32 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(ND)) 33 return std::make_pair(TTP->getDepth(), TTP->getIndex()); 34 35 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(ND)) 36 return std::make_pair(NTTP->getDepth(), NTTP->getIndex()); 37 38 TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(ND); 39 return std::make_pair(TTP->getDepth(), TTP->getIndex()); 40 } 41 42 namespace { 43 /// A class that collects unexpanded parameter packs. 44 class CollectUnexpandedParameterPacksVisitor : 45 public RecursiveASTVisitor<CollectUnexpandedParameterPacksVisitor> 46 { 47 typedef RecursiveASTVisitor<CollectUnexpandedParameterPacksVisitor> 48 inherited; 49 50 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded; 51 52 bool InLambda = false; 53 unsigned DepthLimit = (unsigned)-1; 54 55 void addUnexpanded(NamedDecl *ND, SourceLocation Loc = SourceLocation()) { 56 if (auto *PVD = dyn_cast<ParmVarDecl>(ND)) { 57 // For now, the only problematic case is a generic lambda's templated 58 // call operator, so we don't need to look for all the other ways we 59 // could have reached a dependent parameter pack. 60 auto *FD = dyn_cast<FunctionDecl>(PVD->getDeclContext()); 61 auto *FTD = FD ? FD->getDescribedFunctionTemplate() : nullptr; 62 if (FTD && FTD->getTemplateParameters()->getDepth() >= DepthLimit) 63 return; 64 } else if (getDepthAndIndex(ND).first >= DepthLimit) 65 return; 66 67 Unexpanded.push_back({ND, Loc}); 68 } 69 void addUnexpanded(const TemplateTypeParmType *T, 70 SourceLocation Loc = SourceLocation()) { 71 if (T->getDepth() < DepthLimit) 72 Unexpanded.push_back({T, Loc}); 73 } 74 75 public: 76 explicit CollectUnexpandedParameterPacksVisitor( 77 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) 78 : Unexpanded(Unexpanded) {} 79 80 bool shouldWalkTypesOfTypeLocs() const { return false; } 81 82 //------------------------------------------------------------------------ 83 // Recording occurrences of (unexpanded) parameter packs. 84 //------------------------------------------------------------------------ 85 86 /// Record occurrences of template type parameter packs. 87 bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 88 if (TL.getTypePtr()->isParameterPack()) 89 addUnexpanded(TL.getTypePtr(), TL.getNameLoc()); 90 return true; 91 } 92 93 /// Record occurrences of template type parameter packs 94 /// when we don't have proper source-location information for 95 /// them. 96 /// 97 /// Ideally, this routine would never be used. 98 bool VisitTemplateTypeParmType(TemplateTypeParmType *T) { 99 if (T->isParameterPack()) 100 addUnexpanded(T); 101 102 return true; 103 } 104 105 /// Record occurrences of function and non-type template 106 /// parameter packs in an expression. 107 bool VisitDeclRefExpr(DeclRefExpr *E) { 108 if (E->getDecl()->isParameterPack()) 109 addUnexpanded(E->getDecl(), E->getLocation()); 110 111 return true; 112 } 113 114 /// Record occurrences of template template parameter packs. 115 bool TraverseTemplateName(TemplateName Template) { 116 if (auto *TTP = dyn_cast_or_null<TemplateTemplateParmDecl>( 117 Template.getAsTemplateDecl())) { 118 if (TTP->isParameterPack()) 119 addUnexpanded(TTP); 120 } 121 122 return inherited::TraverseTemplateName(Template); 123 } 124 125 /// Suppress traversal into Objective-C container literal 126 /// elements that are pack expansions. 127 bool TraverseObjCDictionaryLiteral(ObjCDictionaryLiteral *E) { 128 if (!E->containsUnexpandedParameterPack()) 129 return true; 130 131 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 132 ObjCDictionaryElement Element = E->getKeyValueElement(I); 133 if (Element.isPackExpansion()) 134 continue; 135 136 TraverseStmt(Element.Key); 137 TraverseStmt(Element.Value); 138 } 139 return true; 140 } 141 //------------------------------------------------------------------------ 142 // Pruning the search for unexpanded parameter packs. 143 //------------------------------------------------------------------------ 144 145 /// Suppress traversal into statements and expressions that 146 /// do not contain unexpanded parameter packs. 147 bool TraverseStmt(Stmt *S) { 148 Expr *E = dyn_cast_or_null<Expr>(S); 149 if ((E && E->containsUnexpandedParameterPack()) || InLambda) 150 return inherited::TraverseStmt(S); 151 152 return true; 153 } 154 155 /// Suppress traversal into types that do not contain 156 /// unexpanded parameter packs. 157 bool TraverseType(QualType T) { 158 if ((!T.isNull() && T->containsUnexpandedParameterPack()) || InLambda) 159 return inherited::TraverseType(T); 160 161 return true; 162 } 163 164 /// Suppress traversal into types with location information 165 /// that do not contain unexpanded parameter packs. 166 bool TraverseTypeLoc(TypeLoc TL) { 167 if ((!TL.getType().isNull() && 168 TL.getType()->containsUnexpandedParameterPack()) || 169 InLambda) 170 return inherited::TraverseTypeLoc(TL); 171 172 return true; 173 } 174 175 /// Suppress traversal of parameter packs. 176 bool TraverseDecl(Decl *D) { 177 // A function parameter pack is a pack expansion, so cannot contain 178 // an unexpanded parameter pack. Likewise for a template parameter 179 // pack that contains any references to other packs. 180 if (D->isParameterPack()) 181 return true; 182 183 return inherited::TraverseDecl(D); 184 } 185 186 /// Suppress traversal of pack-expanded attributes. 187 bool TraverseAttr(Attr *A) { 188 if (A->isPackExpansion()) 189 return true; 190 191 return inherited::TraverseAttr(A); 192 } 193 194 /// Suppress traversal of pack expansion expressions and types. 195 ///@{ 196 bool TraversePackExpansionType(PackExpansionType *T) { return true; } 197 bool TraversePackExpansionTypeLoc(PackExpansionTypeLoc TL) { return true; } 198 bool TraversePackExpansionExpr(PackExpansionExpr *E) { return true; } 199 bool TraverseCXXFoldExpr(CXXFoldExpr *E) { return true; } 200 201 ///@} 202 203 /// Suppress traversal of using-declaration pack expansion. 204 bool TraverseUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) { 205 if (D->isPackExpansion()) 206 return true; 207 208 return inherited::TraverseUnresolvedUsingValueDecl(D); 209 } 210 211 /// Suppress traversal of using-declaration pack expansion. 212 bool TraverseUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D) { 213 if (D->isPackExpansion()) 214 return true; 215 216 return inherited::TraverseUnresolvedUsingTypenameDecl(D); 217 } 218 219 /// Suppress traversal of template argument pack expansions. 220 bool TraverseTemplateArgument(const TemplateArgument &Arg) { 221 if (Arg.isPackExpansion()) 222 return true; 223 224 return inherited::TraverseTemplateArgument(Arg); 225 } 226 227 /// Suppress traversal of template argument pack expansions. 228 bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc) { 229 if (ArgLoc.getArgument().isPackExpansion()) 230 return true; 231 232 return inherited::TraverseTemplateArgumentLoc(ArgLoc); 233 } 234 235 /// Suppress traversal of base specifier pack expansions. 236 bool TraverseCXXBaseSpecifier(const CXXBaseSpecifier &Base) { 237 if (Base.isPackExpansion()) 238 return true; 239 240 return inherited::TraverseCXXBaseSpecifier(Base); 241 } 242 243 /// Suppress traversal of mem-initializer pack expansions. 244 bool TraverseConstructorInitializer(CXXCtorInitializer *Init) { 245 if (Init->isPackExpansion()) 246 return true; 247 248 return inherited::TraverseConstructorInitializer(Init); 249 } 250 251 /// Note whether we're traversing a lambda containing an unexpanded 252 /// parameter pack. In this case, the unexpanded pack can occur anywhere, 253 /// including all the places where we normally wouldn't look. Within a 254 /// lambda, we don't propagate the 'contains unexpanded parameter pack' bit 255 /// outside an expression. 256 bool TraverseLambdaExpr(LambdaExpr *Lambda) { 257 // The ContainsUnexpandedParameterPack bit on a lambda is always correct, 258 // even if it's contained within another lambda. 259 if (!Lambda->containsUnexpandedParameterPack()) 260 return true; 261 262 bool WasInLambda = InLambda; 263 unsigned OldDepthLimit = DepthLimit; 264 265 InLambda = true; 266 if (auto *TPL = Lambda->getTemplateParameterList()) 267 DepthLimit = TPL->getDepth(); 268 269 inherited::TraverseLambdaExpr(Lambda); 270 271 InLambda = WasInLambda; 272 DepthLimit = OldDepthLimit; 273 return true; 274 } 275 276 /// Suppress traversal within pack expansions in lambda captures. 277 bool TraverseLambdaCapture(LambdaExpr *Lambda, const LambdaCapture *C, 278 Expr *Init) { 279 if (C->isPackExpansion()) 280 return true; 281 282 return inherited::TraverseLambdaCapture(Lambda, C, Init); 283 } 284 }; 285 } 286 287 /// Determine whether it's possible for an unexpanded parameter pack to 288 /// be valid in this location. This only happens when we're in a declaration 289 /// that is nested within an expression that could be expanded, such as a 290 /// lambda-expression within a function call. 291 /// 292 /// This is conservatively correct, but may claim that some unexpanded packs are 293 /// permitted when they are not. 294 bool Sema::isUnexpandedParameterPackPermitted() { 295 for (auto *SI : FunctionScopes) 296 if (isa<sema::LambdaScopeInfo>(SI)) 297 return true; 298 return false; 299 } 300 301 /// Diagnose all of the unexpanded parameter packs in the given 302 /// vector. 303 bool 304 Sema::DiagnoseUnexpandedParameterPacks(SourceLocation Loc, 305 UnexpandedParameterPackContext UPPC, 306 ArrayRef<UnexpandedParameterPack> Unexpanded) { 307 if (Unexpanded.empty()) 308 return false; 309 310 // If we are within a lambda expression and referencing a pack that is not 311 // a parameter of the lambda itself, that lambda contains an unexpanded 312 // parameter pack, and we are done. 313 // FIXME: Store 'Unexpanded' on the lambda so we don't need to recompute it 314 // later. 315 SmallVector<UnexpandedParameterPack, 4> LambdaParamPackReferences; 316 for (unsigned N = FunctionScopes.size(); N; --N) { 317 sema::FunctionScopeInfo *Func = FunctionScopes[N-1]; 318 // We do not permit pack expansion that would duplicate a statement 319 // expression, not even within a lambda. 320 // FIXME: We could probably support this for statement expressions that do 321 // not contain labels, and for pack expansions that expand both the stmt 322 // expr and the enclosing lambda. 323 if (std::any_of( 324 Func->CompoundScopes.begin(), Func->CompoundScopes.end(), 325 [](sema::CompoundScopeInfo &CSI) { return CSI.IsStmtExpr; })) 326 break; 327 328 if (auto *LSI = dyn_cast<sema::LambdaScopeInfo>(Func)) { 329 if (N == FunctionScopes.size()) { 330 for (auto &Param : Unexpanded) { 331 auto *PD = dyn_cast_or_null<ParmVarDecl>( 332 Param.first.dyn_cast<NamedDecl *>()); 333 if (PD && PD->getDeclContext() == LSI->CallOperator) 334 LambdaParamPackReferences.push_back(Param); 335 } 336 } 337 338 // If we have references to a parameter pack of the innermost enclosing 339 // lambda, only diagnose those ones. We don't know whether any other 340 // unexpanded parameters referenced herein are actually unexpanded; 341 // they might be expanded at an outer level. 342 if (!LambdaParamPackReferences.empty()) { 343 Unexpanded = LambdaParamPackReferences; 344 break; 345 } 346 347 LSI->ContainsUnexpandedParameterPack = true; 348 return false; 349 } 350 } 351 352 SmallVector<SourceLocation, 4> Locations; 353 SmallVector<IdentifierInfo *, 4> Names; 354 llvm::SmallPtrSet<IdentifierInfo *, 4> NamesKnown; 355 356 for (unsigned I = 0, N = Unexpanded.size(); I != N; ++I) { 357 IdentifierInfo *Name = nullptr; 358 if (const TemplateTypeParmType *TTP 359 = Unexpanded[I].first.dyn_cast<const TemplateTypeParmType *>()) 360 Name = TTP->getIdentifier(); 361 else 362 Name = Unexpanded[I].first.get<NamedDecl *>()->getIdentifier(); 363 364 if (Name && NamesKnown.insert(Name).second) 365 Names.push_back(Name); 366 367 if (Unexpanded[I].second.isValid()) 368 Locations.push_back(Unexpanded[I].second); 369 } 370 371 DiagnosticBuilder DB = Diag(Loc, diag::err_unexpanded_parameter_pack) 372 << (int)UPPC << (int)Names.size(); 373 for (size_t I = 0, E = std::min(Names.size(), (size_t)2); I != E; ++I) 374 DB << Names[I]; 375 376 for (unsigned I = 0, N = Locations.size(); I != N; ++I) 377 DB << SourceRange(Locations[I]); 378 return true; 379 } 380 381 bool Sema::DiagnoseUnexpandedParameterPack(SourceLocation Loc, 382 TypeSourceInfo *T, 383 UnexpandedParameterPackContext UPPC) { 384 // C++0x [temp.variadic]p5: 385 // An appearance of a name of a parameter pack that is not expanded is 386 // ill-formed. 387 if (!T->getType()->containsUnexpandedParameterPack()) 388 return false; 389 390 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 391 CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseTypeLoc( 392 T->getTypeLoc()); 393 assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs"); 394 return DiagnoseUnexpandedParameterPacks(Loc, UPPC, Unexpanded); 395 } 396 397 bool Sema::DiagnoseUnexpandedParameterPack(Expr *E, 398 UnexpandedParameterPackContext UPPC) { 399 // C++0x [temp.variadic]p5: 400 // An appearance of a name of a parameter pack that is not expanded is 401 // ill-formed. 402 if (!E->containsUnexpandedParameterPack()) 403 return false; 404 405 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 406 CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseStmt(E); 407 assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs"); 408 return DiagnoseUnexpandedParameterPacks(E->getLocStart(), UPPC, Unexpanded); 409 } 410 411 bool Sema::DiagnoseUnexpandedParameterPack(const CXXScopeSpec &SS, 412 UnexpandedParameterPackContext UPPC) { 413 // C++0x [temp.variadic]p5: 414 // An appearance of a name of a parameter pack that is not expanded is 415 // ill-formed. 416 if (!SS.getScopeRep() || 417 !SS.getScopeRep()->containsUnexpandedParameterPack()) 418 return false; 419 420 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 421 CollectUnexpandedParameterPacksVisitor(Unexpanded) 422 .TraverseNestedNameSpecifier(SS.getScopeRep()); 423 assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs"); 424 return DiagnoseUnexpandedParameterPacks(SS.getRange().getBegin(), 425 UPPC, Unexpanded); 426 } 427 428 bool Sema::DiagnoseUnexpandedParameterPack(const DeclarationNameInfo &NameInfo, 429 UnexpandedParameterPackContext UPPC) { 430 // C++0x [temp.variadic]p5: 431 // An appearance of a name of a parameter pack that is not expanded is 432 // ill-formed. 433 switch (NameInfo.getName().getNameKind()) { 434 case DeclarationName::Identifier: 435 case DeclarationName::ObjCZeroArgSelector: 436 case DeclarationName::ObjCOneArgSelector: 437 case DeclarationName::ObjCMultiArgSelector: 438 case DeclarationName::CXXOperatorName: 439 case DeclarationName::CXXLiteralOperatorName: 440 case DeclarationName::CXXUsingDirective: 441 case DeclarationName::CXXDeductionGuideName: 442 return false; 443 444 case DeclarationName::CXXConstructorName: 445 case DeclarationName::CXXDestructorName: 446 case DeclarationName::CXXConversionFunctionName: 447 // FIXME: We shouldn't need this null check! 448 if (TypeSourceInfo *TSInfo = NameInfo.getNamedTypeInfo()) 449 return DiagnoseUnexpandedParameterPack(NameInfo.getLoc(), TSInfo, UPPC); 450 451 if (!NameInfo.getName().getCXXNameType()->containsUnexpandedParameterPack()) 452 return false; 453 454 break; 455 } 456 457 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 458 CollectUnexpandedParameterPacksVisitor(Unexpanded) 459 .TraverseType(NameInfo.getName().getCXXNameType()); 460 assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs"); 461 return DiagnoseUnexpandedParameterPacks(NameInfo.getLoc(), UPPC, Unexpanded); 462 } 463 464 bool Sema::DiagnoseUnexpandedParameterPack(SourceLocation Loc, 465 TemplateName Template, 466 UnexpandedParameterPackContext UPPC) { 467 468 if (Template.isNull() || !Template.containsUnexpandedParameterPack()) 469 return false; 470 471 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 472 CollectUnexpandedParameterPacksVisitor(Unexpanded) 473 .TraverseTemplateName(Template); 474 assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs"); 475 return DiagnoseUnexpandedParameterPacks(Loc, UPPC, Unexpanded); 476 } 477 478 bool Sema::DiagnoseUnexpandedParameterPack(TemplateArgumentLoc Arg, 479 UnexpandedParameterPackContext UPPC) { 480 if (Arg.getArgument().isNull() || 481 !Arg.getArgument().containsUnexpandedParameterPack()) 482 return false; 483 484 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 485 CollectUnexpandedParameterPacksVisitor(Unexpanded) 486 .TraverseTemplateArgumentLoc(Arg); 487 assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs"); 488 return DiagnoseUnexpandedParameterPacks(Arg.getLocation(), UPPC, Unexpanded); 489 } 490 491 void Sema::collectUnexpandedParameterPacks(TemplateArgument Arg, 492 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) { 493 CollectUnexpandedParameterPacksVisitor(Unexpanded) 494 .TraverseTemplateArgument(Arg); 495 } 496 497 void Sema::collectUnexpandedParameterPacks(TemplateArgumentLoc Arg, 498 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) { 499 CollectUnexpandedParameterPacksVisitor(Unexpanded) 500 .TraverseTemplateArgumentLoc(Arg); 501 } 502 503 void Sema::collectUnexpandedParameterPacks(QualType T, 504 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) { 505 CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseType(T); 506 } 507 508 void Sema::collectUnexpandedParameterPacks(TypeLoc TL, 509 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) { 510 CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseTypeLoc(TL); 511 } 512 513 void Sema::collectUnexpandedParameterPacks( 514 NestedNameSpecifierLoc NNS, 515 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) { 516 CollectUnexpandedParameterPacksVisitor(Unexpanded) 517 .TraverseNestedNameSpecifierLoc(NNS); 518 } 519 520 void Sema::collectUnexpandedParameterPacks( 521 const DeclarationNameInfo &NameInfo, 522 SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) { 523 CollectUnexpandedParameterPacksVisitor(Unexpanded) 524 .TraverseDeclarationNameInfo(NameInfo); 525 } 526 527 528 ParsedTemplateArgument 529 Sema::ActOnPackExpansion(const ParsedTemplateArgument &Arg, 530 SourceLocation EllipsisLoc) { 531 if (Arg.isInvalid()) 532 return Arg; 533 534 switch (Arg.getKind()) { 535 case ParsedTemplateArgument::Type: { 536 TypeResult Result = ActOnPackExpansion(Arg.getAsType(), EllipsisLoc); 537 if (Result.isInvalid()) 538 return ParsedTemplateArgument(); 539 540 return ParsedTemplateArgument(Arg.getKind(), Result.get().getAsOpaquePtr(), 541 Arg.getLocation()); 542 } 543 544 case ParsedTemplateArgument::NonType: { 545 ExprResult Result = ActOnPackExpansion(Arg.getAsExpr(), EllipsisLoc); 546 if (Result.isInvalid()) 547 return ParsedTemplateArgument(); 548 549 return ParsedTemplateArgument(Arg.getKind(), Result.get(), 550 Arg.getLocation()); 551 } 552 553 case ParsedTemplateArgument::Template: 554 if (!Arg.getAsTemplate().get().containsUnexpandedParameterPack()) { 555 SourceRange R(Arg.getLocation()); 556 if (Arg.getScopeSpec().isValid()) 557 R.setBegin(Arg.getScopeSpec().getBeginLoc()); 558 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs) 559 << R; 560 return ParsedTemplateArgument(); 561 } 562 563 return Arg.getTemplatePackExpansion(EllipsisLoc); 564 } 565 llvm_unreachable("Unhandled template argument kind?"); 566 } 567 568 TypeResult Sema::ActOnPackExpansion(ParsedType Type, 569 SourceLocation EllipsisLoc) { 570 TypeSourceInfo *TSInfo; 571 GetTypeFromParser(Type, &TSInfo); 572 if (!TSInfo) 573 return true; 574 575 TypeSourceInfo *TSResult = CheckPackExpansion(TSInfo, EllipsisLoc, None); 576 if (!TSResult) 577 return true; 578 579 return CreateParsedType(TSResult->getType(), TSResult); 580 } 581 582 TypeSourceInfo * 583 Sema::CheckPackExpansion(TypeSourceInfo *Pattern, SourceLocation EllipsisLoc, 584 Optional<unsigned> NumExpansions) { 585 // Create the pack expansion type and source-location information. 586 QualType Result = CheckPackExpansion(Pattern->getType(), 587 Pattern->getTypeLoc().getSourceRange(), 588 EllipsisLoc, NumExpansions); 589 if (Result.isNull()) 590 return nullptr; 591 592 TypeLocBuilder TLB; 593 TLB.pushFullCopy(Pattern->getTypeLoc()); 594 PackExpansionTypeLoc TL = TLB.push<PackExpansionTypeLoc>(Result); 595 TL.setEllipsisLoc(EllipsisLoc); 596 597 return TLB.getTypeSourceInfo(Context, Result); 598 } 599 600 QualType Sema::CheckPackExpansion(QualType Pattern, SourceRange PatternRange, 601 SourceLocation EllipsisLoc, 602 Optional<unsigned> NumExpansions) { 603 // C++0x [temp.variadic]p5: 604 // The pattern of a pack expansion shall name one or more 605 // parameter packs that are not expanded by a nested pack 606 // expansion. 607 if (!Pattern->containsUnexpandedParameterPack()) { 608 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs) 609 << PatternRange; 610 return QualType(); 611 } 612 613 return Context.getPackExpansionType(Pattern, NumExpansions); 614 } 615 616 ExprResult Sema::ActOnPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc) { 617 return CheckPackExpansion(Pattern, EllipsisLoc, None); 618 } 619 620 ExprResult Sema::CheckPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 621 Optional<unsigned> NumExpansions) { 622 if (!Pattern) 623 return ExprError(); 624 625 // C++0x [temp.variadic]p5: 626 // The pattern of a pack expansion shall name one or more 627 // parameter packs that are not expanded by a nested pack 628 // expansion. 629 if (!Pattern->containsUnexpandedParameterPack()) { 630 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs) 631 << Pattern->getSourceRange(); 632 return ExprError(); 633 } 634 635 // Create the pack expansion expression and source-location information. 636 return new (Context) 637 PackExpansionExpr(Context.DependentTy, Pattern, EllipsisLoc, NumExpansions); 638 } 639 640 bool Sema::CheckParameterPacksForExpansion( 641 SourceLocation EllipsisLoc, SourceRange PatternRange, 642 ArrayRef<UnexpandedParameterPack> Unexpanded, 643 const MultiLevelTemplateArgumentList &TemplateArgs, bool &ShouldExpand, 644 bool &RetainExpansion, Optional<unsigned> &NumExpansions) { 645 ShouldExpand = true; 646 RetainExpansion = false; 647 std::pair<IdentifierInfo *, SourceLocation> FirstPack; 648 bool HaveFirstPack = false; 649 Optional<unsigned> NumPartialExpansions; 650 SourceLocation PartiallySubstitutedPackLoc; 651 652 for (ArrayRef<UnexpandedParameterPack>::iterator i = Unexpanded.begin(), 653 end = Unexpanded.end(); 654 i != end; ++i) { 655 // Compute the depth and index for this parameter pack. 656 unsigned Depth = 0, Index = 0; 657 IdentifierInfo *Name; 658 bool IsFunctionParameterPack = false; 659 660 if (const TemplateTypeParmType *TTP 661 = i->first.dyn_cast<const TemplateTypeParmType *>()) { 662 Depth = TTP->getDepth(); 663 Index = TTP->getIndex(); 664 Name = TTP->getIdentifier(); 665 } else { 666 NamedDecl *ND = i->first.get<NamedDecl *>(); 667 if (isa<ParmVarDecl>(ND)) 668 IsFunctionParameterPack = true; 669 else 670 std::tie(Depth, Index) = getDepthAndIndex(ND); 671 672 Name = ND->getIdentifier(); 673 } 674 675 // Determine the size of this argument pack. 676 unsigned NewPackSize; 677 if (IsFunctionParameterPack) { 678 // Figure out whether we're instantiating to an argument pack or not. 679 typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack; 680 681 llvm::PointerUnion<Decl *, DeclArgumentPack *> *Instantiation 682 = CurrentInstantiationScope->findInstantiationOf( 683 i->first.get<NamedDecl *>()); 684 if (Instantiation->is<DeclArgumentPack *>()) { 685 // We could expand this function parameter pack. 686 NewPackSize = Instantiation->get<DeclArgumentPack *>()->size(); 687 } else { 688 // We can't expand this function parameter pack, so we can't expand 689 // the pack expansion. 690 ShouldExpand = false; 691 continue; 692 } 693 } else { 694 // If we don't have a template argument at this depth/index, then we 695 // cannot expand the pack expansion. Make a note of this, but we still 696 // want to check any parameter packs we *do* have arguments for. 697 if (Depth >= TemplateArgs.getNumLevels() || 698 !TemplateArgs.hasTemplateArgument(Depth, Index)) { 699 ShouldExpand = false; 700 continue; 701 } 702 703 // Determine the size of the argument pack. 704 NewPackSize = TemplateArgs(Depth, Index).pack_size(); 705 } 706 707 // C++0x [temp.arg.explicit]p9: 708 // Template argument deduction can extend the sequence of template 709 // arguments corresponding to a template parameter pack, even when the 710 // sequence contains explicitly specified template arguments. 711 if (!IsFunctionParameterPack && CurrentInstantiationScope) { 712 if (NamedDecl *PartialPack 713 = CurrentInstantiationScope->getPartiallySubstitutedPack()){ 714 unsigned PartialDepth, PartialIndex; 715 std::tie(PartialDepth, PartialIndex) = getDepthAndIndex(PartialPack); 716 if (PartialDepth == Depth && PartialIndex == Index) { 717 RetainExpansion = true; 718 // We don't actually know the new pack size yet. 719 NumPartialExpansions = NewPackSize; 720 PartiallySubstitutedPackLoc = i->second; 721 continue; 722 } 723 } 724 } 725 726 if (!NumExpansions) { 727 // The is the first pack we've seen for which we have an argument. 728 // Record it. 729 NumExpansions = NewPackSize; 730 FirstPack.first = Name; 731 FirstPack.second = i->second; 732 HaveFirstPack = true; 733 continue; 734 } 735 736 if (NewPackSize != *NumExpansions) { 737 // C++0x [temp.variadic]p5: 738 // All of the parameter packs expanded by a pack expansion shall have 739 // the same number of arguments specified. 740 if (HaveFirstPack) 741 Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict) 742 << FirstPack.first << Name << *NumExpansions << NewPackSize 743 << SourceRange(FirstPack.second) << SourceRange(i->second); 744 else 745 Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict_multilevel) 746 << Name << *NumExpansions << NewPackSize 747 << SourceRange(i->second); 748 return true; 749 } 750 } 751 752 // If we're performing a partial expansion but we also have a full expansion, 753 // expand to the number of common arguments. For example, given: 754 // 755 // template<typename ...T> struct A { 756 // template<typename ...U> void f(pair<T, U>...); 757 // }; 758 // 759 // ... a call to 'A<int, int>().f<int>' should expand the pack once and 760 // retain an expansion. 761 if (NumPartialExpansions) { 762 if (NumExpansions && *NumExpansions < *NumPartialExpansions) { 763 NamedDecl *PartialPack = 764 CurrentInstantiationScope->getPartiallySubstitutedPack(); 765 Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict_partial) 766 << PartialPack << *NumPartialExpansions << *NumExpansions 767 << SourceRange(PartiallySubstitutedPackLoc); 768 return true; 769 } 770 771 NumExpansions = NumPartialExpansions; 772 } 773 774 return false; 775 } 776 777 Optional<unsigned> Sema::getNumArgumentsInExpansion(QualType T, 778 const MultiLevelTemplateArgumentList &TemplateArgs) { 779 QualType Pattern = cast<PackExpansionType>(T)->getPattern(); 780 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 781 CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseType(Pattern); 782 783 Optional<unsigned> Result; 784 for (unsigned I = 0, N = Unexpanded.size(); I != N; ++I) { 785 // Compute the depth and index for this parameter pack. 786 unsigned Depth; 787 unsigned Index; 788 789 if (const TemplateTypeParmType *TTP 790 = Unexpanded[I].first.dyn_cast<const TemplateTypeParmType *>()) { 791 Depth = TTP->getDepth(); 792 Index = TTP->getIndex(); 793 } else { 794 NamedDecl *ND = Unexpanded[I].first.get<NamedDecl *>(); 795 if (isa<ParmVarDecl>(ND)) { 796 // Function parameter pack. 797 typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack; 798 799 llvm::PointerUnion<Decl *, DeclArgumentPack *> *Instantiation 800 = CurrentInstantiationScope->findInstantiationOf( 801 Unexpanded[I].first.get<NamedDecl *>()); 802 if (Instantiation->is<Decl*>()) 803 // The pattern refers to an unexpanded pack. We're not ready to expand 804 // this pack yet. 805 return None; 806 807 unsigned Size = Instantiation->get<DeclArgumentPack *>()->size(); 808 assert((!Result || *Result == Size) && "inconsistent pack sizes"); 809 Result = Size; 810 continue; 811 } 812 813 std::tie(Depth, Index) = getDepthAndIndex(ND); 814 } 815 if (Depth >= TemplateArgs.getNumLevels() || 816 !TemplateArgs.hasTemplateArgument(Depth, Index)) 817 // The pattern refers to an unknown template argument. We're not ready to 818 // expand this pack yet. 819 return None; 820 821 // Determine the size of the argument pack. 822 unsigned Size = TemplateArgs(Depth, Index).pack_size(); 823 assert((!Result || *Result == Size) && "inconsistent pack sizes"); 824 Result = Size; 825 } 826 827 return Result; 828 } 829 830 bool Sema::containsUnexpandedParameterPacks(Declarator &D) { 831 const DeclSpec &DS = D.getDeclSpec(); 832 switch (DS.getTypeSpecType()) { 833 case TST_typename: 834 case TST_typeofType: 835 case TST_underlyingType: 836 case TST_atomic: { 837 QualType T = DS.getRepAsType().get(); 838 if (!T.isNull() && T->containsUnexpandedParameterPack()) 839 return true; 840 break; 841 } 842 843 case TST_typeofExpr: 844 case TST_decltype: 845 if (DS.getRepAsExpr() && 846 DS.getRepAsExpr()->containsUnexpandedParameterPack()) 847 return true; 848 break; 849 850 case TST_unspecified: 851 case TST_void: 852 case TST_char: 853 case TST_wchar: 854 case TST_char8: 855 case TST_char16: 856 case TST_char32: 857 case TST_int: 858 case TST_int128: 859 case TST_half: 860 case TST_float: 861 case TST_double: 862 case TST_Accum: 863 case TST_Fract: 864 case TST_Float16: 865 case TST_float128: 866 case TST_bool: 867 case TST_decimal32: 868 case TST_decimal64: 869 case TST_decimal128: 870 case TST_enum: 871 case TST_union: 872 case TST_struct: 873 case TST_interface: 874 case TST_class: 875 case TST_auto: 876 case TST_auto_type: 877 case TST_decltype_auto: 878 #define GENERIC_IMAGE_TYPE(ImgType, Id) case TST_##ImgType##_t: 879 #include "clang/Basic/OpenCLImageTypes.def" 880 case TST_unknown_anytype: 881 case TST_error: 882 break; 883 } 884 885 for (unsigned I = 0, N = D.getNumTypeObjects(); I != N; ++I) { 886 const DeclaratorChunk &Chunk = D.getTypeObject(I); 887 switch (Chunk.Kind) { 888 case DeclaratorChunk::Pointer: 889 case DeclaratorChunk::Reference: 890 case DeclaratorChunk::Paren: 891 case DeclaratorChunk::Pipe: 892 case DeclaratorChunk::BlockPointer: 893 // These declarator chunks cannot contain any parameter packs. 894 break; 895 896 case DeclaratorChunk::Array: 897 if (Chunk.Arr.NumElts && 898 Chunk.Arr.NumElts->containsUnexpandedParameterPack()) 899 return true; 900 break; 901 case DeclaratorChunk::Function: 902 for (unsigned i = 0, e = Chunk.Fun.NumParams; i != e; ++i) { 903 ParmVarDecl *Param = cast<ParmVarDecl>(Chunk.Fun.Params[i].Param); 904 QualType ParamTy = Param->getType(); 905 assert(!ParamTy.isNull() && "Couldn't parse type?"); 906 if (ParamTy->containsUnexpandedParameterPack()) return true; 907 } 908 909 if (Chunk.Fun.getExceptionSpecType() == EST_Dynamic) { 910 for (unsigned i = 0; i != Chunk.Fun.getNumExceptions(); ++i) { 911 if (Chunk.Fun.Exceptions[i] 912 .Ty.get() 913 ->containsUnexpandedParameterPack()) 914 return true; 915 } 916 } else if (isComputedNoexcept(Chunk.Fun.getExceptionSpecType()) && 917 Chunk.Fun.NoexceptExpr->containsUnexpandedParameterPack()) 918 return true; 919 920 if (Chunk.Fun.hasTrailingReturnType()) { 921 QualType T = Chunk.Fun.getTrailingReturnType().get(); 922 if (!T.isNull() && T->containsUnexpandedParameterPack()) 923 return true; 924 } 925 break; 926 927 case DeclaratorChunk::MemberPointer: 928 if (Chunk.Mem.Scope().getScopeRep() && 929 Chunk.Mem.Scope().getScopeRep()->containsUnexpandedParameterPack()) 930 return true; 931 break; 932 } 933 } 934 935 return false; 936 } 937 938 namespace { 939 940 // Callback to only accept typo corrections that refer to parameter packs. 941 class ParameterPackValidatorCCC : public CorrectionCandidateCallback { 942 public: 943 bool ValidateCandidate(const TypoCorrection &candidate) override { 944 NamedDecl *ND = candidate.getCorrectionDecl(); 945 return ND && ND->isParameterPack(); 946 } 947 }; 948 949 } 950 951 /// Called when an expression computing the size of a parameter pack 952 /// is parsed. 953 /// 954 /// \code 955 /// template<typename ...Types> struct count { 956 /// static const unsigned value = sizeof...(Types); 957 /// }; 958 /// \endcode 959 /// 960 // 961 /// \param OpLoc The location of the "sizeof" keyword. 962 /// \param Name The name of the parameter pack whose size will be determined. 963 /// \param NameLoc The source location of the name of the parameter pack. 964 /// \param RParenLoc The location of the closing parentheses. 965 ExprResult Sema::ActOnSizeofParameterPackExpr(Scope *S, 966 SourceLocation OpLoc, 967 IdentifierInfo &Name, 968 SourceLocation NameLoc, 969 SourceLocation RParenLoc) { 970 // C++0x [expr.sizeof]p5: 971 // The identifier in a sizeof... expression shall name a parameter pack. 972 LookupResult R(*this, &Name, NameLoc, LookupOrdinaryName); 973 LookupName(R, S); 974 975 NamedDecl *ParameterPack = nullptr; 976 switch (R.getResultKind()) { 977 case LookupResult::Found: 978 ParameterPack = R.getFoundDecl(); 979 break; 980 981 case LookupResult::NotFound: 982 case LookupResult::NotFoundInCurrentInstantiation: 983 if (TypoCorrection Corrected = 984 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, nullptr, 985 llvm::make_unique<ParameterPackValidatorCCC>(), 986 CTK_ErrorRecovery)) { 987 diagnoseTypo(Corrected, 988 PDiag(diag::err_sizeof_pack_no_pack_name_suggest) << &Name, 989 PDiag(diag::note_parameter_pack_here)); 990 ParameterPack = Corrected.getCorrectionDecl(); 991 } 992 993 case LookupResult::FoundOverloaded: 994 case LookupResult::FoundUnresolvedValue: 995 break; 996 997 case LookupResult::Ambiguous: 998 DiagnoseAmbiguousLookup(R); 999 return ExprError(); 1000 } 1001 1002 if (!ParameterPack || !ParameterPack->isParameterPack()) { 1003 Diag(NameLoc, diag::err_sizeof_pack_no_pack_name) 1004 << &Name; 1005 return ExprError(); 1006 } 1007 1008 MarkAnyDeclReferenced(OpLoc, ParameterPack, true); 1009 1010 return SizeOfPackExpr::Create(Context, OpLoc, ParameterPack, NameLoc, 1011 RParenLoc); 1012 } 1013 1014 TemplateArgumentLoc 1015 Sema::getTemplateArgumentPackExpansionPattern( 1016 TemplateArgumentLoc OrigLoc, 1017 SourceLocation &Ellipsis, Optional<unsigned> &NumExpansions) const { 1018 const TemplateArgument &Argument = OrigLoc.getArgument(); 1019 assert(Argument.isPackExpansion()); 1020 switch (Argument.getKind()) { 1021 case TemplateArgument::Type: { 1022 // FIXME: We shouldn't ever have to worry about missing 1023 // type-source info! 1024 TypeSourceInfo *ExpansionTSInfo = OrigLoc.getTypeSourceInfo(); 1025 if (!ExpansionTSInfo) 1026 ExpansionTSInfo = Context.getTrivialTypeSourceInfo(Argument.getAsType(), 1027 Ellipsis); 1028 PackExpansionTypeLoc Expansion = 1029 ExpansionTSInfo->getTypeLoc().castAs<PackExpansionTypeLoc>(); 1030 Ellipsis = Expansion.getEllipsisLoc(); 1031 1032 TypeLoc Pattern = Expansion.getPatternLoc(); 1033 NumExpansions = Expansion.getTypePtr()->getNumExpansions(); 1034 1035 // We need to copy the TypeLoc because TemplateArgumentLocs store a 1036 // TypeSourceInfo. 1037 // FIXME: Find some way to avoid the copy? 1038 TypeLocBuilder TLB; 1039 TLB.pushFullCopy(Pattern); 1040 TypeSourceInfo *PatternTSInfo = 1041 TLB.getTypeSourceInfo(Context, Pattern.getType()); 1042 return TemplateArgumentLoc(TemplateArgument(Pattern.getType()), 1043 PatternTSInfo); 1044 } 1045 1046 case TemplateArgument::Expression: { 1047 PackExpansionExpr *Expansion 1048 = cast<PackExpansionExpr>(Argument.getAsExpr()); 1049 Expr *Pattern = Expansion->getPattern(); 1050 Ellipsis = Expansion->getEllipsisLoc(); 1051 NumExpansions = Expansion->getNumExpansions(); 1052 return TemplateArgumentLoc(Pattern, Pattern); 1053 } 1054 1055 case TemplateArgument::TemplateExpansion: 1056 Ellipsis = OrigLoc.getTemplateEllipsisLoc(); 1057 NumExpansions = Argument.getNumTemplateExpansions(); 1058 return TemplateArgumentLoc(Argument.getPackExpansionPattern(), 1059 OrigLoc.getTemplateQualifierLoc(), 1060 OrigLoc.getTemplateNameLoc()); 1061 1062 case TemplateArgument::Declaration: 1063 case TemplateArgument::NullPtr: 1064 case TemplateArgument::Template: 1065 case TemplateArgument::Integral: 1066 case TemplateArgument::Pack: 1067 case TemplateArgument::Null: 1068 return TemplateArgumentLoc(); 1069 } 1070 1071 llvm_unreachable("Invalid TemplateArgument Kind!"); 1072 } 1073 1074 Optional<unsigned> Sema::getFullyPackExpandedSize(TemplateArgument Arg) { 1075 assert(Arg.containsUnexpandedParameterPack()); 1076 1077 // If this is a substituted pack, grab that pack. If not, we don't know 1078 // the size yet. 1079 // FIXME: We could find a size in more cases by looking for a substituted 1080 // pack anywhere within this argument, but that's not necessary in the common 1081 // case for 'sizeof...(A)' handling. 1082 TemplateArgument Pack; 1083 switch (Arg.getKind()) { 1084 case TemplateArgument::Type: 1085 if (auto *Subst = Arg.getAsType()->getAs<SubstTemplateTypeParmPackType>()) 1086 Pack = Subst->getArgumentPack(); 1087 else 1088 return None; 1089 break; 1090 1091 case TemplateArgument::Expression: 1092 if (auto *Subst = 1093 dyn_cast<SubstNonTypeTemplateParmPackExpr>(Arg.getAsExpr())) 1094 Pack = Subst->getArgumentPack(); 1095 else if (auto *Subst = dyn_cast<FunctionParmPackExpr>(Arg.getAsExpr())) { 1096 for (ParmVarDecl *PD : *Subst) 1097 if (PD->isParameterPack()) 1098 return None; 1099 return Subst->getNumExpansions(); 1100 } else 1101 return None; 1102 break; 1103 1104 case TemplateArgument::Template: 1105 if (SubstTemplateTemplateParmPackStorage *Subst = 1106 Arg.getAsTemplate().getAsSubstTemplateTemplateParmPack()) 1107 Pack = Subst->getArgumentPack(); 1108 else 1109 return None; 1110 break; 1111 1112 case TemplateArgument::Declaration: 1113 case TemplateArgument::NullPtr: 1114 case TemplateArgument::TemplateExpansion: 1115 case TemplateArgument::Integral: 1116 case TemplateArgument::Pack: 1117 case TemplateArgument::Null: 1118 return None; 1119 } 1120 1121 // Check that no argument in the pack is itself a pack expansion. 1122 for (TemplateArgument Elem : Pack.pack_elements()) { 1123 // There's no point recursing in this case; we would have already 1124 // expanded this pack expansion into the enclosing pack if we could. 1125 if (Elem.isPackExpansion()) 1126 return None; 1127 } 1128 return Pack.pack_size(); 1129 } 1130 1131 static void CheckFoldOperand(Sema &S, Expr *E) { 1132 if (!E) 1133 return; 1134 1135 E = E->IgnoreImpCasts(); 1136 auto *OCE = dyn_cast<CXXOperatorCallExpr>(E); 1137 if ((OCE && OCE->isInfixBinaryOp()) || isa<BinaryOperator>(E) || 1138 isa<AbstractConditionalOperator>(E)) { 1139 S.Diag(E->getExprLoc(), diag::err_fold_expression_bad_operand) 1140 << E->getSourceRange() 1141 << FixItHint::CreateInsertion(E->getLocStart(), "(") 1142 << FixItHint::CreateInsertion(E->getLocEnd(), ")"); 1143 } 1144 } 1145 1146 ExprResult Sema::ActOnCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 1147 tok::TokenKind Operator, 1148 SourceLocation EllipsisLoc, Expr *RHS, 1149 SourceLocation RParenLoc) { 1150 // LHS and RHS must be cast-expressions. We allow an arbitrary expression 1151 // in the parser and reduce down to just cast-expressions here. 1152 CheckFoldOperand(*this, LHS); 1153 CheckFoldOperand(*this, RHS); 1154 1155 auto DiscardOperands = [&] { 1156 CorrectDelayedTyposInExpr(LHS); 1157 CorrectDelayedTyposInExpr(RHS); 1158 }; 1159 1160 // [expr.prim.fold]p3: 1161 // In a binary fold, op1 and op2 shall be the same fold-operator, and 1162 // either e1 shall contain an unexpanded parameter pack or e2 shall contain 1163 // an unexpanded parameter pack, but not both. 1164 if (LHS && RHS && 1165 LHS->containsUnexpandedParameterPack() == 1166 RHS->containsUnexpandedParameterPack()) { 1167 DiscardOperands(); 1168 return Diag(EllipsisLoc, 1169 LHS->containsUnexpandedParameterPack() 1170 ? diag::err_fold_expression_packs_both_sides 1171 : diag::err_pack_expansion_without_parameter_packs) 1172 << LHS->getSourceRange() << RHS->getSourceRange(); 1173 } 1174 1175 // [expr.prim.fold]p2: 1176 // In a unary fold, the cast-expression shall contain an unexpanded 1177 // parameter pack. 1178 if (!LHS || !RHS) { 1179 Expr *Pack = LHS ? LHS : RHS; 1180 assert(Pack && "fold expression with neither LHS nor RHS"); 1181 DiscardOperands(); 1182 if (!Pack->containsUnexpandedParameterPack()) 1183 return Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs) 1184 << Pack->getSourceRange(); 1185 } 1186 1187 BinaryOperatorKind Opc = ConvertTokenKindToBinaryOpcode(Operator); 1188 return BuildCXXFoldExpr(LParenLoc, LHS, Opc, EllipsisLoc, RHS, RParenLoc); 1189 } 1190 1191 ExprResult Sema::BuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 1192 BinaryOperatorKind Operator, 1193 SourceLocation EllipsisLoc, Expr *RHS, 1194 SourceLocation RParenLoc) { 1195 return new (Context) CXXFoldExpr(Context.DependentTy, LParenLoc, LHS, 1196 Operator, EllipsisLoc, RHS, RParenLoc); 1197 } 1198 1199 ExprResult Sema::BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 1200 BinaryOperatorKind Operator) { 1201 // [temp.variadic]p9: 1202 // If N is zero for a unary fold-expression, the value of the expression is 1203 // && -> true 1204 // || -> false 1205 // , -> void() 1206 // if the operator is not listed [above], the instantiation is ill-formed. 1207 // 1208 // Note that we need to use something like int() here, not merely 0, to 1209 // prevent the result from being a null pointer constant. 1210 QualType ScalarType; 1211 switch (Operator) { 1212 case BO_LOr: 1213 return ActOnCXXBoolLiteral(EllipsisLoc, tok::kw_false); 1214 case BO_LAnd: 1215 return ActOnCXXBoolLiteral(EllipsisLoc, tok::kw_true); 1216 case BO_Comma: 1217 ScalarType = Context.VoidTy; 1218 break; 1219 1220 default: 1221 return Diag(EllipsisLoc, diag::err_fold_expression_empty) 1222 << BinaryOperator::getOpcodeStr(Operator); 1223 } 1224 1225 return new (Context) CXXScalarValueInitExpr( 1226 ScalarType, Context.getTrivialTypeSourceInfo(ScalarType, EllipsisLoc), 1227 EllipsisLoc); 1228 } 1229