1c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor//===------- SemaTemplateVariadic.cpp - C++ Variadic Templates ------------===/
2c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor//
3c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor//                     The LLVM Compiler Infrastructure
4c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor//
5c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor// This file is distributed under the University of Illinois Open Source
6c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor// License. See LICENSE.TXT for details.
7c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor//===----------------------------------------------------------------------===/
8c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor//
9c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor//  This file implements semantic analysis for C++0x variadic templates.
10c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor//===----------------------------------------------------------------------===/
11c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor
12c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor#include "clang/Sema/Sema.h"
13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "TypeLocBuilder.h"
1455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/Expr.h"
1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/RecursiveASTVisitor.h"
1655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/TypeLoc.h"
17ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor#include "clang/Sema/Lookup.h"
187536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor#include "clang/Sema/ParsedTemplate.h"
19612409ece080e814f79e06772c690d603f45fbd6Richard Smith#include "clang/Sema/ScopeInfo.h"
20c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor#include "clang/Sema/SemaInternal.h"
218491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor#include "clang/Sema/Template.h"
22c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor
23c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregorusing namespace clang;
24c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor
259ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor//----------------------------------------------------------------------------
269ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor// Visitor that collects unexpanded parameter packs
279ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor//----------------------------------------------------------------------------
289ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
299ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregornamespace {
309ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor  /// \brief A class that collects unexpanded parameter packs.
319ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor  class CollectUnexpandedParameterPacksVisitor :
329ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    public RecursiveASTVisitor<CollectUnexpandedParameterPacksVisitor>
339ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor  {
349ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    typedef RecursiveASTVisitor<CollectUnexpandedParameterPacksVisitor>
359ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor      inherited;
369ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVectorImpl<UnexpandedParameterPack> &Unexpanded;
389ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
39612409ece080e814f79e06772c690d603f45fbd6Richard Smith    bool InLambda;
40612409ece080e814f79e06772c690d603f45fbd6Richard Smith
419ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor  public:
429ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    explicit CollectUnexpandedParameterPacksVisitor(
435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                  SmallVectorImpl<UnexpandedParameterPack> &Unexpanded)
44612409ece080e814f79e06772c690d603f45fbd6Richard Smith      : Unexpanded(Unexpanded), InLambda(false) { }
459ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
46a40bc724849f9cdc6a7706bc5d230685c3bdf63cDouglas Gregor    bool shouldWalkTypesOfTypeLocs() const { return false; }
47a40bc724849f9cdc6a7706bc5d230685c3bdf63cDouglas Gregor
489ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    //------------------------------------------------------------------------
499ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    // Recording occurrences of (unexpanded) parameter packs.
509ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    //------------------------------------------------------------------------
519ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
529ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    /// \brief Record occurrences of template type parameter packs.
539ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
549ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor      if (TL.getTypePtr()->isParameterPack())
559ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor        Unexpanded.push_back(std::make_pair(TL.getTypePtr(), TL.getNameLoc()));
569ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor      return true;
579ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    }
589ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
599ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    /// \brief Record occurrences of template type parameter packs
609ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    /// when we don't have proper source-location information for
619ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    /// them.
629ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    ///
639ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    /// Ideally, this routine would never be used.
649ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    bool VisitTemplateTypeParmType(TemplateTypeParmType *T) {
659ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor      if (T->isParameterPack())
669ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor        Unexpanded.push_back(std::make_pair(T, SourceLocation()));
679ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
689ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor      return true;
699ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    }
709ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
71a779d9ca2fdf1247f65de0e6acf2870d8be53ccdDouglas Gregor    /// \brief Record occurrences of function and non-type template
7210738d36b150aa65206890c1c845cdba076e4200Douglas Gregor    /// parameter packs in an expression.
7310738d36b150aa65206890c1c845cdba076e4200Douglas Gregor    bool VisitDeclRefExpr(DeclRefExpr *E) {
7412c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor      if (E->getDecl()->isParameterPack())
7512c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor        Unexpanded.push_back(std::make_pair(E->getDecl(), E->getLocation()));
7610738d36b150aa65206890c1c845cdba076e4200Douglas Gregor
7710738d36b150aa65206890c1c845cdba076e4200Douglas Gregor      return true;
7810738d36b150aa65206890c1c845cdba076e4200Douglas Gregor    }
7910738d36b150aa65206890c1c845cdba076e4200Douglas Gregor
8061c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor    /// \brief Record occurrences of template template parameter packs.
8161c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor    bool TraverseTemplateName(TemplateName Template) {
8261c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor      if (TemplateTemplateParmDecl *TTP
8361c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor            = dyn_cast_or_null<TemplateTemplateParmDecl>(
8461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                                  Template.getAsTemplateDecl()))
8561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor        if (TTP->isParameterPack())
8661c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor          Unexpanded.push_back(std::make_pair(TTP, SourceLocation()));
8761c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor
8861c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor      return inherited::TraverseTemplateName(Template);
8961c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor    }
909ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
91ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    /// \brief Suppress traversal into Objective-C container literal
92ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    /// elements that are pack expansions.
93ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    bool TraverseObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
94ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      if (!E->containsUnexpandedParameterPack())
95ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek        return true;
96ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
97ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
98ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek        ObjCDictionaryElement Element = E->getKeyValueElement(I);
99ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek        if (Element.isPackExpansion())
100ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek          continue;
101ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
102ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek        TraverseStmt(Element.Key);
103ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek        TraverseStmt(Element.Value);
104ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      }
105ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      return true;
106ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    }
1079ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    //------------------------------------------------------------------------
1089ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    // Pruning the search for unexpanded parameter packs.
1099ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    //------------------------------------------------------------------------
1109ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
1119ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    /// \brief Suppress traversal into statements and expressions that
1129ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    /// do not contain unexpanded parameter packs.
1139ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    bool TraverseStmt(Stmt *S) {
114612409ece080e814f79e06772c690d603f45fbd6Richard Smith      Expr *E = dyn_cast_or_null<Expr>(S);
115612409ece080e814f79e06772c690d603f45fbd6Richard Smith      if ((E && E->containsUnexpandedParameterPack()) || InLambda)
116612409ece080e814f79e06772c690d603f45fbd6Richard Smith        return inherited::TraverseStmt(S);
1179ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
118612409ece080e814f79e06772c690d603f45fbd6Richard Smith      return true;
1199ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    }
1209ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
1219ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    /// \brief Suppress traversal into types that do not contain
1229ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    /// unexpanded parameter packs.
1239ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    bool TraverseType(QualType T) {
124612409ece080e814f79e06772c690d603f45fbd6Richard Smith      if ((!T.isNull() && T->containsUnexpandedParameterPack()) || InLambda)
1259ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor        return inherited::TraverseType(T);
1269ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
1279ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor      return true;
1289ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    }
1299ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
1309ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    /// \brief Suppress traversel into types with location information
1319ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    /// that do not contain unexpanded parameter packs.
1329ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    bool TraverseTypeLoc(TypeLoc TL) {
133612409ece080e814f79e06772c690d603f45fbd6Richard Smith      if ((!TL.getType().isNull() &&
134612409ece080e814f79e06772c690d603f45fbd6Richard Smith           TL.getType()->containsUnexpandedParameterPack()) ||
135612409ece080e814f79e06772c690d603f45fbd6Richard Smith          InLambda)
1369ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor        return inherited::TraverseTypeLoc(TL);
1379ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
1389ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor      return true;
1399ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    }
1409ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
141cff163e3cc78277496b30fa40070b46abdc290dbDouglas Gregor    /// \brief Suppress traversal of non-parameter declarations, since
142cff163e3cc78277496b30fa40070b46abdc290dbDouglas Gregor    /// they cannot contain unexpanded parameter packs.
143cff163e3cc78277496b30fa40070b46abdc290dbDouglas Gregor    bool TraverseDecl(Decl *D) {
144612409ece080e814f79e06772c690d603f45fbd6Richard Smith      if ((D && isa<ParmVarDecl>(D)) || InLambda)
145cff163e3cc78277496b30fa40070b46abdc290dbDouglas Gregor        return inherited::TraverseDecl(D);
146cff163e3cc78277496b30fa40070b46abdc290dbDouglas Gregor
147612409ece080e814f79e06772c690d603f45fbd6Richard Smith      return true;
148cff163e3cc78277496b30fa40070b46abdc290dbDouglas Gregor    }
149ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor
150ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    /// \brief Suppress traversal of template argument pack expansions.
151ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    bool TraverseTemplateArgument(const TemplateArgument &Arg) {
152ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor      if (Arg.isPackExpansion())
153ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor        return true;
154ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor
155ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor      return inherited::TraverseTemplateArgument(Arg);
156ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    }
157ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor
158ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    /// \brief Suppress traversal of template argument pack expansions.
159ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc) {
160ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor      if (ArgLoc.getArgument().isPackExpansion())
161ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor        return true;
162ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor
163ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor      return inherited::TraverseTemplateArgumentLoc(ArgLoc);
164ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    }
165612409ece080e814f79e06772c690d603f45fbd6Richard Smith
166612409ece080e814f79e06772c690d603f45fbd6Richard Smith    /// \brief Note whether we're traversing a lambda containing an unexpanded
167612409ece080e814f79e06772c690d603f45fbd6Richard Smith    /// parameter pack. In this case, the unexpanded pack can occur anywhere,
168612409ece080e814f79e06772c690d603f45fbd6Richard Smith    /// including all the places where we normally wouldn't look. Within a
169612409ece080e814f79e06772c690d603f45fbd6Richard Smith    /// lambda, we don't propagate the 'contains unexpanded parameter pack' bit
170612409ece080e814f79e06772c690d603f45fbd6Richard Smith    /// outside an expression.
171612409ece080e814f79e06772c690d603f45fbd6Richard Smith    bool TraverseLambdaExpr(LambdaExpr *Lambda) {
172612409ece080e814f79e06772c690d603f45fbd6Richard Smith      // The ContainsUnexpandedParameterPack bit on a lambda is always correct,
173612409ece080e814f79e06772c690d603f45fbd6Richard Smith      // even if it's contained within another lambda.
174612409ece080e814f79e06772c690d603f45fbd6Richard Smith      if (!Lambda->containsUnexpandedParameterPack())
175612409ece080e814f79e06772c690d603f45fbd6Richard Smith        return true;
176612409ece080e814f79e06772c690d603f45fbd6Richard Smith
177612409ece080e814f79e06772c690d603f45fbd6Richard Smith      bool WasInLambda = InLambda;
178612409ece080e814f79e06772c690d603f45fbd6Richard Smith      InLambda = true;
179612409ece080e814f79e06772c690d603f45fbd6Richard Smith
180612409ece080e814f79e06772c690d603f45fbd6Richard Smith      // If any capture names a function parameter pack, that pack is expanded
181612409ece080e814f79e06772c690d603f45fbd6Richard Smith      // when the lambda is expanded.
182612409ece080e814f79e06772c690d603f45fbd6Richard Smith      for (LambdaExpr::capture_iterator I = Lambda->capture_begin(),
1830d8e9646bc000bab521ce52ed294209a92298cefRichard Smith                                        E = Lambda->capture_end();
1840d8e9646bc000bab521ce52ed294209a92298cefRichard Smith           I != E; ++I) {
1850d8e9646bc000bab521ce52ed294209a92298cefRichard Smith        if (I->capturesVariable()) {
1860d8e9646bc000bab521ce52ed294209a92298cefRichard Smith          VarDecl *VD = I->getCapturedVar();
187612409ece080e814f79e06772c690d603f45fbd6Richard Smith          if (VD->isParameterPack())
188612409ece080e814f79e06772c690d603f45fbd6Richard Smith            Unexpanded.push_back(std::make_pair(VD, I->getLocation()));
1890d8e9646bc000bab521ce52ed294209a92298cefRichard Smith        }
1900d8e9646bc000bab521ce52ed294209a92298cefRichard Smith      }
191612409ece080e814f79e06772c690d603f45fbd6Richard Smith
192612409ece080e814f79e06772c690d603f45fbd6Richard Smith      inherited::TraverseLambdaExpr(Lambda);
193612409ece080e814f79e06772c690d603f45fbd6Richard Smith
194612409ece080e814f79e06772c690d603f45fbd6Richard Smith      InLambda = WasInLambda;
195612409ece080e814f79e06772c690d603f45fbd6Richard Smith      return true;
196612409ece080e814f79e06772c690d603f45fbd6Richard Smith    }
1979ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor  };
1989ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor}
1999ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
2009ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor/// \brief Diagnose all of the unexpanded parameter packs in the given
2019ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor/// vector.
202612409ece080e814f79e06772c690d603f45fbd6Richard Smithbool
20365019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas GregorSema::DiagnoseUnexpandedParameterPacks(SourceLocation Loc,
20465019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor                                       UnexpandedParameterPackContext UPPC,
2054fe5be028b723fedc28bb33be96cde1ab2574ee6Bill Wendling                                 ArrayRef<UnexpandedParameterPack> Unexpanded) {
20665019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  if (Unexpanded.empty())
207612409ece080e814f79e06772c690d603f45fbd6Richard Smith    return false;
208612409ece080e814f79e06772c690d603f45fbd6Richard Smith
209612409ece080e814f79e06772c690d603f45fbd6Richard Smith  // If we are within a lambda expression, that lambda contains an unexpanded
210612409ece080e814f79e06772c690d603f45fbd6Richard Smith  // parameter pack, and we are done.
211612409ece080e814f79e06772c690d603f45fbd6Richard Smith  // FIXME: Store 'Unexpanded' on the lambda so we don't need to recompute it
212612409ece080e814f79e06772c690d603f45fbd6Richard Smith  // later.
213612409ece080e814f79e06772c690d603f45fbd6Richard Smith  for (unsigned N = FunctionScopes.size(); N; --N) {
214612409ece080e814f79e06772c690d603f45fbd6Richard Smith    if (sema::LambdaScopeInfo *LSI =
215612409ece080e814f79e06772c690d603f45fbd6Richard Smith          dyn_cast<sema::LambdaScopeInfo>(FunctionScopes[N-1])) {
216612409ece080e814f79e06772c690d603f45fbd6Richard Smith      LSI->ContainsUnexpandedParameterPack = true;
217612409ece080e814f79e06772c690d603f45fbd6Richard Smith      return false;
218612409ece080e814f79e06772c690d603f45fbd6Richard Smith    }
219612409ece080e814f79e06772c690d603f45fbd6Richard Smith  }
22065019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor
2215f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<SourceLocation, 4> Locations;
2225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<IdentifierInfo *, 4> Names;
2239ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor  llvm::SmallPtrSet<IdentifierInfo *, 4> NamesKnown;
2249ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
2259ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor  for (unsigned I = 0, N = Unexpanded.size(); I != N; ++I) {
2266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    IdentifierInfo *Name = nullptr;
2279ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    if (const TemplateTypeParmType *TTP
2289ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor          = Unexpanded[I].first.dyn_cast<const TemplateTypeParmType *>())
229b7efff4bae117604f442bb6859c844f90b15f3ffChandler Carruth      Name = TTP->getIdentifier();
2309ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    else
2319ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor      Name = Unexpanded[I].first.get<NamedDecl *>()->getIdentifier();
2329ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
2339ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    if (Name && NamesKnown.insert(Name))
2349ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor      Names.push_back(Name);
2359ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
2369ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    if (Unexpanded[I].second.isValid())
2379ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor      Locations.push_back(Unexpanded[I].second);
2389ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor  }
2399ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
2409ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor  DiagnosticBuilder DB
24165019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor    = Names.size() == 0? Diag(Loc, diag::err_unexpanded_parameter_pack_0)
2429ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor                           << (int)UPPC
24365019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor    : Names.size() == 1? Diag(Loc, diag::err_unexpanded_parameter_pack_1)
2449ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor                           << (int)UPPC << Names[0]
24565019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor    : Names.size() == 2? Diag(Loc, diag::err_unexpanded_parameter_pack_2)
2469ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor                           << (int)UPPC << Names[0] << Names[1]
24765019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor    : Diag(Loc, diag::err_unexpanded_parameter_pack_3_or_more)
2489ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor        << (int)UPPC << Names[0] << Names[1];
2499ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
2509ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor  for (unsigned I = 0, N = Locations.size(); I != N; ++I)
2519ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor    DB << SourceRange(Locations[I]);
252612409ece080e814f79e06772c690d603f45fbd6Richard Smith  return true;
2539ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor}
2549ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor
255c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregorbool Sema::DiagnoseUnexpandedParameterPack(SourceLocation Loc,
256c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor                                           TypeSourceInfo *T,
257c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor                                         UnexpandedParameterPackContext UPPC) {
258c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor  // C++0x [temp.variadic]p5:
259c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor  //   An appearance of a name of a parameter pack that is not expanded is
260c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor  //   ill-formed.
261c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor  if (!T->getType()->containsUnexpandedParameterPack())
262c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor    return false;
263c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor
2645f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<UnexpandedParameterPack, 2> Unexpanded;
2659ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor  CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseTypeLoc(
2669ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor                                                              T->getTypeLoc());
2679ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor  assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
268612409ece080e814f79e06772c690d603f45fbd6Richard Smith  return DiagnoseUnexpandedParameterPacks(Loc, UPPC, Unexpanded);
269c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor}
270c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor
271c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregorbool Sema::DiagnoseUnexpandedParameterPack(Expr *E,
27256c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor                                        UnexpandedParameterPackContext UPPC) {
273c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor  // C++0x [temp.variadic]p5:
274c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor  //   An appearance of a name of a parameter pack that is not expanded is
275c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor  //   ill-formed.
276c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor  if (!E->containsUnexpandedParameterPack())
277c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor    return false;
278c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor
2795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<UnexpandedParameterPack, 2> Unexpanded;
2809ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor  CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseStmt(E);
2819ef75899bae6dd9a4be1252ae9cadcb619c170ffDouglas Gregor  assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
282612409ece080e814f79e06772c690d603f45fbd6Richard Smith  return DiagnoseUnexpandedParameterPacks(E->getLocStart(), UPPC, Unexpanded);
283c46333550f5787b6d48ca3043e14ba9594cb632dDouglas Gregor}
28456c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor
28556c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregorbool Sema::DiagnoseUnexpandedParameterPack(const CXXScopeSpec &SS,
28656c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor                                        UnexpandedParameterPackContext UPPC) {
28756c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  // C++0x [temp.variadic]p5:
28856c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  //   An appearance of a name of a parameter pack that is not expanded is
28956c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  //   ill-formed.
29056c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  if (!SS.getScopeRep() ||
29156c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor      !SS.getScopeRep()->containsUnexpandedParameterPack())
29256c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor    return false;
29356c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor
2945f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<UnexpandedParameterPack, 2> Unexpanded;
29556c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  CollectUnexpandedParameterPacksVisitor(Unexpanded)
29656c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor    .TraverseNestedNameSpecifier(SS.getScopeRep());
29756c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
298612409ece080e814f79e06772c690d603f45fbd6Richard Smith  return DiagnoseUnexpandedParameterPacks(SS.getRange().getBegin(),
299612409ece080e814f79e06772c690d603f45fbd6Richard Smith                                          UPPC, Unexpanded);
30056c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor}
30156c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor
30256c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregorbool Sema::DiagnoseUnexpandedParameterPack(const DeclarationNameInfo &NameInfo,
30356c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor                                         UnexpandedParameterPackContext UPPC) {
30456c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  // C++0x [temp.variadic]p5:
30556c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  //   An appearance of a name of a parameter pack that is not expanded is
30656c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  //   ill-formed.
30756c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  switch (NameInfo.getName().getNameKind()) {
30856c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  case DeclarationName::Identifier:
30956c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  case DeclarationName::ObjCZeroArgSelector:
31056c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  case DeclarationName::ObjCOneArgSelector:
31156c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  case DeclarationName::ObjCMultiArgSelector:
31256c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  case DeclarationName::CXXOperatorName:
31356c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  case DeclarationName::CXXLiteralOperatorName:
31456c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  case DeclarationName::CXXUsingDirective:
31556c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor    return false;
31656c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor
31756c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  case DeclarationName::CXXConstructorName:
31856c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  case DeclarationName::CXXDestructorName:
31956c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  case DeclarationName::CXXConversionFunctionName:
320099ffe812664e3a24164710c181c26e646391250Douglas Gregor    // FIXME: We shouldn't need this null check!
3210762bfd268552d260899cb414800eadf3b4741b9Douglas Gregor    if (TypeSourceInfo *TSInfo = NameInfo.getNamedTypeInfo())
3220762bfd268552d260899cb414800eadf3b4741b9Douglas Gregor      return DiagnoseUnexpandedParameterPack(NameInfo.getLoc(), TSInfo, UPPC);
3230762bfd268552d260899cb414800eadf3b4741b9Douglas Gregor
3240762bfd268552d260899cb414800eadf3b4741b9Douglas Gregor    if (!NameInfo.getName().getCXXNameType()->containsUnexpandedParameterPack())
32556c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor      return false;
3260762bfd268552d260899cb414800eadf3b4741b9Douglas Gregor
32756c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor    break;
32856c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  }
32956c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor
3305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<UnexpandedParameterPack, 2> Unexpanded;
33156c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  CollectUnexpandedParameterPacksVisitor(Unexpanded)
3320762bfd268552d260899cb414800eadf3b4741b9Douglas Gregor    .TraverseType(NameInfo.getName().getCXXNameType());
33356c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor  assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
334612409ece080e814f79e06772c690d603f45fbd6Richard Smith  return DiagnoseUnexpandedParameterPacks(NameInfo.getLoc(), UPPC, Unexpanded);
33556c04588ef3cfa1bbc968fd68de2480a4e66971dDouglas Gregor}
3366f52675ec400a0ee89ec6214c4845b8ee274304aDouglas Gregor
3376f52675ec400a0ee89ec6214c4845b8ee274304aDouglas Gregorbool Sema::DiagnoseUnexpandedParameterPack(SourceLocation Loc,
3386f52675ec400a0ee89ec6214c4845b8ee274304aDouglas Gregor                                           TemplateName Template,
3396f52675ec400a0ee89ec6214c4845b8ee274304aDouglas Gregor                                       UnexpandedParameterPackContext UPPC) {
3406f52675ec400a0ee89ec6214c4845b8ee274304aDouglas Gregor
3416f52675ec400a0ee89ec6214c4845b8ee274304aDouglas Gregor  if (Template.isNull() || !Template.containsUnexpandedParameterPack())
3426f52675ec400a0ee89ec6214c4845b8ee274304aDouglas Gregor    return false;
3436f52675ec400a0ee89ec6214c4845b8ee274304aDouglas Gregor
3445f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3456f52675ec400a0ee89ec6214c4845b8ee274304aDouglas Gregor  CollectUnexpandedParameterPacksVisitor(Unexpanded)
3466f52675ec400a0ee89ec6214c4845b8ee274304aDouglas Gregor    .TraverseTemplateName(Template);
3476f52675ec400a0ee89ec6214c4845b8ee274304aDouglas Gregor  assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
348612409ece080e814f79e06772c690d603f45fbd6Richard Smith  return DiagnoseUnexpandedParameterPacks(Loc, UPPC, Unexpanded);
3496f52675ec400a0ee89ec6214c4845b8ee274304aDouglas Gregor}
3506f52675ec400a0ee89ec6214c4845b8ee274304aDouglas Gregor
351925910d488051cbd4e38f350c1e9d69c473f09a0Douglas Gregorbool Sema::DiagnoseUnexpandedParameterPack(TemplateArgumentLoc Arg,
352925910d488051cbd4e38f350c1e9d69c473f09a0Douglas Gregor                                         UnexpandedParameterPackContext UPPC) {
353925910d488051cbd4e38f350c1e9d69c473f09a0Douglas Gregor  if (Arg.getArgument().isNull() ||
354925910d488051cbd4e38f350c1e9d69c473f09a0Douglas Gregor      !Arg.getArgument().containsUnexpandedParameterPack())
355925910d488051cbd4e38f350c1e9d69c473f09a0Douglas Gregor    return false;
356925910d488051cbd4e38f350c1e9d69c473f09a0Douglas Gregor
3575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<UnexpandedParameterPack, 2> Unexpanded;
358925910d488051cbd4e38f350c1e9d69c473f09a0Douglas Gregor  CollectUnexpandedParameterPacksVisitor(Unexpanded)
359925910d488051cbd4e38f350c1e9d69c473f09a0Douglas Gregor    .TraverseTemplateArgumentLoc(Arg);
360925910d488051cbd4e38f350c1e9d69c473f09a0Douglas Gregor  assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
361612409ece080e814f79e06772c690d603f45fbd6Richard Smith  return DiagnoseUnexpandedParameterPacks(Arg.getLocation(), UPPC, Unexpanded);
362925910d488051cbd4e38f350c1e9d69c473f09a0Douglas Gregor}
363925910d488051cbd4e38f350c1e9d69c473f09a0Douglas Gregor
364e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregorvoid Sema::collectUnexpandedParameterPacks(TemplateArgument Arg,
3655f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                   SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
366e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor  CollectUnexpandedParameterPacksVisitor(Unexpanded)
367e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor    .TraverseTemplateArgument(Arg);
368e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor}
369e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor
3708491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregorvoid Sema::collectUnexpandedParameterPacks(TemplateArgumentLoc Arg,
3715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                   SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
3728491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  CollectUnexpandedParameterPacksVisitor(Unexpanded)
3738491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    .TraverseTemplateArgumentLoc(Arg);
3748491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor}
3758491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
376b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregorvoid Sema::collectUnexpandedParameterPacks(QualType T,
3775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                   SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
378b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor  CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseType(T);
379b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor}
380b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor
381f90b27ad077c3339b62befc892382845339f9490Douglas Gregorvoid Sema::collectUnexpandedParameterPacks(TypeLoc TL,
3825f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                   SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
383f90b27ad077c3339b62befc892382845339f9490Douglas Gregor  CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseTypeLoc(TL);
384f90b27ad077c3339b62befc892382845339f9490Douglas Gregor}
385f90b27ad077c3339b62befc892382845339f9490Douglas Gregor
38665019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregorvoid Sema::collectUnexpandedParameterPacks(CXXScopeSpec &SS,
38765019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor                                           SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
38865019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  NestedNameSpecifier *Qualifier = SS.getScopeRep();
38965019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  if (!Qualifier)
39065019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor    return;
39165019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor
39265019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  NestedNameSpecifierLoc QualifierLoc(Qualifier, SS.location_data());
39365019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  CollectUnexpandedParameterPacksVisitor(Unexpanded)
39465019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor    .TraverseNestedNameSpecifierLoc(QualifierLoc);
39565019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor}
39665019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor
39765019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregorvoid Sema::collectUnexpandedParameterPacks(const DeclarationNameInfo &NameInfo,
39865019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor                         SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
39965019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor  CollectUnexpandedParameterPacksVisitor(Unexpanded)
40065019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor    .TraverseDeclarationNameInfo(NameInfo);
40165019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor}
40265019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor
40365019acfc46ffb191fac4e781ac0c4b8d0c8434eDouglas Gregor
4047536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas GregorParsedTemplateArgument
4057536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas GregorSema::ActOnPackExpansion(const ParsedTemplateArgument &Arg,
4067536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor                         SourceLocation EllipsisLoc) {
4077536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  if (Arg.isInvalid())
4087536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    return Arg;
4097536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
4107536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  switch (Arg.getKind()) {
4117536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  case ParsedTemplateArgument::Type: {
4127536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    TypeResult Result = ActOnPackExpansion(Arg.getAsType(), EllipsisLoc);
4137536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    if (Result.isInvalid())
4147536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor      return ParsedTemplateArgument();
4157536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
4167536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    return ParsedTemplateArgument(Arg.getKind(), Result.get().getAsOpaquePtr(),
4177536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor                                  Arg.getLocation());
4187536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  }
4197536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
420be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  case ParsedTemplateArgument::NonType: {
421be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor    ExprResult Result = ActOnPackExpansion(Arg.getAsExpr(), EllipsisLoc);
422be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor    if (Result.isInvalid())
423be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor      return ParsedTemplateArgument();
424be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor
425be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor    return ParsedTemplateArgument(Arg.getKind(), Result.get(),
426be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor                                  Arg.getLocation());
427be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  }
428be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor
4297536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  case ParsedTemplateArgument::Template:
430ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    if (!Arg.getAsTemplate().get().containsUnexpandedParameterPack()) {
431ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor      SourceRange R(Arg.getLocation());
432ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor      if (Arg.getScopeSpec().isValid())
433ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor        R.setBegin(Arg.getScopeSpec().getBeginLoc());
434ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor      Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
435ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor        << R;
436ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor      return ParsedTemplateArgument();
437ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    }
438ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor
439ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    return Arg.getTemplatePackExpansion(EllipsisLoc);
4407536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  }
4417536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  llvm_unreachable("Unhandled template argument kind?");
4427536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor}
4437536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
4447536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas GregorTypeResult Sema::ActOnPackExpansion(ParsedType Type,
4457536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor                                    SourceLocation EllipsisLoc) {
4467536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  TypeSourceInfo *TSInfo;
4477536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  GetTypeFromParser(Type, &TSInfo);
4487536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  if (!TSInfo)
4497536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    return true;
4507536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
45166874fb18afbffb8b2ca05576851a64534be3352David Blaikie  TypeSourceInfo *TSResult = CheckPackExpansion(TSInfo, EllipsisLoc, None);
4528491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  if (!TSResult)
4538491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    return true;
4548491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
4558491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  return CreateParsedType(TSResult->getType(), TSResult);
4568491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor}
4578491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
458dc84cd5efdd3430efb22546b4ac656aa0540b210David BlaikieTypeSourceInfo *
459dc84cd5efdd3430efb22546b4ac656aa0540b210David BlaikieSema::CheckPackExpansion(TypeSourceInfo *Pattern, SourceLocation EllipsisLoc,
460dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie                         Optional<unsigned> NumExpansions) {
4612fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  // Create the pack expansion type and source-location information.
4622fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  QualType Result = CheckPackExpansion(Pattern->getType(),
4632fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor                                       Pattern->getTypeLoc().getSourceRange(),
464cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                       EllipsisLoc, NumExpansions);
4652fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  if (Result.isNull())
4666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return nullptr;
46744ee0a710c59d8e6793189f903bae21c16814324Eli Friedman
46844ee0a710c59d8e6793189f903bae21c16814324Eli Friedman  TypeLocBuilder TLB;
46944ee0a710c59d8e6793189f903bae21c16814324Eli Friedman  TLB.pushFullCopy(Pattern->getTypeLoc());
47044ee0a710c59d8e6793189f903bae21c16814324Eli Friedman  PackExpansionTypeLoc TL = TLB.push<PackExpansionTypeLoc>(Result);
4717536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor  TL.setEllipsisLoc(EllipsisLoc);
47244ee0a710c59d8e6793189f903bae21c16814324Eli Friedman
47344ee0a710c59d8e6793189f903bae21c16814324Eli Friedman  return TLB.getTypeSourceInfo(Context, Result);
4747536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor}
475b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor
476dc84cd5efdd3430efb22546b4ac656aa0540b210David BlaikieQualType Sema::CheckPackExpansion(QualType Pattern, SourceRange PatternRange,
477cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                  SourceLocation EllipsisLoc,
478dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie                                  Optional<unsigned> NumExpansions) {
4792fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  // C++0x [temp.variadic]p5:
4802fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  //   The pattern of a pack expansion shall name one or more
4812fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  //   parameter packs that are not expanded by a nested pack
4822fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  //   expansion.
4832fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  if (!Pattern->containsUnexpandedParameterPack()) {
4842fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor    Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
4852fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor      << PatternRange;
4862fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor    return QualType();
4872fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor  }
4882fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
489cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor  return Context.getPackExpansionType(Pattern, NumExpansions);
4902fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor}
4912fc1bb76e719d0620b4a6e2134413933b21ca6b6Douglas Gregor
492be230c36e32142cbdcdbe9c97511d097beeecbabDouglas GregorExprResult Sema::ActOnPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc) {
49366874fb18afbffb8b2ca05576851a64534be3352David Blaikie  return CheckPackExpansion(Pattern, EllipsisLoc, None);
49467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor}
49567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor
49667fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas GregorExprResult Sema::CheckPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
497dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie                                    Optional<unsigned> NumExpansions) {
498be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  if (!Pattern)
499be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor    return ExprError();
500be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor
501be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  // C++0x [temp.variadic]p5:
502be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  //   The pattern of a pack expansion shall name one or more
503be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  //   parameter packs that are not expanded by a nested pack
504be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  //   expansion.
505be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  if (!Pattern->containsUnexpandedParameterPack()) {
506be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor    Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
507be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor    << Pattern->getSourceRange();
508be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor    return ExprError();
509be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  }
510be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor
511be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  // Create the pack expansion expression and source-location information.
512ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return new (Context)
513ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    PackExpansionExpr(Context.DependentTy, Pattern, EllipsisLoc, NumExpansions);
514be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor}
515b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor
516d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor/// \brief Retrieve the depth and index of a parameter pack.
517d3731198193eee92796ddeb493973b7a598b003eDouglas Gregorstatic std::pair<unsigned, unsigned>
518d3731198193eee92796ddeb493973b7a598b003eDouglas GregorgetDepthAndIndex(NamedDecl *ND) {
519d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(ND))
520d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor    return std::make_pair(TTP->getDepth(), TTP->getIndex());
521d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
522d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(ND))
523d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor    return std::make_pair(NTTP->getDepth(), NTTP->getIndex());
524d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
525d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(ND);
526d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  return std::make_pair(TTP->getDepth(), TTP->getIndex());
527d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor}
528d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor
529dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikiebool Sema::CheckParameterPacksForExpansion(
530dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie    SourceLocation EllipsisLoc, SourceRange PatternRange,
531dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie    ArrayRef<UnexpandedParameterPack> Unexpanded,
532dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie    const MultiLevelTemplateArgumentList &TemplateArgs, bool &ShouldExpand,
533dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie    bool &RetainExpansion, Optional<unsigned> &NumExpansions) {
534b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor  ShouldExpand = true;
535d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor  RetainExpansion = false;
536b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor  std::pair<IdentifierInfo *, SourceLocation> FirstPack;
537b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor  bool HaveFirstPack = false;
538b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor
539a71f9d0a5e1f8cafdd23a17e292de22fdc8e99ffDavid Blaikie  for (ArrayRef<UnexpandedParameterPack>::iterator i = Unexpanded.begin(),
540a71f9d0a5e1f8cafdd23a17e292de22fdc8e99ffDavid Blaikie                                                 end = Unexpanded.end();
541a71f9d0a5e1f8cafdd23a17e292de22fdc8e99ffDavid Blaikie                                                  i != end; ++i) {
542b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor    // Compute the depth and index for this parameter pack.
5439577abc63f2c7afe5adf6e4e101ae91d29c3b8a6Ted Kremenek    unsigned Depth = 0, Index = 0;
544b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor    IdentifierInfo *Name;
54512c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor    bool IsFunctionParameterPack = false;
546b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor
547b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor    if (const TemplateTypeParmType *TTP
548a71f9d0a5e1f8cafdd23a17e292de22fdc8e99ffDavid Blaikie        = i->first.dyn_cast<const TemplateTypeParmType *>()) {
549b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor      Depth = TTP->getDepth();
550b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor      Index = TTP->getIndex();
551b7efff4bae117604f442bb6859c844f90b15f3ffChandler Carruth      Name = TTP->getIdentifier();
552b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor    } else {
553a71f9d0a5e1f8cafdd23a17e292de22fdc8e99ffDavid Blaikie      NamedDecl *ND = i->first.get<NamedDecl *>();
554d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor      if (isa<ParmVarDecl>(ND))
55512c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor        IsFunctionParameterPack = true;
556d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor      else
557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        std::tie(Depth, Index) = getDepthAndIndex(ND);
558651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
559b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor      Name = ND->getIdentifier();
560b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor    }
561b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor
56212c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor    // Determine the size of this argument pack.
56312c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor    unsigned NewPackSize;
56412c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor    if (IsFunctionParameterPack) {
56512c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor      // Figure out whether we're instantiating to an argument pack or not.
56612c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor      typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack;
56712c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor
56812c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor      llvm::PointerUnion<Decl *, DeclArgumentPack *> *Instantiation
56912c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor        = CurrentInstantiationScope->findInstantiationOf(
570a71f9d0a5e1f8cafdd23a17e292de22fdc8e99ffDavid Blaikie                                        i->first.get<NamedDecl *>());
571a70062ff988eb1fc4a159e463a2a3de5155b7f6aChris Lattner      if (Instantiation->is<DeclArgumentPack *>()) {
57212c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor        // We could expand this function parameter pack.
57312c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor        NewPackSize = Instantiation->get<DeclArgumentPack *>()->size();
57412c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor      } else {
57512c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor        // We can't expand this function parameter pack, so we can't expand
57612c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor        // the pack expansion.
57712c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor        ShouldExpand = false;
57812c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor        continue;
57912c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor      }
58012c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor    } else {
58112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor      // If we don't have a template argument at this depth/index, then we
58212c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor      // cannot expand the pack expansion. Make a note of this, but we still
58312c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor      // want to check any parameter packs we *do* have arguments for.
58412c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor      if (Depth >= TemplateArgs.getNumLevels() ||
58512c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor          !TemplateArgs.hasTemplateArgument(Depth, Index)) {
58612c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor        ShouldExpand = false;
58712c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor        continue;
58812c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor      }
58912c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor
59012c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor      // Determine the size of the argument pack.
59112c9c00024a01819e3a70ef6d951d32efaeb9312Douglas Gregor      NewPackSize = TemplateArgs(Depth, Index).pack_size();
592b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor    }
593b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor
594d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor    // C++0x [temp.arg.explicit]p9:
595d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor    //   Template argument deduction can extend the sequence of template
596d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor    //   arguments corresponding to a template parameter pack, even when the
597d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor    //   sequence contains explicitly specified template arguments.
5988619edd6c5636dcdde75b1151e21029e38592e2fDouglas Gregor    if (!IsFunctionParameterPack) {
5998619edd6c5636dcdde75b1151e21029e38592e2fDouglas Gregor      if (NamedDecl *PartialPack
6008619edd6c5636dcdde75b1151e21029e38592e2fDouglas Gregor                    = CurrentInstantiationScope->getPartiallySubstitutedPack()){
6018619edd6c5636dcdde75b1151e21029e38592e2fDouglas Gregor        unsigned PartialDepth, PartialIndex;
602651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        std::tie(PartialDepth, PartialIndex) = getDepthAndIndex(PartialPack);
6038619edd6c5636dcdde75b1151e21029e38592e2fDouglas Gregor        if (PartialDepth == Depth && PartialIndex == Index)
6048619edd6c5636dcdde75b1151e21029e38592e2fDouglas Gregor          RetainExpansion = true;
6058619edd6c5636dcdde75b1151e21029e38592e2fDouglas Gregor      }
606d3731198193eee92796ddeb493973b7a598b003eDouglas Gregor    }
6078619edd6c5636dcdde75b1151e21029e38592e2fDouglas Gregor
608cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor    if (!NumExpansions) {
609b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor      // The is the first pack we've seen for which we have an argument.
610b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor      // Record it.
611b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor      NumExpansions = NewPackSize;
612b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor      FirstPack.first = Name;
613a71f9d0a5e1f8cafdd23a17e292de22fdc8e99ffDavid Blaikie      FirstPack.second = i->second;
614b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor      HaveFirstPack = true;
615b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor      continue;
616b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor    }
617b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor
618cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor    if (NewPackSize != *NumExpansions) {
619b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor      // C++0x [temp.variadic]p5:
620b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor      //   All of the parameter packs expanded by a pack expansion shall have
621b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor      //   the same number of arguments specified.
622cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      if (HaveFirstPack)
623cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor        Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict)
624cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor          << FirstPack.first << Name << *NumExpansions << NewPackSize
625a71f9d0a5e1f8cafdd23a17e292de22fdc8e99ffDavid Blaikie          << SourceRange(FirstPack.second) << SourceRange(i->second);
626cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      else
627cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor        Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict_multilevel)
628cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor          << Name << *NumExpansions << NewPackSize
629a71f9d0a5e1f8cafdd23a17e292de22fdc8e99ffDavid Blaikie          << SourceRange(i->second);
630b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor      return true;
631b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor    }
632b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor  }
633b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor
634b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor  return false;
635b99268b3083c882103bd1bd08bdcc9a76a2b4795Douglas Gregor}
636a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor
637dc84cd5efdd3430efb22546b4ac656aa0540b210David BlaikieOptional<unsigned> Sema::getNumArgumentsInExpansion(QualType T,
63821371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor                          const MultiLevelTemplateArgumentList &TemplateArgs) {
63921371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor  QualType Pattern = cast<PackExpansionType>(T)->getPattern();
6405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<UnexpandedParameterPack, 2> Unexpanded;
64121371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor  CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseType(Pattern);
64221371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor
643dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  Optional<unsigned> Result;
64421371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor  for (unsigned I = 0, N = Unexpanded.size(); I != N; ++I) {
64521371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor    // Compute the depth and index for this parameter pack.
64621371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor    unsigned Depth;
64721371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor    unsigned Index;
64821371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor
64921371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor    if (const TemplateTypeParmType *TTP
65021371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor          = Unexpanded[I].first.dyn_cast<const TemplateTypeParmType *>()) {
65121371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor      Depth = TTP->getDepth();
65221371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor      Index = TTP->getIndex();
65321371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor    } else {
65421371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor      NamedDecl *ND = Unexpanded[I].first.get<NamedDecl *>();
65521371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor      if (isa<ParmVarDecl>(ND)) {
65621371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor        // Function parameter pack.
65721371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor        typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack;
65821371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor
65921371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor        llvm::PointerUnion<Decl *, DeclArgumentPack *> *Instantiation
66021371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor          = CurrentInstantiationScope->findInstantiationOf(
66121371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor                                        Unexpanded[I].first.get<NamedDecl *>());
662500d729e85028944355a119f9823ac99fa5ddcabRichard Smith        if (Instantiation->is<Decl*>())
663500d729e85028944355a119f9823ac99fa5ddcabRichard Smith          // The pattern refers to an unexpanded pack. We're not ready to expand
664500d729e85028944355a119f9823ac99fa5ddcabRichard Smith          // this pack yet.
66566874fb18afbffb8b2ca05576851a64534be3352David Blaikie          return None;
666500d729e85028944355a119f9823ac99fa5ddcabRichard Smith
667500d729e85028944355a119f9823ac99fa5ddcabRichard Smith        unsigned Size = Instantiation->get<DeclArgumentPack *>()->size();
668500d729e85028944355a119f9823ac99fa5ddcabRichard Smith        assert((!Result || *Result == Size) && "inconsistent pack sizes");
669500d729e85028944355a119f9823ac99fa5ddcabRichard Smith        Result = Size;
67021371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor        continue;
67121371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor      }
672651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
673651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      std::tie(Depth, Index) = getDepthAndIndex(ND);
67421371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor    }
67521371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor    if (Depth >= TemplateArgs.getNumLevels() ||
67621371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor        !TemplateArgs.hasTemplateArgument(Depth, Index))
677500d729e85028944355a119f9823ac99fa5ddcabRichard Smith      // The pattern refers to an unknown template argument. We're not ready to
678500d729e85028944355a119f9823ac99fa5ddcabRichard Smith      // expand this pack yet.
67966874fb18afbffb8b2ca05576851a64534be3352David Blaikie      return None;
68021371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor
68121371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor    // Determine the size of the argument pack.
682500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    unsigned Size = TemplateArgs(Depth, Index).pack_size();
683500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    assert((!Result || *Result == Size) && "inconsistent pack sizes");
684500d729e85028944355a119f9823ac99fa5ddcabRichard Smith    Result = Size;
68521371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor  }
68621371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor
687500d729e85028944355a119f9823ac99fa5ddcabRichard Smith  return Result;
68821371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor}
68921371ea7cf647f4f0f783faac325925cb8febb1cDouglas Gregor
690a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregorbool Sema::containsUnexpandedParameterPacks(Declarator &D) {
691a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  const DeclSpec &DS = D.getDeclSpec();
692a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  switch (DS.getTypeSpecType()) {
693a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_typename:
694db5d44b775c60166074acd184ca9f1981c10c2a7Sean Hunt  case TST_typeofType:
695b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  case TST_underlyingType:
696b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  case TST_atomic: {
697a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    QualType T = DS.getRepAsType().get();
698a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    if (!T.isNull() && T->containsUnexpandedParameterPack())
699a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor      return true;
700a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    break;
701a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  }
702a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor
703a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_typeofExpr:
704a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_decltype:
705a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    if (DS.getRepAsExpr() &&
706a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor        DS.getRepAsExpr()->containsUnexpandedParameterPack())
707a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor      return true;
708a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    break;
709a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor
710a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_unspecified:
711a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_void:
712a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_char:
713a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_wchar:
714a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_char16:
715a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_char32:
716a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_int:
7175a5a971908a1fd064454db44c42333a3aecf3d5bRichard Smith  case TST_int128:
718aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  case TST_half:
719a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_float:
720a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_double:
721a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_bool:
722a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_decimal32:
723a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_decimal64:
724a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_decimal128:
725a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_enum:
726a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_union:
727a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_struct:
7286666ed4ed2e2bc13da5ac5d0a4947019137d45beJoao Matos  case TST_interface:
729a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_class:
730a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_auto:
731a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith  case TST_decltype_auto:
732a5fc472b353b88be3b4981da946fb01f5a5cc0c6John McCall  case TST_unknown_anytype:
733a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  case TST_error:
734a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    break;
735a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  }
736a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor
737a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  for (unsigned I = 0, N = D.getNumTypeObjects(); I != N; ++I) {
738a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    const DeclaratorChunk &Chunk = D.getTypeObject(I);
739a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    switch (Chunk.Kind) {
740a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    case DeclaratorChunk::Pointer:
741a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    case DeclaratorChunk::Reference:
742a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    case DeclaratorChunk::Paren:
743a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor      // These declarator chunks cannot contain any parameter packs.
744a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor      break;
745a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor
746a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    case DeclaratorChunk::Array:
747a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    case DeclaratorChunk::Function:
748a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    case DeclaratorChunk::BlockPointer:
749a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor      // Syntactically, these kinds of declarator chunks all come after the
750a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor      // declarator-id (conceptually), so the parser should not invoke this
751a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor      // routine at this time.
752a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor      llvm_unreachable("Could not have seen this kind of declarator chunk");
753a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor
754a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    case DeclaratorChunk::MemberPointer:
755a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor      if (Chunk.Mem.Scope().getScopeRep() &&
756a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor          Chunk.Mem.Scope().getScopeRep()->containsUnexpandedParameterPack())
757a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor        return true;
758a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor      break;
759a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor    }
760a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  }
761a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor
762a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor  return false;
763a8bc8c9e9ba5bffebde00340786fe8542469c435Douglas Gregor}
764ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
765f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrainnamespace {
766f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain
767f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain// Callback to only accept typo corrections that refer to parameter packs.
768f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrainclass ParameterPackValidatorCCC : public CorrectionCandidateCallback {
769f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain public:
770651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool ValidateCandidate(const TypoCorrection &candidate) override {
771f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain    NamedDecl *ND = candidate.getCorrectionDecl();
772f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain    return ND && ND->isParameterPack();
773f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain  }
774f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain};
775f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain
776f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain}
777f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain
778ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// \brief Called when an expression computing the size of a parameter pack
779ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// is parsed.
780ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor///
781ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// \code
782ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// template<typename ...Types> struct count {
783ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor///   static const unsigned value = sizeof...(Types);
784ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// };
785ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// \endcode
786ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor///
787ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor//
788ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// \param OpLoc The location of the "sizeof" keyword.
789ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// \param Name The name of the parameter pack whose size will be determined.
790ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// \param NameLoc The source location of the name of the parameter pack.
791ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor/// \param RParenLoc The location of the closing parentheses.
792ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas GregorExprResult Sema::ActOnSizeofParameterPackExpr(Scope *S,
793ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                              SourceLocation OpLoc,
794ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                              IdentifierInfo &Name,
795ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                              SourceLocation NameLoc,
796ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                              SourceLocation RParenLoc) {
797ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  // C++0x [expr.sizeof]p5:
798ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  //   The identifier in a sizeof... expression shall name a parameter pack.
799ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  LookupResult R(*this, &Name, NameLoc, LookupOrdinaryName);
800ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  LookupName(R, S);
8016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
8026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  NamedDecl *ParameterPack = nullptr;
803f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain  ParameterPackValidatorCCC Validator;
804ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  switch (R.getResultKind()) {
805ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  case LookupResult::Found:
806ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    ParameterPack = R.getFoundDecl();
807ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    break;
808ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
809ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  case LookupResult::NotFound:
810ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  case LookupResult::NotFoundInCurrentInstantiation:
811d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor    if (TypoCorrection Corrected = CorrectTypo(R.getLookupNameInfo(),
8126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                               R.getLookupKind(), S, nullptr,
8136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                               Validator, CTK_ErrorRecovery)) {
8142d67097ad41f4c2fe82ebce3f587e06498f1bd71Richard Smith      diagnoseTypo(Corrected,
8152d67097ad41f4c2fe82ebce3f587e06498f1bd71Richard Smith                   PDiag(diag::err_sizeof_pack_no_pack_name_suggest) << &Name,
8162d67097ad41f4c2fe82ebce3f587e06498f1bd71Richard Smith                   PDiag(diag::note_parameter_pack_here));
817f8ec8c9935acf77ff929b0aa51428d70c37c232aKaelyn Uhrain      ParameterPack = Corrected.getCorrectionDecl();
818ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    }
8192d67097ad41f4c2fe82ebce3f587e06498f1bd71Richard Smith
820ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  case LookupResult::FoundOverloaded:
821ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  case LookupResult::FoundUnresolvedValue:
822ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    break;
823ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
824ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  case LookupResult::Ambiguous:
825ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    DiagnoseAmbiguousLookup(R);
826ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    return ExprError();
827ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  }
828ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
8291fe85ea697fb5c85acded3ac0ddbc19f89c2e181Douglas Gregor  if (!ParameterPack || !ParameterPack->isParameterPack()) {
830ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    Diag(NameLoc, diag::err_sizeof_pack_no_pack_name)
831ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor      << &Name;
832ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    return ExprError();
833ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  }
834ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
835b7e5eec2f57bd82c6ddb762ca3dd7b7d8697e9d5Nick Lewycky  MarkAnyDeclReferenced(OpLoc, ParameterPack, true);
83688530d5e138f36ea80a7d70c14f37095b8eba85bEli Friedman
837ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  return new (Context) SizeOfPackExpr(Context.getSizeType(), OpLoc,
838ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor                                      ParameterPack, NameLoc, RParenLoc);
839ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor}
840850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman
841850cf510b8e310a99344c29731f0b68e096a8658Eli FriedmanTemplateArgumentLoc
842850cf510b8e310a99344c29731f0b68e096a8658Eli FriedmanSema::getTemplateArgumentPackExpansionPattern(
843850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman      TemplateArgumentLoc OrigLoc,
844850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman      SourceLocation &Ellipsis, Optional<unsigned> &NumExpansions) const {
845850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  const TemplateArgument &Argument = OrigLoc.getArgument();
846850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  assert(Argument.isPackExpansion());
847850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  switch (Argument.getKind()) {
848850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  case TemplateArgument::Type: {
849850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    // FIXME: We shouldn't ever have to worry about missing
850850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    // type-source info!
851850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    TypeSourceInfo *ExpansionTSInfo = OrigLoc.getTypeSourceInfo();
852850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    if (!ExpansionTSInfo)
853850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman      ExpansionTSInfo = Context.getTrivialTypeSourceInfo(Argument.getAsType(),
854850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman                                                         Ellipsis);
855850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    PackExpansionTypeLoc Expansion =
856850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman        ExpansionTSInfo->getTypeLoc().castAs<PackExpansionTypeLoc>();
857850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    Ellipsis = Expansion.getEllipsisLoc();
858850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman
859850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    TypeLoc Pattern = Expansion.getPatternLoc();
860850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    NumExpansions = Expansion.getTypePtr()->getNumExpansions();
861850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman
862850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    // We need to copy the TypeLoc because TemplateArgumentLocs store a
863850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    // TypeSourceInfo.
864850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    // FIXME: Find some way to avoid the copy?
865850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    TypeLocBuilder TLB;
866850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    TLB.pushFullCopy(Pattern);
867850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    TypeSourceInfo *PatternTSInfo =
868850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman        TLB.getTypeSourceInfo(Context, Pattern.getType());
869850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    return TemplateArgumentLoc(TemplateArgument(Pattern.getType()),
870850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman                               PatternTSInfo);
871850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  }
872850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman
873850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  case TemplateArgument::Expression: {
874850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    PackExpansionExpr *Expansion
875850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman      = cast<PackExpansionExpr>(Argument.getAsExpr());
876850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    Expr *Pattern = Expansion->getPattern();
877850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    Ellipsis = Expansion->getEllipsisLoc();
878850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    NumExpansions = Expansion->getNumExpansions();
879850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    return TemplateArgumentLoc(Pattern, Pattern);
880850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  }
881850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman
882850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  case TemplateArgument::TemplateExpansion:
883850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    Ellipsis = OrigLoc.getTemplateEllipsisLoc();
884850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    NumExpansions = Argument.getNumTemplateExpansions();
885850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    return TemplateArgumentLoc(Argument.getPackExpansionPattern(),
886850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman                               OrigLoc.getTemplateQualifierLoc(),
887850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman                               OrigLoc.getTemplateNameLoc());
888850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman
889850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  case TemplateArgument::Declaration:
890850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  case TemplateArgument::NullPtr:
891850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  case TemplateArgument::Template:
892850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  case TemplateArgument::Integral:
893850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  case TemplateArgument::Pack:
894850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  case TemplateArgument::Null:
895850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman    return TemplateArgumentLoc();
896850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  }
897850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman
898850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman  llvm_unreachable("Invalid TemplateArgument Kind!");
899850cf510b8e310a99344c29731f0b68e096a8658Eli Friedman}
900