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