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