SemaTemplateVariadic.cpp revision 0d8e9646bc000bab521ce52ed294209a92298cef
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 "clang/AST/Expr.h"
14#include "clang/AST/RecursiveASTVisitor.h"
15#include "clang/AST/TypeLoc.h"
16#include "clang/Sema/Lookup.h"
17#include "clang/Sema/ParsedTemplate.h"
18#include "clang/Sema/ScopeInfo.h"
19#include "clang/Sema/SemaInternal.h"
20#include "clang/Sema/Template.h"
21
22using namespace clang;
23
24//----------------------------------------------------------------------------
25// Visitor that collects unexpanded parameter packs
26//----------------------------------------------------------------------------
27
28namespace {
29  /// \brief A class that collects unexpanded parameter packs.
30  class CollectUnexpandedParameterPacksVisitor :
31    public RecursiveASTVisitor<CollectUnexpandedParameterPacksVisitor>
32  {
33    typedef RecursiveASTVisitor<CollectUnexpandedParameterPacksVisitor>
34      inherited;
35
36    SmallVectorImpl<UnexpandedParameterPack> &Unexpanded;
37
38    bool InLambda;
39
40  public:
41    explicit CollectUnexpandedParameterPacksVisitor(
42                  SmallVectorImpl<UnexpandedParameterPack> &Unexpanded)
43      : Unexpanded(Unexpanded), InLambda(false) { }
44
45    bool shouldWalkTypesOfTypeLocs() const { return false; }
46
47    //------------------------------------------------------------------------
48    // Recording occurrences of (unexpanded) parameter packs.
49    //------------------------------------------------------------------------
50
51    /// \brief Record occurrences of template type parameter packs.
52    bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
53      if (TL.getTypePtr()->isParameterPack())
54        Unexpanded.push_back(std::make_pair(TL.getTypePtr(), TL.getNameLoc()));
55      return true;
56    }
57
58    /// \brief Record occurrences of template type parameter packs
59    /// when we don't have proper source-location information for
60    /// them.
61    ///
62    /// Ideally, this routine would never be used.
63    bool VisitTemplateTypeParmType(TemplateTypeParmType *T) {
64      if (T->isParameterPack())
65        Unexpanded.push_back(std::make_pair(T, SourceLocation()));
66
67      return true;
68    }
69
70    /// \brief Record occurrences of function and non-type template
71    /// parameter packs in an expression.
72    bool VisitDeclRefExpr(DeclRefExpr *E) {
73      if (E->getDecl()->isParameterPack())
74        Unexpanded.push_back(std::make_pair(E->getDecl(), E->getLocation()));
75
76      return true;
77    }
78
79    /// \brief Record occurrences of template template parameter packs.
80    bool TraverseTemplateName(TemplateName Template) {
81      if (TemplateTemplateParmDecl *TTP
82            = dyn_cast_or_null<TemplateTemplateParmDecl>(
83                                                  Template.getAsTemplateDecl()))
84        if (TTP->isParameterPack())
85          Unexpanded.push_back(std::make_pair(TTP, SourceLocation()));
86
87      return inherited::TraverseTemplateName(Template);
88    }
89
90    /// \brief Suppress traversal into Objective-C container literal
91    /// elements that are pack expansions.
92    bool TraverseObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
93      if (!E->containsUnexpandedParameterPack())
94        return true;
95
96      for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
97        ObjCDictionaryElement Element = E->getKeyValueElement(I);
98        if (Element.isPackExpansion())
99          continue;
100
101        TraverseStmt(Element.Key);
102        TraverseStmt(Element.Value);
103      }
104      return true;
105    }
106    //------------------------------------------------------------------------
107    // Pruning the search for unexpanded parameter packs.
108    //------------------------------------------------------------------------
109
110    /// \brief Suppress traversal into statements and expressions that
111    /// do not contain unexpanded parameter packs.
112    bool TraverseStmt(Stmt *S) {
113      Expr *E = dyn_cast_or_null<Expr>(S);
114      if ((E && E->containsUnexpandedParameterPack()) || InLambda)
115        return inherited::TraverseStmt(S);
116
117      return true;
118    }
119
120    /// \brief Suppress traversal into types that do not contain
121    /// unexpanded parameter packs.
122    bool TraverseType(QualType T) {
123      if ((!T.isNull() && T->containsUnexpandedParameterPack()) || InLambda)
124        return inherited::TraverseType(T);
125
126      return true;
127    }
128
129    /// \brief Suppress traversel into types with location information
130    /// that do not contain unexpanded parameter packs.
131    bool TraverseTypeLoc(TypeLoc TL) {
132      if ((!TL.getType().isNull() &&
133           TL.getType()->containsUnexpandedParameterPack()) ||
134          InLambda)
135        return inherited::TraverseTypeLoc(TL);
136
137      return true;
138    }
139
140    /// \brief Suppress traversal of non-parameter declarations, since
141    /// they cannot contain unexpanded parameter packs.
142    bool TraverseDecl(Decl *D) {
143      if ((D && isa<ParmVarDecl>(D)) || InLambda)
144        return inherited::TraverseDecl(D);
145
146      return true;
147    }
148
149    /// \brief Suppress traversal of template argument pack expansions.
150    bool TraverseTemplateArgument(const TemplateArgument &Arg) {
151      if (Arg.isPackExpansion())
152        return true;
153
154      return inherited::TraverseTemplateArgument(Arg);
155    }
156
157    /// \brief Suppress traversal of template argument pack expansions.
158    bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc) {
159      if (ArgLoc.getArgument().isPackExpansion())
160        return true;
161
162      return inherited::TraverseTemplateArgumentLoc(ArgLoc);
163    }
164
165    /// \brief Note whether we're traversing a lambda containing an unexpanded
166    /// parameter pack. In this case, the unexpanded pack can occur anywhere,
167    /// including all the places where we normally wouldn't look. Within a
168    /// lambda, we don't propagate the 'contains unexpanded parameter pack' bit
169    /// outside an expression.
170    bool TraverseLambdaExpr(LambdaExpr *Lambda) {
171      // The ContainsUnexpandedParameterPack bit on a lambda is always correct,
172      // even if it's contained within another lambda.
173      if (!Lambda->containsUnexpandedParameterPack())
174        return true;
175
176      bool WasInLambda = InLambda;
177      InLambda = true;
178
179      // If any capture names a function parameter pack, that pack is expanded
180      // when the lambda is expanded.
181      for (LambdaExpr::capture_iterator I = Lambda->capture_begin(),
182                                        E = Lambda->capture_end();
183           I != E; ++I) {
184        if (I->capturesVariable()) {
185          VarDecl *VD = I->getCapturedVar();
186          if (VD->isParameterPack())
187            Unexpanded.push_back(std::make_pair(VD, I->getLocation()));
188        }
189      }
190
191      inherited::TraverseLambdaExpr(Lambda);
192
193      InLambda = WasInLambda;
194      return true;
195    }
196  };
197}
198
199/// \brief Diagnose all of the unexpanded parameter packs in the given
200/// vector.
201bool
202Sema::DiagnoseUnexpandedParameterPacks(SourceLocation Loc,
203                                       UnexpandedParameterPackContext UPPC,
204                                 ArrayRef<UnexpandedParameterPack> Unexpanded) {
205  if (Unexpanded.empty())
206    return false;
207
208  // If we are within a lambda expression, that lambda contains an unexpanded
209  // parameter pack, and we are done.
210  // FIXME: Store 'Unexpanded' on the lambda so we don't need to recompute it
211  // later.
212  for (unsigned N = FunctionScopes.size(); N; --N) {
213    if (sema::LambdaScopeInfo *LSI =
214          dyn_cast<sema::LambdaScopeInfo>(FunctionScopes[N-1])) {
215      LSI->ContainsUnexpandedParameterPack = true;
216      return false;
217    }
218  }
219
220  SmallVector<SourceLocation, 4> Locations;
221  SmallVector<IdentifierInfo *, 4> Names;
222  llvm::SmallPtrSet<IdentifierInfo *, 4> NamesKnown;
223
224  for (unsigned I = 0, N = Unexpanded.size(); I != N; ++I) {
225    IdentifierInfo *Name = 0;
226    if (const TemplateTypeParmType *TTP
227          = Unexpanded[I].first.dyn_cast<const TemplateTypeParmType *>())
228      Name = TTP->getIdentifier();
229    else
230      Name = Unexpanded[I].first.get<NamedDecl *>()->getIdentifier();
231
232    if (Name && NamesKnown.insert(Name))
233      Names.push_back(Name);
234
235    if (Unexpanded[I].second.isValid())
236      Locations.push_back(Unexpanded[I].second);
237  }
238
239  DiagnosticBuilder DB
240    = Names.size() == 0? Diag(Loc, diag::err_unexpanded_parameter_pack_0)
241                           << (int)UPPC
242    : Names.size() == 1? Diag(Loc, diag::err_unexpanded_parameter_pack_1)
243                           << (int)UPPC << Names[0]
244    : Names.size() == 2? Diag(Loc, diag::err_unexpanded_parameter_pack_2)
245                           << (int)UPPC << Names[0] << Names[1]
246    : Diag(Loc, diag::err_unexpanded_parameter_pack_3_or_more)
247        << (int)UPPC << Names[0] << Names[1];
248
249  for (unsigned I = 0, N = Locations.size(); I != N; ++I)
250    DB << SourceRange(Locations[I]);
251  return true;
252}
253
254bool Sema::DiagnoseUnexpandedParameterPack(SourceLocation Loc,
255                                           TypeSourceInfo *T,
256                                         UnexpandedParameterPackContext UPPC) {
257  // C++0x [temp.variadic]p5:
258  //   An appearance of a name of a parameter pack that is not expanded is
259  //   ill-formed.
260  if (!T->getType()->containsUnexpandedParameterPack())
261    return false;
262
263  SmallVector<UnexpandedParameterPack, 2> Unexpanded;
264  CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseTypeLoc(
265                                                              T->getTypeLoc());
266  assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
267  return DiagnoseUnexpandedParameterPacks(Loc, UPPC, Unexpanded);
268}
269
270bool Sema::DiagnoseUnexpandedParameterPack(Expr *E,
271                                        UnexpandedParameterPackContext UPPC) {
272  // C++0x [temp.variadic]p5:
273  //   An appearance of a name of a parameter pack that is not expanded is
274  //   ill-formed.
275  if (!E->containsUnexpandedParameterPack())
276    return false;
277
278  SmallVector<UnexpandedParameterPack, 2> Unexpanded;
279  CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseStmt(E);
280  assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
281  return DiagnoseUnexpandedParameterPacks(E->getLocStart(), UPPC, Unexpanded);
282}
283
284bool Sema::DiagnoseUnexpandedParameterPack(const CXXScopeSpec &SS,
285                                        UnexpandedParameterPackContext UPPC) {
286  // C++0x [temp.variadic]p5:
287  //   An appearance of a name of a parameter pack that is not expanded is
288  //   ill-formed.
289  if (!SS.getScopeRep() ||
290      !SS.getScopeRep()->containsUnexpandedParameterPack())
291    return false;
292
293  SmallVector<UnexpandedParameterPack, 2> Unexpanded;
294  CollectUnexpandedParameterPacksVisitor(Unexpanded)
295    .TraverseNestedNameSpecifier(SS.getScopeRep());
296  assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
297  return DiagnoseUnexpandedParameterPacks(SS.getRange().getBegin(),
298                                          UPPC, Unexpanded);
299}
300
301bool Sema::DiagnoseUnexpandedParameterPack(const DeclarationNameInfo &NameInfo,
302                                         UnexpandedParameterPackContext UPPC) {
303  // C++0x [temp.variadic]p5:
304  //   An appearance of a name of a parameter pack that is not expanded is
305  //   ill-formed.
306  switch (NameInfo.getName().getNameKind()) {
307  case DeclarationName::Identifier:
308  case DeclarationName::ObjCZeroArgSelector:
309  case DeclarationName::ObjCOneArgSelector:
310  case DeclarationName::ObjCMultiArgSelector:
311  case DeclarationName::CXXOperatorName:
312  case DeclarationName::CXXLiteralOperatorName:
313  case DeclarationName::CXXUsingDirective:
314    return false;
315
316  case DeclarationName::CXXConstructorName:
317  case DeclarationName::CXXDestructorName:
318  case DeclarationName::CXXConversionFunctionName:
319    // FIXME: We shouldn't need this null check!
320    if (TypeSourceInfo *TSInfo = NameInfo.getNamedTypeInfo())
321      return DiagnoseUnexpandedParameterPack(NameInfo.getLoc(), TSInfo, UPPC);
322
323    if (!NameInfo.getName().getCXXNameType()->containsUnexpandedParameterPack())
324      return false;
325
326    break;
327  }
328
329  SmallVector<UnexpandedParameterPack, 2> Unexpanded;
330  CollectUnexpandedParameterPacksVisitor(Unexpanded)
331    .TraverseType(NameInfo.getName().getCXXNameType());
332  assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
333  return DiagnoseUnexpandedParameterPacks(NameInfo.getLoc(), UPPC, Unexpanded);
334}
335
336bool Sema::DiagnoseUnexpandedParameterPack(SourceLocation Loc,
337                                           TemplateName Template,
338                                       UnexpandedParameterPackContext UPPC) {
339
340  if (Template.isNull() || !Template.containsUnexpandedParameterPack())
341    return false;
342
343  SmallVector<UnexpandedParameterPack, 2> Unexpanded;
344  CollectUnexpandedParameterPacksVisitor(Unexpanded)
345    .TraverseTemplateName(Template);
346  assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
347  return DiagnoseUnexpandedParameterPacks(Loc, UPPC, Unexpanded);
348}
349
350bool Sema::DiagnoseUnexpandedParameterPack(TemplateArgumentLoc Arg,
351                                         UnexpandedParameterPackContext UPPC) {
352  if (Arg.getArgument().isNull() ||
353      !Arg.getArgument().containsUnexpandedParameterPack())
354    return false;
355
356  SmallVector<UnexpandedParameterPack, 2> Unexpanded;
357  CollectUnexpandedParameterPacksVisitor(Unexpanded)
358    .TraverseTemplateArgumentLoc(Arg);
359  assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
360  return DiagnoseUnexpandedParameterPacks(Arg.getLocation(), UPPC, Unexpanded);
361}
362
363void Sema::collectUnexpandedParameterPacks(TemplateArgument Arg,
364                   SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
365  CollectUnexpandedParameterPacksVisitor(Unexpanded)
366    .TraverseTemplateArgument(Arg);
367}
368
369void Sema::collectUnexpandedParameterPacks(TemplateArgumentLoc Arg,
370                   SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
371  CollectUnexpandedParameterPacksVisitor(Unexpanded)
372    .TraverseTemplateArgumentLoc(Arg);
373}
374
375void Sema::collectUnexpandedParameterPacks(QualType T,
376                   SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
377  CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseType(T);
378}
379
380void Sema::collectUnexpandedParameterPacks(TypeLoc TL,
381                   SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
382  CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseTypeLoc(TL);
383}
384
385void Sema::collectUnexpandedParameterPacks(CXXScopeSpec &SS,
386                                           SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
387  NestedNameSpecifier *Qualifier = SS.getScopeRep();
388  if (!Qualifier)
389    return;
390
391  NestedNameSpecifierLoc QualifierLoc(Qualifier, SS.location_data());
392  CollectUnexpandedParameterPacksVisitor(Unexpanded)
393    .TraverseNestedNameSpecifierLoc(QualifierLoc);
394}
395
396void Sema::collectUnexpandedParameterPacks(const DeclarationNameInfo &NameInfo,
397                         SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
398  CollectUnexpandedParameterPacksVisitor(Unexpanded)
399    .TraverseDeclarationNameInfo(NameInfo);
400}
401
402
403ParsedTemplateArgument
404Sema::ActOnPackExpansion(const ParsedTemplateArgument &Arg,
405                         SourceLocation EllipsisLoc) {
406  if (Arg.isInvalid())
407    return Arg;
408
409  switch (Arg.getKind()) {
410  case ParsedTemplateArgument::Type: {
411    TypeResult Result = ActOnPackExpansion(Arg.getAsType(), EllipsisLoc);
412    if (Result.isInvalid())
413      return ParsedTemplateArgument();
414
415    return ParsedTemplateArgument(Arg.getKind(), Result.get().getAsOpaquePtr(),
416                                  Arg.getLocation());
417  }
418
419  case ParsedTemplateArgument::NonType: {
420    ExprResult Result = ActOnPackExpansion(Arg.getAsExpr(), EllipsisLoc);
421    if (Result.isInvalid())
422      return ParsedTemplateArgument();
423
424    return ParsedTemplateArgument(Arg.getKind(), Result.get(),
425                                  Arg.getLocation());
426  }
427
428  case ParsedTemplateArgument::Template:
429    if (!Arg.getAsTemplate().get().containsUnexpandedParameterPack()) {
430      SourceRange R(Arg.getLocation());
431      if (Arg.getScopeSpec().isValid())
432        R.setBegin(Arg.getScopeSpec().getBeginLoc());
433      Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
434        << R;
435      return ParsedTemplateArgument();
436    }
437
438    return Arg.getTemplatePackExpansion(EllipsisLoc);
439  }
440  llvm_unreachable("Unhandled template argument kind?");
441}
442
443TypeResult Sema::ActOnPackExpansion(ParsedType Type,
444                                    SourceLocation EllipsisLoc) {
445  TypeSourceInfo *TSInfo;
446  GetTypeFromParser(Type, &TSInfo);
447  if (!TSInfo)
448    return true;
449
450  TypeSourceInfo *TSResult = CheckPackExpansion(TSInfo, EllipsisLoc, None);
451  if (!TSResult)
452    return true;
453
454  return CreateParsedType(TSResult->getType(), TSResult);
455}
456
457TypeSourceInfo *
458Sema::CheckPackExpansion(TypeSourceInfo *Pattern, SourceLocation EllipsisLoc,
459                         Optional<unsigned> NumExpansions) {
460  // Create the pack expansion type and source-location information.
461  QualType Result = CheckPackExpansion(Pattern->getType(),
462                                       Pattern->getTypeLoc().getSourceRange(),
463                                       EllipsisLoc, NumExpansions);
464  if (Result.isNull())
465    return 0;
466
467  TypeSourceInfo *TSResult = Context.CreateTypeSourceInfo(Result);
468  PackExpansionTypeLoc TL =
469      TSResult->getTypeLoc().castAs<PackExpansionTypeLoc>();
470  TL.setEllipsisLoc(EllipsisLoc);
471
472  // Copy over the source-location information from the type.
473  memcpy(TL.getNextTypeLoc().getOpaqueData(),
474         Pattern->getTypeLoc().getOpaqueData(),
475         Pattern->getTypeLoc().getFullDataSize());
476  return TSResult;
477}
478
479QualType Sema::CheckPackExpansion(QualType Pattern, SourceRange PatternRange,
480                                  SourceLocation EllipsisLoc,
481                                  Optional<unsigned> NumExpansions) {
482  // C++0x [temp.variadic]p5:
483  //   The pattern of a pack expansion shall name one or more
484  //   parameter packs that are not expanded by a nested pack
485  //   expansion.
486  if (!Pattern->containsUnexpandedParameterPack()) {
487    Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
488      << PatternRange;
489    return QualType();
490  }
491
492  return Context.getPackExpansionType(Pattern, NumExpansions);
493}
494
495ExprResult Sema::ActOnPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc) {
496  return CheckPackExpansion(Pattern, EllipsisLoc, None);
497}
498
499ExprResult Sema::CheckPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
500                                    Optional<unsigned> NumExpansions) {
501  if (!Pattern)
502    return ExprError();
503
504  // C++0x [temp.variadic]p5:
505  //   The pattern of a pack expansion shall name one or more
506  //   parameter packs that are not expanded by a nested pack
507  //   expansion.
508  if (!Pattern->containsUnexpandedParameterPack()) {
509    Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
510    << Pattern->getSourceRange();
511    return ExprError();
512  }
513
514  // Create the pack expansion expression and source-location information.
515  return Owned(new (Context) PackExpansionExpr(Context.DependentTy, Pattern,
516                                               EllipsisLoc, NumExpansions));
517}
518
519/// \brief Retrieve the depth and index of a parameter pack.
520static std::pair<unsigned, unsigned>
521getDepthAndIndex(NamedDecl *ND) {
522  if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(ND))
523    return std::make_pair(TTP->getDepth(), TTP->getIndex());
524
525  if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(ND))
526    return std::make_pair(NTTP->getDepth(), NTTP->getIndex());
527
528  TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(ND);
529  return std::make_pair(TTP->getDepth(), TTP->getIndex());
530}
531
532bool Sema::CheckParameterPacksForExpansion(
533    SourceLocation EllipsisLoc, SourceRange PatternRange,
534    ArrayRef<UnexpandedParameterPack> Unexpanded,
535    const MultiLevelTemplateArgumentList &TemplateArgs, bool &ShouldExpand,
536    bool &RetainExpansion, Optional<unsigned> &NumExpansions) {
537  ShouldExpand = true;
538  RetainExpansion = false;
539  std::pair<IdentifierInfo *, SourceLocation> FirstPack;
540  bool HaveFirstPack = false;
541
542  for (ArrayRef<UnexpandedParameterPack>::iterator i = Unexpanded.begin(),
543                                                 end = Unexpanded.end();
544                                                  i != end; ++i) {
545    // Compute the depth and index for this parameter pack.
546    unsigned Depth = 0, Index = 0;
547    IdentifierInfo *Name;
548    bool IsFunctionParameterPack = false;
549
550    if (const TemplateTypeParmType *TTP
551        = i->first.dyn_cast<const TemplateTypeParmType *>()) {
552      Depth = TTP->getDepth();
553      Index = TTP->getIndex();
554      Name = TTP->getIdentifier();
555    } else {
556      NamedDecl *ND = i->first.get<NamedDecl *>();
557      if (isa<ParmVarDecl>(ND))
558        IsFunctionParameterPack = true;
559      else
560        llvm::tie(Depth, Index) = getDepthAndIndex(ND);
561
562      Name = ND->getIdentifier();
563    }
564
565    // Determine the size of this argument pack.
566    unsigned NewPackSize;
567    if (IsFunctionParameterPack) {
568      // Figure out whether we're instantiating to an argument pack or not.
569      typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack;
570
571      llvm::PointerUnion<Decl *, DeclArgumentPack *> *Instantiation
572        = CurrentInstantiationScope->findInstantiationOf(
573                                        i->first.get<NamedDecl *>());
574      if (Instantiation->is<DeclArgumentPack *>()) {
575        // We could expand this function parameter pack.
576        NewPackSize = Instantiation->get<DeclArgumentPack *>()->size();
577      } else {
578        // We can't expand this function parameter pack, so we can't expand
579        // the pack expansion.
580        ShouldExpand = false;
581        continue;
582      }
583    } else {
584      // If we don't have a template argument at this depth/index, then we
585      // cannot expand the pack expansion. Make a note of this, but we still
586      // want to check any parameter packs we *do* have arguments for.
587      if (Depth >= TemplateArgs.getNumLevels() ||
588          !TemplateArgs.hasTemplateArgument(Depth, Index)) {
589        ShouldExpand = false;
590        continue;
591      }
592
593      // Determine the size of the argument pack.
594      NewPackSize = TemplateArgs(Depth, Index).pack_size();
595    }
596
597    // C++0x [temp.arg.explicit]p9:
598    //   Template argument deduction can extend the sequence of template
599    //   arguments corresponding to a template parameter pack, even when the
600    //   sequence contains explicitly specified template arguments.
601    if (!IsFunctionParameterPack) {
602      if (NamedDecl *PartialPack
603                    = CurrentInstantiationScope->getPartiallySubstitutedPack()){
604        unsigned PartialDepth, PartialIndex;
605        llvm::tie(PartialDepth, PartialIndex) = getDepthAndIndex(PartialPack);
606        if (PartialDepth == Depth && PartialIndex == Index)
607          RetainExpansion = true;
608      }
609    }
610
611    if (!NumExpansions) {
612      // The is the first pack we've seen for which we have an argument.
613      // Record it.
614      NumExpansions = NewPackSize;
615      FirstPack.first = Name;
616      FirstPack.second = i->second;
617      HaveFirstPack = true;
618      continue;
619    }
620
621    if (NewPackSize != *NumExpansions) {
622      // C++0x [temp.variadic]p5:
623      //   All of the parameter packs expanded by a pack expansion shall have
624      //   the same number of arguments specified.
625      if (HaveFirstPack)
626        Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict)
627          << FirstPack.first << Name << *NumExpansions << NewPackSize
628          << SourceRange(FirstPack.second) << SourceRange(i->second);
629      else
630        Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict_multilevel)
631          << Name << *NumExpansions << NewPackSize
632          << SourceRange(i->second);
633      return true;
634    }
635  }
636
637  return false;
638}
639
640Optional<unsigned> Sema::getNumArgumentsInExpansion(QualType T,
641                          const MultiLevelTemplateArgumentList &TemplateArgs) {
642  QualType Pattern = cast<PackExpansionType>(T)->getPattern();
643  SmallVector<UnexpandedParameterPack, 2> Unexpanded;
644  CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseType(Pattern);
645
646  Optional<unsigned> Result;
647  for (unsigned I = 0, N = Unexpanded.size(); I != N; ++I) {
648    // Compute the depth and index for this parameter pack.
649    unsigned Depth;
650    unsigned Index;
651
652    if (const TemplateTypeParmType *TTP
653          = Unexpanded[I].first.dyn_cast<const TemplateTypeParmType *>()) {
654      Depth = TTP->getDepth();
655      Index = TTP->getIndex();
656    } else {
657      NamedDecl *ND = Unexpanded[I].first.get<NamedDecl *>();
658      if (isa<ParmVarDecl>(ND)) {
659        // Function parameter pack.
660        typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack;
661
662        llvm::PointerUnion<Decl *, DeclArgumentPack *> *Instantiation
663          = CurrentInstantiationScope->findInstantiationOf(
664                                        Unexpanded[I].first.get<NamedDecl *>());
665        if (Instantiation->is<Decl*>())
666          // The pattern refers to an unexpanded pack. We're not ready to expand
667          // this pack yet.
668          return None;
669
670        unsigned Size = Instantiation->get<DeclArgumentPack *>()->size();
671        assert((!Result || *Result == Size) && "inconsistent pack sizes");
672        Result = Size;
673        continue;
674      }
675
676      llvm::tie(Depth, Index) = getDepthAndIndex(ND);
677    }
678    if (Depth >= TemplateArgs.getNumLevels() ||
679        !TemplateArgs.hasTemplateArgument(Depth, Index))
680      // The pattern refers to an unknown template argument. We're not ready to
681      // expand this pack yet.
682      return None;
683
684    // Determine the size of the argument pack.
685    unsigned Size = TemplateArgs(Depth, Index).pack_size();
686    assert((!Result || *Result == Size) && "inconsistent pack sizes");
687    Result = Size;
688  }
689
690  return Result;
691}
692
693bool Sema::containsUnexpandedParameterPacks(Declarator &D) {
694  const DeclSpec &DS = D.getDeclSpec();
695  switch (DS.getTypeSpecType()) {
696  case TST_typename:
697  case TST_typeofType:
698  case TST_underlyingType:
699  case TST_atomic: {
700    QualType T = DS.getRepAsType().get();
701    if (!T.isNull() && T->containsUnexpandedParameterPack())
702      return true;
703    break;
704  }
705
706  case TST_typeofExpr:
707  case TST_decltype:
708    if (DS.getRepAsExpr() &&
709        DS.getRepAsExpr()->containsUnexpandedParameterPack())
710      return true;
711    break;
712
713  case TST_unspecified:
714  case TST_void:
715  case TST_char:
716  case TST_wchar:
717  case TST_char16:
718  case TST_char32:
719  case TST_int:
720  case TST_int128:
721  case TST_half:
722  case TST_float:
723  case TST_double:
724  case TST_bool:
725  case TST_decimal32:
726  case TST_decimal64:
727  case TST_decimal128:
728  case TST_enum:
729  case TST_union:
730  case TST_struct:
731  case TST_interface:
732  case TST_class:
733  case TST_auto:
734  case TST_decltype_auto:
735  case TST_unknown_anytype:
736  case TST_image1d_t:
737  case TST_image1d_array_t:
738  case TST_image1d_buffer_t:
739  case TST_image2d_t:
740  case TST_image2d_array_t:
741  case TST_image3d_t:
742  case TST_sampler_t:
743  case TST_event_t:
744  case TST_error:
745    break;
746  }
747
748  for (unsigned I = 0, N = D.getNumTypeObjects(); I != N; ++I) {
749    const DeclaratorChunk &Chunk = D.getTypeObject(I);
750    switch (Chunk.Kind) {
751    case DeclaratorChunk::Pointer:
752    case DeclaratorChunk::Reference:
753    case DeclaratorChunk::Paren:
754      // These declarator chunks cannot contain any parameter packs.
755      break;
756
757    case DeclaratorChunk::Array:
758    case DeclaratorChunk::Function:
759    case DeclaratorChunk::BlockPointer:
760      // Syntactically, these kinds of declarator chunks all come after the
761      // declarator-id (conceptually), so the parser should not invoke this
762      // routine at this time.
763      llvm_unreachable("Could not have seen this kind of declarator chunk");
764
765    case DeclaratorChunk::MemberPointer:
766      if (Chunk.Mem.Scope().getScopeRep() &&
767          Chunk.Mem.Scope().getScopeRep()->containsUnexpandedParameterPack())
768        return true;
769      break;
770    }
771  }
772
773  return false;
774}
775
776namespace {
777
778// Callback to only accept typo corrections that refer to parameter packs.
779class ParameterPackValidatorCCC : public CorrectionCandidateCallback {
780 public:
781  virtual bool ValidateCandidate(const TypoCorrection &candidate) {
782    NamedDecl *ND = candidate.getCorrectionDecl();
783    return ND && ND->isParameterPack();
784  }
785};
786
787}
788
789/// \brief Called when an expression computing the size of a parameter pack
790/// is parsed.
791///
792/// \code
793/// template<typename ...Types> struct count {
794///   static const unsigned value = sizeof...(Types);
795/// };
796/// \endcode
797///
798//
799/// \param OpLoc The location of the "sizeof" keyword.
800/// \param Name The name of the parameter pack whose size will be determined.
801/// \param NameLoc The source location of the name of the parameter pack.
802/// \param RParenLoc The location of the closing parentheses.
803ExprResult Sema::ActOnSizeofParameterPackExpr(Scope *S,
804                                              SourceLocation OpLoc,
805                                              IdentifierInfo &Name,
806                                              SourceLocation NameLoc,
807                                              SourceLocation RParenLoc) {
808  // C++0x [expr.sizeof]p5:
809  //   The identifier in a sizeof... expression shall name a parameter pack.
810  LookupResult R(*this, &Name, NameLoc, LookupOrdinaryName);
811  LookupName(R, S);
812
813  NamedDecl *ParameterPack = 0;
814  ParameterPackValidatorCCC Validator;
815  switch (R.getResultKind()) {
816  case LookupResult::Found:
817    ParameterPack = R.getFoundDecl();
818    break;
819
820  case LookupResult::NotFound:
821  case LookupResult::NotFoundInCurrentInstantiation:
822    if (TypoCorrection Corrected = CorrectTypo(R.getLookupNameInfo(),
823                                               R.getLookupKind(), S, 0,
824                                               Validator)) {
825      std::string CorrectedQuotedStr(Corrected.getQuoted(getLangOpts()));
826      ParameterPack = Corrected.getCorrectionDecl();
827      Diag(NameLoc, diag::err_sizeof_pack_no_pack_name_suggest)
828        << &Name << CorrectedQuotedStr
829        << FixItHint::CreateReplacement(
830            NameLoc, Corrected.getAsString(getLangOpts()));
831      Diag(ParameterPack->getLocation(), diag::note_parameter_pack_here)
832        << CorrectedQuotedStr;
833    }
834
835  case LookupResult::FoundOverloaded:
836  case LookupResult::FoundUnresolvedValue:
837    break;
838
839  case LookupResult::Ambiguous:
840    DiagnoseAmbiguousLookup(R);
841    return ExprError();
842  }
843
844  if (!ParameterPack || !ParameterPack->isParameterPack()) {
845    Diag(NameLoc, diag::err_sizeof_pack_no_pack_name)
846      << &Name;
847    return ExprError();
848  }
849
850  MarkAnyDeclReferenced(OpLoc, ParameterPack, true);
851
852  return new (Context) SizeOfPackExpr(Context.getSizeType(), OpLoc,
853                                      ParameterPack, NameLoc, RParenLoc);
854}
855