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