]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/Sema/SemaTemplateVariadic.cpp
MFV r336851:
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / Sema / SemaTemplateVariadic.cpp
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 /// \brief 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   /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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     /// \brief 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 /// \brief 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 /// \brief 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     if (sema::LambdaScopeInfo *LSI =
318           dyn_cast<sema::LambdaScopeInfo>(FunctionScopes[N-1])) {
319       if (N == FunctionScopes.size()) {
320         for (auto &Param : Unexpanded) {
321           auto *PD = dyn_cast_or_null<ParmVarDecl>(
322               Param.first.dyn_cast<NamedDecl *>());
323           if (PD && PD->getDeclContext() == LSI->CallOperator)
324             LambdaParamPackReferences.push_back(Param);
325         }
326       }
327
328       // If we have references to a parameter pack of the innermost enclosing
329       // lambda, only diagnose those ones. We don't know whether any other
330       // unexpanded parameters referenced herein are actually unexpanded;
331       // they might be expanded at an outer level.
332       if (!LambdaParamPackReferences.empty()) {
333         Unexpanded = LambdaParamPackReferences;
334         break;
335       }
336
337       LSI->ContainsUnexpandedParameterPack = true;
338       return false;
339     }
340   }
341   
342   SmallVector<SourceLocation, 4> Locations;
343   SmallVector<IdentifierInfo *, 4> Names;
344   llvm::SmallPtrSet<IdentifierInfo *, 4> NamesKnown;
345
346   for (unsigned I = 0, N = Unexpanded.size(); I != N; ++I) {
347     IdentifierInfo *Name = nullptr;
348     if (const TemplateTypeParmType *TTP
349           = Unexpanded[I].first.dyn_cast<const TemplateTypeParmType *>())
350       Name = TTP->getIdentifier();
351     else
352       Name = Unexpanded[I].first.get<NamedDecl *>()->getIdentifier();
353
354     if (Name && NamesKnown.insert(Name).second)
355       Names.push_back(Name);
356
357     if (Unexpanded[I].second.isValid())
358       Locations.push_back(Unexpanded[I].second);
359   }
360
361   DiagnosticBuilder DB = Diag(Loc, diag::err_unexpanded_parameter_pack)
362                          << (int)UPPC << (int)Names.size();
363   for (size_t I = 0, E = std::min(Names.size(), (size_t)2); I != E; ++I)
364     DB << Names[I];
365
366   for (unsigned I = 0, N = Locations.size(); I != N; ++I)
367     DB << SourceRange(Locations[I]);
368   return true;
369 }
370
371 bool Sema::DiagnoseUnexpandedParameterPack(SourceLocation Loc, 
372                                            TypeSourceInfo *T,
373                                          UnexpandedParameterPackContext UPPC) {
374   // C++0x [temp.variadic]p5:
375   //   An appearance of a name of a parameter pack that is not expanded is 
376   //   ill-formed.
377   if (!T->getType()->containsUnexpandedParameterPack())
378     return false;
379
380   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
381   CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseTypeLoc(
382                                                               T->getTypeLoc());
383   assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
384   return DiagnoseUnexpandedParameterPacks(Loc, UPPC, Unexpanded);
385 }
386
387 bool Sema::DiagnoseUnexpandedParameterPack(Expr *E,
388                                         UnexpandedParameterPackContext UPPC) {
389   // C++0x [temp.variadic]p5:
390   //   An appearance of a name of a parameter pack that is not expanded is 
391   //   ill-formed.
392   if (!E->containsUnexpandedParameterPack())
393     return false;
394
395   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
396   CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseStmt(E);
397   assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
398   return DiagnoseUnexpandedParameterPacks(E->getLocStart(), UPPC, Unexpanded);
399 }
400
401 bool Sema::DiagnoseUnexpandedParameterPack(const CXXScopeSpec &SS,
402                                         UnexpandedParameterPackContext UPPC) {
403   // C++0x [temp.variadic]p5:
404   //   An appearance of a name of a parameter pack that is not expanded is 
405   //   ill-formed.
406   if (!SS.getScopeRep() || 
407       !SS.getScopeRep()->containsUnexpandedParameterPack())
408     return false;
409
410   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
411   CollectUnexpandedParameterPacksVisitor(Unexpanded)
412     .TraverseNestedNameSpecifier(SS.getScopeRep());
413   assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
414   return DiagnoseUnexpandedParameterPacks(SS.getRange().getBegin(),
415                                           UPPC, Unexpanded);
416 }
417
418 bool Sema::DiagnoseUnexpandedParameterPack(const DeclarationNameInfo &NameInfo,
419                                          UnexpandedParameterPackContext UPPC) {
420   // C++0x [temp.variadic]p5:
421   //   An appearance of a name of a parameter pack that is not expanded is 
422   //   ill-formed.
423   switch (NameInfo.getName().getNameKind()) {
424   case DeclarationName::Identifier:
425   case DeclarationName::ObjCZeroArgSelector:
426   case DeclarationName::ObjCOneArgSelector:
427   case DeclarationName::ObjCMultiArgSelector:
428   case DeclarationName::CXXOperatorName:
429   case DeclarationName::CXXLiteralOperatorName:
430   case DeclarationName::CXXUsingDirective:
431   case DeclarationName::CXXDeductionGuideName:
432     return false;
433
434   case DeclarationName::CXXConstructorName:
435   case DeclarationName::CXXDestructorName:
436   case DeclarationName::CXXConversionFunctionName:
437     // FIXME: We shouldn't need this null check!
438     if (TypeSourceInfo *TSInfo = NameInfo.getNamedTypeInfo())
439       return DiagnoseUnexpandedParameterPack(NameInfo.getLoc(), TSInfo, UPPC);
440
441     if (!NameInfo.getName().getCXXNameType()->containsUnexpandedParameterPack())
442       return false;
443
444     break;
445   }
446
447   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
448   CollectUnexpandedParameterPacksVisitor(Unexpanded)
449     .TraverseType(NameInfo.getName().getCXXNameType());
450   assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
451   return DiagnoseUnexpandedParameterPacks(NameInfo.getLoc(), UPPC, Unexpanded);
452 }
453
454 bool Sema::DiagnoseUnexpandedParameterPack(SourceLocation Loc,
455                                            TemplateName Template,
456                                        UnexpandedParameterPackContext UPPC) {
457   
458   if (Template.isNull() || !Template.containsUnexpandedParameterPack())
459     return false;
460
461   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
462   CollectUnexpandedParameterPacksVisitor(Unexpanded)
463     .TraverseTemplateName(Template);
464   assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
465   return DiagnoseUnexpandedParameterPacks(Loc, UPPC, Unexpanded);
466 }
467
468 bool Sema::DiagnoseUnexpandedParameterPack(TemplateArgumentLoc Arg,
469                                          UnexpandedParameterPackContext UPPC) {
470   if (Arg.getArgument().isNull() || 
471       !Arg.getArgument().containsUnexpandedParameterPack())
472     return false;
473   
474   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
475   CollectUnexpandedParameterPacksVisitor(Unexpanded)
476     .TraverseTemplateArgumentLoc(Arg);
477   assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
478   return DiagnoseUnexpandedParameterPacks(Arg.getLocation(), UPPC, Unexpanded);
479 }
480
481 void Sema::collectUnexpandedParameterPacks(TemplateArgument Arg,
482                    SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
483   CollectUnexpandedParameterPacksVisitor(Unexpanded)
484     .TraverseTemplateArgument(Arg);
485 }
486
487 void Sema::collectUnexpandedParameterPacks(TemplateArgumentLoc Arg,
488                    SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
489   CollectUnexpandedParameterPacksVisitor(Unexpanded)
490     .TraverseTemplateArgumentLoc(Arg);
491 }
492
493 void Sema::collectUnexpandedParameterPacks(QualType T,
494                    SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
495   CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseType(T);  
496 }  
497
498 void Sema::collectUnexpandedParameterPacks(TypeLoc TL,
499                    SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
500   CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseTypeLoc(TL);  
501 }
502
503 void Sema::collectUnexpandedParameterPacks(
504     NestedNameSpecifierLoc NNS,
505     SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
506   CollectUnexpandedParameterPacksVisitor(Unexpanded)
507       .TraverseNestedNameSpecifierLoc(NNS);
508 }
509
510 void Sema::collectUnexpandedParameterPacks(
511     const DeclarationNameInfo &NameInfo,
512     SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
513   CollectUnexpandedParameterPacksVisitor(Unexpanded)
514     .TraverseDeclarationNameInfo(NameInfo);
515 }
516
517
518 ParsedTemplateArgument 
519 Sema::ActOnPackExpansion(const ParsedTemplateArgument &Arg,
520                          SourceLocation EllipsisLoc) {
521   if (Arg.isInvalid())
522     return Arg;
523
524   switch (Arg.getKind()) {
525   case ParsedTemplateArgument::Type: {
526     TypeResult Result = ActOnPackExpansion(Arg.getAsType(), EllipsisLoc);
527     if (Result.isInvalid())
528       return ParsedTemplateArgument();
529
530     return ParsedTemplateArgument(Arg.getKind(), Result.get().getAsOpaquePtr(), 
531                                   Arg.getLocation());
532   }
533
534   case ParsedTemplateArgument::NonType: {
535     ExprResult Result = ActOnPackExpansion(Arg.getAsExpr(), EllipsisLoc);
536     if (Result.isInvalid())
537       return ParsedTemplateArgument();
538     
539     return ParsedTemplateArgument(Arg.getKind(), Result.get(), 
540                                   Arg.getLocation());
541   }
542     
543   case ParsedTemplateArgument::Template:
544     if (!Arg.getAsTemplate().get().containsUnexpandedParameterPack()) {
545       SourceRange R(Arg.getLocation());
546       if (Arg.getScopeSpec().isValid())
547         R.setBegin(Arg.getScopeSpec().getBeginLoc());
548       Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
549         << R;
550       return ParsedTemplateArgument();
551     }
552       
553     return Arg.getTemplatePackExpansion(EllipsisLoc);
554   }
555   llvm_unreachable("Unhandled template argument kind?");
556 }
557
558 TypeResult Sema::ActOnPackExpansion(ParsedType Type, 
559                                     SourceLocation EllipsisLoc) {
560   TypeSourceInfo *TSInfo;
561   GetTypeFromParser(Type, &TSInfo);
562   if (!TSInfo)
563     return true;
564
565   TypeSourceInfo *TSResult = CheckPackExpansion(TSInfo, EllipsisLoc, None);
566   if (!TSResult)
567     return true;
568   
569   return CreateParsedType(TSResult->getType(), TSResult);
570 }
571
572 TypeSourceInfo *
573 Sema::CheckPackExpansion(TypeSourceInfo *Pattern, SourceLocation EllipsisLoc,
574                          Optional<unsigned> NumExpansions) {
575   // Create the pack expansion type and source-location information.
576   QualType Result = CheckPackExpansion(Pattern->getType(), 
577                                        Pattern->getTypeLoc().getSourceRange(),
578                                        EllipsisLoc, NumExpansions);
579   if (Result.isNull())
580     return nullptr;
581
582   TypeLocBuilder TLB;
583   TLB.pushFullCopy(Pattern->getTypeLoc());
584   PackExpansionTypeLoc TL = TLB.push<PackExpansionTypeLoc>(Result);
585   TL.setEllipsisLoc(EllipsisLoc);
586
587   return TLB.getTypeSourceInfo(Context, Result);
588 }
589
590 QualType Sema::CheckPackExpansion(QualType Pattern, SourceRange PatternRange,
591                                   SourceLocation EllipsisLoc,
592                                   Optional<unsigned> NumExpansions) {
593   // C++0x [temp.variadic]p5:
594   //   The pattern of a pack expansion shall name one or more
595   //   parameter packs that are not expanded by a nested pack
596   //   expansion.
597   if (!Pattern->containsUnexpandedParameterPack()) {
598     Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
599       << PatternRange;
600     return QualType();
601   }
602
603   return Context.getPackExpansionType(Pattern, NumExpansions);
604 }
605
606 ExprResult Sema::ActOnPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc) {
607   return CheckPackExpansion(Pattern, EllipsisLoc, None);
608 }
609
610 ExprResult Sema::CheckPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
611                                     Optional<unsigned> NumExpansions) {
612   if (!Pattern)
613     return ExprError();
614   
615   // C++0x [temp.variadic]p5:
616   //   The pattern of a pack expansion shall name one or more
617   //   parameter packs that are not expanded by a nested pack
618   //   expansion.
619   if (!Pattern->containsUnexpandedParameterPack()) {
620     Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
621     << Pattern->getSourceRange();
622     return ExprError();
623   }
624   
625   // Create the pack expansion expression and source-location information.
626   return new (Context)
627     PackExpansionExpr(Context.DependentTy, Pattern, EllipsisLoc, NumExpansions);
628 }
629
630 bool Sema::CheckParameterPacksForExpansion(
631     SourceLocation EllipsisLoc, SourceRange PatternRange,
632     ArrayRef<UnexpandedParameterPack> Unexpanded,
633     const MultiLevelTemplateArgumentList &TemplateArgs, bool &ShouldExpand,
634     bool &RetainExpansion, Optional<unsigned> &NumExpansions) {
635   ShouldExpand = true;
636   RetainExpansion = false;
637   std::pair<IdentifierInfo *, SourceLocation> FirstPack;
638   bool HaveFirstPack = false;
639   
640   for (ArrayRef<UnexpandedParameterPack>::iterator i = Unexpanded.begin(),
641                                                  end = Unexpanded.end();
642                                                   i != end; ++i) {
643     // Compute the depth and index for this parameter pack.
644     unsigned Depth = 0, Index = 0;
645     IdentifierInfo *Name;
646     bool IsFunctionParameterPack = false;
647     
648     if (const TemplateTypeParmType *TTP
649         = i->first.dyn_cast<const TemplateTypeParmType *>()) {
650       Depth = TTP->getDepth();
651       Index = TTP->getIndex();
652       Name = TTP->getIdentifier();
653     } else {
654       NamedDecl *ND = i->first.get<NamedDecl *>();
655       if (isa<ParmVarDecl>(ND))
656         IsFunctionParameterPack = true;
657       else
658         std::tie(Depth, Index) = getDepthAndIndex(ND);
659
660       Name = ND->getIdentifier();
661     }
662     
663     // Determine the size of this argument pack.
664     unsigned NewPackSize;    
665     if (IsFunctionParameterPack) {
666       // Figure out whether we're instantiating to an argument pack or not.
667       typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack;
668       
669       llvm::PointerUnion<Decl *, DeclArgumentPack *> *Instantiation
670         = CurrentInstantiationScope->findInstantiationOf(
671                                         i->first.get<NamedDecl *>());
672       if (Instantiation->is<DeclArgumentPack *>()) {
673         // We could expand this function parameter pack.
674         NewPackSize = Instantiation->get<DeclArgumentPack *>()->size();
675       } else {
676         // We can't expand this function parameter pack, so we can't expand
677         // the pack expansion.
678         ShouldExpand = false;
679         continue;
680       }
681     } else {
682       // If we don't have a template argument at this depth/index, then we 
683       // cannot expand the pack expansion. Make a note of this, but we still 
684       // want to check any parameter packs we *do* have arguments for.
685       if (Depth >= TemplateArgs.getNumLevels() ||
686           !TemplateArgs.hasTemplateArgument(Depth, Index)) {
687         ShouldExpand = false;
688         continue;
689       }
690       
691       // Determine the size of the argument pack.
692       NewPackSize = TemplateArgs(Depth, Index).pack_size();
693     }
694     
695     // C++0x [temp.arg.explicit]p9:
696     //   Template argument deduction can extend the sequence of template 
697     //   arguments corresponding to a template parameter pack, even when the
698     //   sequence contains explicitly specified template arguments.
699     if (!IsFunctionParameterPack && CurrentInstantiationScope) {
700       if (NamedDecl *PartialPack 
701                     = CurrentInstantiationScope->getPartiallySubstitutedPack()){
702         unsigned PartialDepth, PartialIndex;
703         std::tie(PartialDepth, PartialIndex) = getDepthAndIndex(PartialPack);
704         if (PartialDepth == Depth && PartialIndex == Index)
705           RetainExpansion = true;
706       }
707     }
708     
709     if (!NumExpansions) {
710       // The is the first pack we've seen for which we have an argument. 
711       // Record it.
712       NumExpansions = NewPackSize;
713       FirstPack.first = Name;
714       FirstPack.second = i->second;
715       HaveFirstPack = true;
716       continue;
717     }
718     
719     if (NewPackSize != *NumExpansions) {
720       // C++0x [temp.variadic]p5:
721       //   All of the parameter packs expanded by a pack expansion shall have 
722       //   the same number of arguments specified.
723       if (HaveFirstPack)
724         Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict)
725           << FirstPack.first << Name << *NumExpansions << NewPackSize
726           << SourceRange(FirstPack.second) << SourceRange(i->second);
727       else
728         Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict_multilevel)
729           << Name << *NumExpansions << NewPackSize
730           << SourceRange(i->second);
731       return true;
732     }
733   }
734
735   return false;
736 }
737
738 Optional<unsigned> Sema::getNumArgumentsInExpansion(QualType T,
739                           const MultiLevelTemplateArgumentList &TemplateArgs) {
740   QualType Pattern = cast<PackExpansionType>(T)->getPattern();
741   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
742   CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseType(Pattern);
743
744   Optional<unsigned> Result;
745   for (unsigned I = 0, N = Unexpanded.size(); I != N; ++I) {
746     // Compute the depth and index for this parameter pack.
747     unsigned Depth;
748     unsigned Index;
749     
750     if (const TemplateTypeParmType *TTP
751           = Unexpanded[I].first.dyn_cast<const TemplateTypeParmType *>()) {
752       Depth = TTP->getDepth();
753       Index = TTP->getIndex();
754     } else {      
755       NamedDecl *ND = Unexpanded[I].first.get<NamedDecl *>();
756       if (isa<ParmVarDecl>(ND)) {
757         // Function parameter pack.
758         typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack;
759         
760         llvm::PointerUnion<Decl *, DeclArgumentPack *> *Instantiation
761           = CurrentInstantiationScope->findInstantiationOf(
762                                         Unexpanded[I].first.get<NamedDecl *>());
763         if (Instantiation->is<Decl*>())
764           // The pattern refers to an unexpanded pack. We're not ready to expand
765           // this pack yet.
766           return None;
767
768         unsigned Size = Instantiation->get<DeclArgumentPack *>()->size();
769         assert((!Result || *Result == Size) && "inconsistent pack sizes");
770         Result = Size;
771         continue;
772       }
773
774       std::tie(Depth, Index) = getDepthAndIndex(ND);
775     }
776     if (Depth >= TemplateArgs.getNumLevels() ||
777         !TemplateArgs.hasTemplateArgument(Depth, Index))
778       // The pattern refers to an unknown template argument. We're not ready to
779       // expand this pack yet.
780       return None;
781     
782     // Determine the size of the argument pack.
783     unsigned Size = TemplateArgs(Depth, Index).pack_size();
784     assert((!Result || *Result == Size) && "inconsistent pack sizes");
785     Result = Size;
786   }
787   
788   return Result;
789 }
790
791 bool Sema::containsUnexpandedParameterPacks(Declarator &D) {
792   const DeclSpec &DS = D.getDeclSpec();
793   switch (DS.getTypeSpecType()) {
794   case TST_typename:
795   case TST_typeofType:
796   case TST_underlyingType:
797   case TST_atomic: {
798     QualType T = DS.getRepAsType().get();
799     if (!T.isNull() && T->containsUnexpandedParameterPack())
800       return true;
801     break;
802   }
803       
804   case TST_typeofExpr:
805   case TST_decltype:
806     if (DS.getRepAsExpr() && 
807         DS.getRepAsExpr()->containsUnexpandedParameterPack())
808       return true;
809     break;
810       
811   case TST_unspecified:
812   case TST_void:
813   case TST_char:
814   case TST_wchar:
815   case TST_char16:
816   case TST_char32:
817   case TST_int:
818   case TST_int128:
819   case TST_half:
820   case TST_float:
821   case TST_double:
822   case TST_Float16:
823   case TST_float128:
824   case TST_bool:
825   case TST_decimal32:
826   case TST_decimal64:
827   case TST_decimal128:
828   case TST_enum:
829   case TST_union:
830   case TST_struct:
831   case TST_interface:
832   case TST_class:
833   case TST_auto:
834   case TST_auto_type:
835   case TST_decltype_auto:
836 #define GENERIC_IMAGE_TYPE(ImgType, Id) case TST_##ImgType##_t:
837 #include "clang/Basic/OpenCLImageTypes.def"
838   case TST_unknown_anytype:
839   case TST_error:
840     break;
841   }
842
843   for (unsigned I = 0, N = D.getNumTypeObjects(); I != N; ++I) {
844     const DeclaratorChunk &Chunk = D.getTypeObject(I);
845     switch (Chunk.Kind) {
846     case DeclaratorChunk::Pointer:
847     case DeclaratorChunk::Reference:
848     case DeclaratorChunk::Paren:
849     case DeclaratorChunk::Pipe:
850     case DeclaratorChunk::BlockPointer:
851       // These declarator chunks cannot contain any parameter packs.
852       break;
853         
854     case DeclaratorChunk::Array:
855       if (Chunk.Arr.NumElts &&
856           Chunk.Arr.NumElts->containsUnexpandedParameterPack())
857         return true;
858       break;
859     case DeclaratorChunk::Function:
860       for (unsigned i = 0, e = Chunk.Fun.NumParams; i != e; ++i) {
861         ParmVarDecl *Param = cast<ParmVarDecl>(Chunk.Fun.Params[i].Param);
862         QualType ParamTy = Param->getType();
863         assert(!ParamTy.isNull() && "Couldn't parse type?");
864         if (ParamTy->containsUnexpandedParameterPack()) return true;
865       }
866
867       if (Chunk.Fun.getExceptionSpecType() == EST_Dynamic) {
868         for (unsigned i = 0; i != Chunk.Fun.getNumExceptions(); ++i) {
869           if (Chunk.Fun.Exceptions[i]
870                   .Ty.get()
871                   ->containsUnexpandedParameterPack())
872             return true;
873         }
874       } else if (Chunk.Fun.getExceptionSpecType() == EST_ComputedNoexcept &&
875                  Chunk.Fun.NoexceptExpr->containsUnexpandedParameterPack())
876         return true;
877
878       if (Chunk.Fun.hasTrailingReturnType()) {
879         QualType T = Chunk.Fun.getTrailingReturnType().get();
880         if (!T.isNull() && T->containsUnexpandedParameterPack())
881           return true;
882       }
883       break;
884
885     case DeclaratorChunk::MemberPointer:
886       if (Chunk.Mem.Scope().getScopeRep() &&
887           Chunk.Mem.Scope().getScopeRep()->containsUnexpandedParameterPack())
888         return true;
889       break;
890     }
891   }
892   
893   return false;
894 }
895
896 namespace {
897
898 // Callback to only accept typo corrections that refer to parameter packs.
899 class ParameterPackValidatorCCC : public CorrectionCandidateCallback {
900  public:
901   bool ValidateCandidate(const TypoCorrection &candidate) override {
902     NamedDecl *ND = candidate.getCorrectionDecl();
903     return ND && ND->isParameterPack();
904   }
905 };
906
907 }
908
909 /// \brief Called when an expression computing the size of a parameter pack
910 /// is parsed.
911 ///
912 /// \code
913 /// template<typename ...Types> struct count {
914 ///   static const unsigned value = sizeof...(Types);
915 /// };
916 /// \endcode
917 ///
918 //
919 /// \param OpLoc The location of the "sizeof" keyword.
920 /// \param Name The name of the parameter pack whose size will be determined.
921 /// \param NameLoc The source location of the name of the parameter pack.
922 /// \param RParenLoc The location of the closing parentheses.
923 ExprResult Sema::ActOnSizeofParameterPackExpr(Scope *S,
924                                               SourceLocation OpLoc,
925                                               IdentifierInfo &Name,
926                                               SourceLocation NameLoc,
927                                               SourceLocation RParenLoc) {
928   // C++0x [expr.sizeof]p5:
929   //   The identifier in a sizeof... expression shall name a parameter pack.
930   LookupResult R(*this, &Name, NameLoc, LookupOrdinaryName);
931   LookupName(R, S);
932
933   NamedDecl *ParameterPack = nullptr;
934   switch (R.getResultKind()) {
935   case LookupResult::Found:
936     ParameterPack = R.getFoundDecl();
937     break;
938     
939   case LookupResult::NotFound:
940   case LookupResult::NotFoundInCurrentInstantiation:
941     if (TypoCorrection Corrected =
942             CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, nullptr,
943                         llvm::make_unique<ParameterPackValidatorCCC>(),
944                         CTK_ErrorRecovery)) {
945       diagnoseTypo(Corrected,
946                    PDiag(diag::err_sizeof_pack_no_pack_name_suggest) << &Name,
947                    PDiag(diag::note_parameter_pack_here));
948       ParameterPack = Corrected.getCorrectionDecl();
949     }
950
951   case LookupResult::FoundOverloaded:
952   case LookupResult::FoundUnresolvedValue:
953     break;
954     
955   case LookupResult::Ambiguous:
956     DiagnoseAmbiguousLookup(R);
957     return ExprError();
958   }
959   
960   if (!ParameterPack || !ParameterPack->isParameterPack()) {
961     Diag(NameLoc, diag::err_sizeof_pack_no_pack_name)
962       << &Name;
963     return ExprError();
964   }
965
966   MarkAnyDeclReferenced(OpLoc, ParameterPack, true);
967
968   return SizeOfPackExpr::Create(Context, OpLoc, ParameterPack, NameLoc,
969                                 RParenLoc);
970 }
971
972 TemplateArgumentLoc
973 Sema::getTemplateArgumentPackExpansionPattern(
974       TemplateArgumentLoc OrigLoc,
975       SourceLocation &Ellipsis, Optional<unsigned> &NumExpansions) const {
976   const TemplateArgument &Argument = OrigLoc.getArgument();
977   assert(Argument.isPackExpansion());
978   switch (Argument.getKind()) {
979   case TemplateArgument::Type: {
980     // FIXME: We shouldn't ever have to worry about missing
981     // type-source info!
982     TypeSourceInfo *ExpansionTSInfo = OrigLoc.getTypeSourceInfo();
983     if (!ExpansionTSInfo)
984       ExpansionTSInfo = Context.getTrivialTypeSourceInfo(Argument.getAsType(),
985                                                          Ellipsis);
986     PackExpansionTypeLoc Expansion =
987         ExpansionTSInfo->getTypeLoc().castAs<PackExpansionTypeLoc>();
988     Ellipsis = Expansion.getEllipsisLoc();
989
990     TypeLoc Pattern = Expansion.getPatternLoc();
991     NumExpansions = Expansion.getTypePtr()->getNumExpansions();
992
993     // We need to copy the TypeLoc because TemplateArgumentLocs store a
994     // TypeSourceInfo.
995     // FIXME: Find some way to avoid the copy?
996     TypeLocBuilder TLB;
997     TLB.pushFullCopy(Pattern);
998     TypeSourceInfo *PatternTSInfo =
999         TLB.getTypeSourceInfo(Context, Pattern.getType());
1000     return TemplateArgumentLoc(TemplateArgument(Pattern.getType()),
1001                                PatternTSInfo);
1002   }
1003
1004   case TemplateArgument::Expression: {
1005     PackExpansionExpr *Expansion
1006       = cast<PackExpansionExpr>(Argument.getAsExpr());
1007     Expr *Pattern = Expansion->getPattern();
1008     Ellipsis = Expansion->getEllipsisLoc();
1009     NumExpansions = Expansion->getNumExpansions();
1010     return TemplateArgumentLoc(Pattern, Pattern);
1011   }
1012
1013   case TemplateArgument::TemplateExpansion:
1014     Ellipsis = OrigLoc.getTemplateEllipsisLoc();
1015     NumExpansions = Argument.getNumTemplateExpansions();
1016     return TemplateArgumentLoc(Argument.getPackExpansionPattern(),
1017                                OrigLoc.getTemplateQualifierLoc(),
1018                                OrigLoc.getTemplateNameLoc());
1019
1020   case TemplateArgument::Declaration:
1021   case TemplateArgument::NullPtr:
1022   case TemplateArgument::Template:
1023   case TemplateArgument::Integral:
1024   case TemplateArgument::Pack:
1025   case TemplateArgument::Null:
1026     return TemplateArgumentLoc();
1027   }
1028
1029   llvm_unreachable("Invalid TemplateArgument Kind!");
1030 }
1031
1032 Optional<unsigned> Sema::getFullyPackExpandedSize(TemplateArgument Arg) {
1033   assert(Arg.containsUnexpandedParameterPack());
1034
1035   // If this is a substituted pack, grab that pack. If not, we don't know
1036   // the size yet.
1037   // FIXME: We could find a size in more cases by looking for a substituted
1038   // pack anywhere within this argument, but that's not necessary in the common
1039   // case for 'sizeof...(A)' handling.
1040   TemplateArgument Pack;
1041   switch (Arg.getKind()) {
1042   case TemplateArgument::Type:
1043     if (auto *Subst = Arg.getAsType()->getAs<SubstTemplateTypeParmPackType>())
1044       Pack = Subst->getArgumentPack();
1045     else
1046       return None;
1047     break;
1048
1049   case TemplateArgument::Expression:
1050     if (auto *Subst =
1051             dyn_cast<SubstNonTypeTemplateParmPackExpr>(Arg.getAsExpr()))
1052       Pack = Subst->getArgumentPack();
1053     else if (auto *Subst = dyn_cast<FunctionParmPackExpr>(Arg.getAsExpr()))  {
1054       for (ParmVarDecl *PD : *Subst)
1055         if (PD->isParameterPack())
1056           return None;
1057       return Subst->getNumExpansions();
1058     } else
1059       return None;
1060     break;
1061
1062   case TemplateArgument::Template:
1063     if (SubstTemplateTemplateParmPackStorage *Subst =
1064             Arg.getAsTemplate().getAsSubstTemplateTemplateParmPack())
1065       Pack = Subst->getArgumentPack();
1066     else
1067       return None;
1068     break;
1069
1070   case TemplateArgument::Declaration:
1071   case TemplateArgument::NullPtr:
1072   case TemplateArgument::TemplateExpansion:
1073   case TemplateArgument::Integral:
1074   case TemplateArgument::Pack:
1075   case TemplateArgument::Null:
1076     return None;
1077   }
1078
1079   // Check that no argument in the pack is itself a pack expansion.
1080   for (TemplateArgument Elem : Pack.pack_elements()) {
1081     // There's no point recursing in this case; we would have already
1082     // expanded this pack expansion into the enclosing pack if we could.
1083     if (Elem.isPackExpansion())
1084       return None;
1085   }
1086   return Pack.pack_size();
1087 }
1088
1089 static void CheckFoldOperand(Sema &S, Expr *E) {
1090   if (!E)
1091     return;
1092
1093   E = E->IgnoreImpCasts();
1094   auto *OCE = dyn_cast<CXXOperatorCallExpr>(E);
1095   if ((OCE && OCE->isInfixBinaryOp()) || isa<BinaryOperator>(E) ||
1096       isa<AbstractConditionalOperator>(E)) {
1097     S.Diag(E->getExprLoc(), diag::err_fold_expression_bad_operand)
1098         << E->getSourceRange()
1099         << FixItHint::CreateInsertion(E->getLocStart(), "(")
1100         << FixItHint::CreateInsertion(E->getLocEnd(), ")");
1101   }
1102 }
1103
1104 ExprResult Sema::ActOnCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
1105                                   tok::TokenKind Operator,
1106                                   SourceLocation EllipsisLoc, Expr *RHS,
1107                                   SourceLocation RParenLoc) {
1108   // LHS and RHS must be cast-expressions. We allow an arbitrary expression
1109   // in the parser and reduce down to just cast-expressions here.
1110   CheckFoldOperand(*this, LHS);
1111   CheckFoldOperand(*this, RHS);
1112
1113   auto DiscardOperands = [&] {
1114     CorrectDelayedTyposInExpr(LHS);
1115     CorrectDelayedTyposInExpr(RHS);
1116   };
1117
1118   // [expr.prim.fold]p3:
1119   //   In a binary fold, op1 and op2 shall be the same fold-operator, and
1120   //   either e1 shall contain an unexpanded parameter pack or e2 shall contain
1121   //   an unexpanded parameter pack, but not both.
1122   if (LHS && RHS &&
1123       LHS->containsUnexpandedParameterPack() ==
1124           RHS->containsUnexpandedParameterPack()) {
1125     DiscardOperands();
1126     return Diag(EllipsisLoc,
1127                 LHS->containsUnexpandedParameterPack()
1128                     ? diag::err_fold_expression_packs_both_sides
1129                     : diag::err_pack_expansion_without_parameter_packs)
1130         << LHS->getSourceRange() << RHS->getSourceRange();
1131   }
1132
1133   // [expr.prim.fold]p2:
1134   //   In a unary fold, the cast-expression shall contain an unexpanded
1135   //   parameter pack.
1136   if (!LHS || !RHS) {
1137     Expr *Pack = LHS ? LHS : RHS;
1138     assert(Pack && "fold expression with neither LHS nor RHS");
1139     DiscardOperands();
1140     if (!Pack->containsUnexpandedParameterPack())
1141       return Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
1142              << Pack->getSourceRange();
1143   }
1144
1145   BinaryOperatorKind Opc = ConvertTokenKindToBinaryOpcode(Operator);
1146   return BuildCXXFoldExpr(LParenLoc, LHS, Opc, EllipsisLoc, RHS, RParenLoc);
1147 }
1148
1149 ExprResult Sema::BuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
1150                                   BinaryOperatorKind Operator,
1151                                   SourceLocation EllipsisLoc, Expr *RHS,
1152                                   SourceLocation RParenLoc) {
1153   return new (Context) CXXFoldExpr(Context.DependentTy, LParenLoc, LHS,
1154                                    Operator, EllipsisLoc, RHS, RParenLoc);
1155 }
1156
1157 ExprResult Sema::BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
1158                                        BinaryOperatorKind Operator) {
1159   // [temp.variadic]p9:
1160   //   If N is zero for a unary fold-expression, the value of the expression is
1161   //       &&  ->  true
1162   //       ||  ->  false
1163   //       ,   ->  void()
1164   //   if the operator is not listed [above], the instantiation is ill-formed.
1165   //
1166   // Note that we need to use something like int() here, not merely 0, to
1167   // prevent the result from being a null pointer constant.
1168   QualType ScalarType;
1169   switch (Operator) {
1170   case BO_LOr:
1171     return ActOnCXXBoolLiteral(EllipsisLoc, tok::kw_false);
1172   case BO_LAnd:
1173     return ActOnCXXBoolLiteral(EllipsisLoc, tok::kw_true);
1174   case BO_Comma:
1175     ScalarType = Context.VoidTy;
1176     break;
1177
1178   default:
1179     return Diag(EllipsisLoc, diag::err_fold_expression_empty)
1180         << BinaryOperator::getOpcodeStr(Operator);
1181   }
1182
1183   return new (Context) CXXScalarValueInitExpr(
1184       ScalarType, Context.getTrivialTypeSourceInfo(ScalarType, EllipsisLoc),
1185       EllipsisLoc);
1186 }