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