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