]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - contrib/llvm/tools/clang/lib/Sema/SemaTemplateVariadic.cpp
Copy head to stable/9 as part of 9.0-RELEASE release cycle.
[FreeBSD/stable/9.git] / contrib / llvm / tools / clang / lib / Sema / SemaTemplateVariadic.cpp
1 //===------- SemaTemplateVariadic.cpp - C++ Variadic Templates ------------===/
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //===----------------------------------------------------------------------===/
8 //
9 //  This file implements semantic analysis for C++0x variadic templates.
10 //===----------------------------------------------------------------------===/
11
12 #include "clang/Sema/Sema.h"
13 #include "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 }