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