SemaTemplateVariadic.cpp 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216
  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. #include "clang/Sema/Sema.h"
  12. #include "TypeLocBuilder.h"
  13. #include "clang/AST/Expr.h"
  14. #include "clang/AST/RecursiveASTVisitor.h"
  15. #include "clang/AST/TypeLoc.h"
  16. #include "clang/Sema/Lookup.h"
  17. #include "clang/Sema/ParsedTemplate.h"
  18. #include "clang/Sema/ScopeInfo.h"
  19. #include "clang/Sema/SemaInternal.h"
  20. #include "clang/Sema/Template.h"
  21. using namespace clang;
  22. //----------------------------------------------------------------------------
  23. // Visitor that collects unexpanded parameter packs
  24. //----------------------------------------------------------------------------
  25. namespace {
  26. /// A class that collects unexpanded parameter packs.
  27. class CollectUnexpandedParameterPacksVisitor :
  28. public RecursiveASTVisitor<CollectUnexpandedParameterPacksVisitor>
  29. {
  30. typedef RecursiveASTVisitor<CollectUnexpandedParameterPacksVisitor>
  31. inherited;
  32. SmallVectorImpl<UnexpandedParameterPack> &Unexpanded;
  33. bool InLambda = false;
  34. unsigned DepthLimit = (unsigned)-1;
  35. void addUnexpanded(NamedDecl *ND, SourceLocation Loc = SourceLocation()) {
  36. if (auto *PVD = dyn_cast<ParmVarDecl>(ND)) {
  37. // For now, the only problematic case is a generic lambda's templated
  38. // call operator, so we don't need to look for all the other ways we
  39. // could have reached a dependent parameter pack.
  40. auto *FD = dyn_cast<FunctionDecl>(PVD->getDeclContext());
  41. auto *FTD = FD ? FD->getDescribedFunctionTemplate() : nullptr;
  42. if (FTD && FTD->getTemplateParameters()->getDepth() >= DepthLimit)
  43. return;
  44. } else if (getDepthAndIndex(ND).first >= DepthLimit)
  45. return;
  46. Unexpanded.push_back({ND, Loc});
  47. }
  48. void addUnexpanded(const TemplateTypeParmType *T,
  49. SourceLocation Loc = SourceLocation()) {
  50. if (T->getDepth() < DepthLimit)
  51. Unexpanded.push_back({T, Loc});
  52. }
  53. public:
  54. explicit CollectUnexpandedParameterPacksVisitor(
  55. SmallVectorImpl<UnexpandedParameterPack> &Unexpanded)
  56. : Unexpanded(Unexpanded) {}
  57. bool shouldWalkTypesOfTypeLocs() const { return false; }
  58. //------------------------------------------------------------------------
  59. // Recording occurrences of (unexpanded) parameter packs.
  60. //------------------------------------------------------------------------
  61. /// Record occurrences of template type parameter packs.
  62. bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) {
  63. if (TL.getTypePtr()->isParameterPack())
  64. addUnexpanded(TL.getTypePtr(), TL.getNameLoc());
  65. return true;
  66. }
  67. /// Record occurrences of template type parameter packs
  68. /// when we don't have proper source-location information for
  69. /// them.
  70. ///
  71. /// Ideally, this routine would never be used.
  72. bool VisitTemplateTypeParmType(TemplateTypeParmType *T) {
  73. if (T->isParameterPack())
  74. addUnexpanded(T);
  75. return true;
  76. }
  77. /// Record occurrences of function and non-type template
  78. /// parameter packs in an expression.
  79. bool VisitDeclRefExpr(DeclRefExpr *E) {
  80. if (E->getDecl()->isParameterPack())
  81. addUnexpanded(E->getDecl(), E->getLocation());
  82. return true;
  83. }
  84. /// Record occurrences of template template parameter packs.
  85. bool TraverseTemplateName(TemplateName Template) {
  86. if (auto *TTP = dyn_cast_or_null<TemplateTemplateParmDecl>(
  87. Template.getAsTemplateDecl())) {
  88. if (TTP->isParameterPack())
  89. addUnexpanded(TTP);
  90. }
  91. return inherited::TraverseTemplateName(Template);
  92. }
  93. /// Suppress traversal into Objective-C container literal
  94. /// elements that are pack expansions.
  95. bool TraverseObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
  96. if (!E->containsUnexpandedParameterPack())
  97. return true;
  98. for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
  99. ObjCDictionaryElement Element = E->getKeyValueElement(I);
  100. if (Element.isPackExpansion())
  101. continue;
  102. TraverseStmt(Element.Key);
  103. TraverseStmt(Element.Value);
  104. }
  105. return true;
  106. }
  107. //------------------------------------------------------------------------
  108. // Pruning the search for unexpanded parameter packs.
  109. //------------------------------------------------------------------------
  110. /// Suppress traversal into statements and expressions that
  111. /// do not contain unexpanded parameter packs.
  112. bool TraverseStmt(Stmt *S) {
  113. Expr *E = dyn_cast_or_null<Expr>(S);
  114. if ((E && E->containsUnexpandedParameterPack()) || InLambda)
  115. return inherited::TraverseStmt(S);
  116. return true;
  117. }
  118. /// Suppress traversal into types that do not contain
  119. /// unexpanded parameter packs.
  120. bool TraverseType(QualType T) {
  121. if ((!T.isNull() && T->containsUnexpandedParameterPack()) || InLambda)
  122. return inherited::TraverseType(T);
  123. return true;
  124. }
  125. /// Suppress traversal into types with location information
  126. /// that do not contain unexpanded parameter packs.
  127. bool TraverseTypeLoc(TypeLoc TL) {
  128. if ((!TL.getType().isNull() &&
  129. TL.getType()->containsUnexpandedParameterPack()) ||
  130. InLambda)
  131. return inherited::TraverseTypeLoc(TL);
  132. return true;
  133. }
  134. /// Suppress traversal of parameter packs.
  135. bool TraverseDecl(Decl *D) {
  136. // A function parameter pack is a pack expansion, so cannot contain
  137. // an unexpanded parameter pack. Likewise for a template parameter
  138. // pack that contains any references to other packs.
  139. if (D && D->isParameterPack())
  140. return true;
  141. return inherited::TraverseDecl(D);
  142. }
  143. /// Suppress traversal of pack-expanded attributes.
  144. bool TraverseAttr(Attr *A) {
  145. if (A->isPackExpansion())
  146. return true;
  147. return inherited::TraverseAttr(A);
  148. }
  149. /// Suppress traversal of pack expansion expressions and types.
  150. ///@{
  151. bool TraversePackExpansionType(PackExpansionType *T) { return true; }
  152. bool TraversePackExpansionTypeLoc(PackExpansionTypeLoc TL) { return true; }
  153. bool TraversePackExpansionExpr(PackExpansionExpr *E) { return true; }
  154. bool TraverseCXXFoldExpr(CXXFoldExpr *E) { return true; }
  155. ///@}
  156. /// Suppress traversal of using-declaration pack expansion.
  157. bool TraverseUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
  158. if (D->isPackExpansion())
  159. return true;
  160. return inherited::TraverseUnresolvedUsingValueDecl(D);
  161. }
  162. /// Suppress traversal of using-declaration pack expansion.
  163. bool TraverseUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D) {
  164. if (D->isPackExpansion())
  165. return true;
  166. return inherited::TraverseUnresolvedUsingTypenameDecl(D);
  167. }
  168. /// Suppress traversal of template argument pack expansions.
  169. bool TraverseTemplateArgument(const TemplateArgument &Arg) {
  170. if (Arg.isPackExpansion())
  171. return true;
  172. return inherited::TraverseTemplateArgument(Arg);
  173. }
  174. /// Suppress traversal of template argument pack expansions.
  175. bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc) {
  176. if (ArgLoc.getArgument().isPackExpansion())
  177. return true;
  178. return inherited::TraverseTemplateArgumentLoc(ArgLoc);
  179. }
  180. /// Suppress traversal of base specifier pack expansions.
  181. bool TraverseCXXBaseSpecifier(const CXXBaseSpecifier &Base) {
  182. if (Base.isPackExpansion())
  183. return true;
  184. return inherited::TraverseCXXBaseSpecifier(Base);
  185. }
  186. /// Suppress traversal of mem-initializer pack expansions.
  187. bool TraverseConstructorInitializer(CXXCtorInitializer *Init) {
  188. if (Init->isPackExpansion())
  189. return true;
  190. return inherited::TraverseConstructorInitializer(Init);
  191. }
  192. /// Note whether we're traversing a lambda containing an unexpanded
  193. /// parameter pack. In this case, the unexpanded pack can occur anywhere,
  194. /// including all the places where we normally wouldn't look. Within a
  195. /// lambda, we don't propagate the 'contains unexpanded parameter pack' bit
  196. /// outside an expression.
  197. bool TraverseLambdaExpr(LambdaExpr *Lambda) {
  198. // The ContainsUnexpandedParameterPack bit on a lambda is always correct,
  199. // even if it's contained within another lambda.
  200. if (!Lambda->containsUnexpandedParameterPack())
  201. return true;
  202. bool WasInLambda = InLambda;
  203. unsigned OldDepthLimit = DepthLimit;
  204. InLambda = true;
  205. if (auto *TPL = Lambda->getTemplateParameterList())
  206. DepthLimit = TPL->getDepth();
  207. inherited::TraverseLambdaExpr(Lambda);
  208. InLambda = WasInLambda;
  209. DepthLimit = OldDepthLimit;
  210. return true;
  211. }
  212. /// Suppress traversal within pack expansions in lambda captures.
  213. bool TraverseLambdaCapture(LambdaExpr *Lambda, const LambdaCapture *C,
  214. Expr *Init) {
  215. if (C->isPackExpansion())
  216. return true;
  217. return inherited::TraverseLambdaCapture(Lambda, C, Init);
  218. }
  219. };
  220. }
  221. /// Determine whether it's possible for an unexpanded parameter pack to
  222. /// be valid in this location. This only happens when we're in a declaration
  223. /// that is nested within an expression that could be expanded, such as a
  224. /// lambda-expression within a function call.
  225. ///
  226. /// This is conservatively correct, but may claim that some unexpanded packs are
  227. /// permitted when they are not.
  228. bool Sema::isUnexpandedParameterPackPermitted() {
  229. for (auto *SI : FunctionScopes)
  230. if (isa<sema::LambdaScopeInfo>(SI))
  231. return true;
  232. return false;
  233. }
  234. /// Diagnose all of the unexpanded parameter packs in the given
  235. /// vector.
  236. bool
  237. Sema::DiagnoseUnexpandedParameterPacks(SourceLocation Loc,
  238. UnexpandedParameterPackContext UPPC,
  239. ArrayRef<UnexpandedParameterPack> Unexpanded) {
  240. if (Unexpanded.empty())
  241. return false;
  242. // If we are within a lambda expression and referencing a pack that is not
  243. // a parameter of the lambda itself, that lambda contains an unexpanded
  244. // parameter pack, and we are done.
  245. // FIXME: Store 'Unexpanded' on the lambda so we don't need to recompute it
  246. // later.
  247. SmallVector<UnexpandedParameterPack, 4> LambdaParamPackReferences;
  248. for (unsigned N = FunctionScopes.size(); N; --N) {
  249. sema::FunctionScopeInfo *Func = FunctionScopes[N-1];
  250. // We do not permit pack expansion that would duplicate a statement
  251. // expression, not even within a lambda.
  252. // FIXME: We could probably support this for statement expressions that do
  253. // not contain labels, and for pack expansions that expand both the stmt
  254. // expr and the enclosing lambda.
  255. if (std::any_of(
  256. Func->CompoundScopes.begin(), Func->CompoundScopes.end(),
  257. [](sema::CompoundScopeInfo &CSI) { return CSI.IsStmtExpr; }))
  258. break;
  259. if (auto *LSI = dyn_cast<sema::LambdaScopeInfo>(Func)) {
  260. if (N == FunctionScopes.size()) {
  261. for (auto &Param : Unexpanded) {
  262. auto *PD = dyn_cast_or_null<ParmVarDecl>(
  263. Param.first.dyn_cast<NamedDecl *>());
  264. if (PD && PD->getDeclContext() == LSI->CallOperator)
  265. LambdaParamPackReferences.push_back(Param);
  266. }
  267. }
  268. // If we have references to a parameter pack of the innermost enclosing
  269. // lambda, only diagnose those ones. We don't know whether any other
  270. // unexpanded parameters referenced herein are actually unexpanded;
  271. // they might be expanded at an outer level.
  272. if (!LambdaParamPackReferences.empty()) {
  273. Unexpanded = LambdaParamPackReferences;
  274. break;
  275. }
  276. LSI->ContainsUnexpandedParameterPack = true;
  277. return false;
  278. }
  279. }
  280. SmallVector<SourceLocation, 4> Locations;
  281. SmallVector<IdentifierInfo *, 4> Names;
  282. llvm::SmallPtrSet<IdentifierInfo *, 4> NamesKnown;
  283. for (unsigned I = 0, N = Unexpanded.size(); I != N; ++I) {
  284. IdentifierInfo *Name = nullptr;
  285. if (const TemplateTypeParmType *TTP
  286. = Unexpanded[I].first.dyn_cast<const TemplateTypeParmType *>())
  287. Name = TTP->getIdentifier();
  288. else
  289. Name = Unexpanded[I].first.get<NamedDecl *>()->getIdentifier();
  290. if (Name && NamesKnown.insert(Name).second)
  291. Names.push_back(Name);
  292. if (Unexpanded[I].second.isValid())
  293. Locations.push_back(Unexpanded[I].second);
  294. }
  295. DiagnosticBuilder DB = Diag(Loc, diag::err_unexpanded_parameter_pack)
  296. << (int)UPPC << (int)Names.size();
  297. for (size_t I = 0, E = std::min(Names.size(), (size_t)2); I != E; ++I)
  298. DB << Names[I];
  299. for (unsigned I = 0, N = Locations.size(); I != N; ++I)
  300. DB << SourceRange(Locations[I]);
  301. return true;
  302. }
  303. bool Sema::DiagnoseUnexpandedParameterPack(SourceLocation Loc,
  304. TypeSourceInfo *T,
  305. UnexpandedParameterPackContext UPPC) {
  306. // C++0x [temp.variadic]p5:
  307. // An appearance of a name of a parameter pack that is not expanded is
  308. // ill-formed.
  309. if (!T->getType()->containsUnexpandedParameterPack())
  310. return false;
  311. SmallVector<UnexpandedParameterPack, 2> Unexpanded;
  312. CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseTypeLoc(
  313. T->getTypeLoc());
  314. assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
  315. return DiagnoseUnexpandedParameterPacks(Loc, UPPC, Unexpanded);
  316. }
  317. bool Sema::DiagnoseUnexpandedParameterPack(Expr *E,
  318. UnexpandedParameterPackContext UPPC) {
  319. // C++0x [temp.variadic]p5:
  320. // An appearance of a name of a parameter pack that is not expanded is
  321. // ill-formed.
  322. if (!E->containsUnexpandedParameterPack())
  323. return false;
  324. SmallVector<UnexpandedParameterPack, 2> Unexpanded;
  325. CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseStmt(E);
  326. assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
  327. return DiagnoseUnexpandedParameterPacks(E->getBeginLoc(), UPPC, Unexpanded);
  328. }
  329. bool Sema::DiagnoseUnexpandedParameterPack(const CXXScopeSpec &SS,
  330. UnexpandedParameterPackContext UPPC) {
  331. // C++0x [temp.variadic]p5:
  332. // An appearance of a name of a parameter pack that is not expanded is
  333. // ill-formed.
  334. if (!SS.getScopeRep() ||
  335. !SS.getScopeRep()->containsUnexpandedParameterPack())
  336. return false;
  337. SmallVector<UnexpandedParameterPack, 2> Unexpanded;
  338. CollectUnexpandedParameterPacksVisitor(Unexpanded)
  339. .TraverseNestedNameSpecifier(SS.getScopeRep());
  340. assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
  341. return DiagnoseUnexpandedParameterPacks(SS.getRange().getBegin(),
  342. UPPC, Unexpanded);
  343. }
  344. bool Sema::DiagnoseUnexpandedParameterPack(const DeclarationNameInfo &NameInfo,
  345. UnexpandedParameterPackContext UPPC) {
  346. // C++0x [temp.variadic]p5:
  347. // An appearance of a name of a parameter pack that is not expanded is
  348. // ill-formed.
  349. switch (NameInfo.getName().getNameKind()) {
  350. case DeclarationName::Identifier:
  351. case DeclarationName::ObjCZeroArgSelector:
  352. case DeclarationName::ObjCOneArgSelector:
  353. case DeclarationName::ObjCMultiArgSelector:
  354. case DeclarationName::CXXOperatorName:
  355. case DeclarationName::CXXLiteralOperatorName:
  356. case DeclarationName::CXXUsingDirective:
  357. case DeclarationName::CXXDeductionGuideName:
  358. return false;
  359. case DeclarationName::CXXConstructorName:
  360. case DeclarationName::CXXDestructorName:
  361. case DeclarationName::CXXConversionFunctionName:
  362. // FIXME: We shouldn't need this null check!
  363. if (TypeSourceInfo *TSInfo = NameInfo.getNamedTypeInfo())
  364. return DiagnoseUnexpandedParameterPack(NameInfo.getLoc(), TSInfo, UPPC);
  365. if (!NameInfo.getName().getCXXNameType()->containsUnexpandedParameterPack())
  366. return false;
  367. break;
  368. }
  369. SmallVector<UnexpandedParameterPack, 2> Unexpanded;
  370. CollectUnexpandedParameterPacksVisitor(Unexpanded)
  371. .TraverseType(NameInfo.getName().getCXXNameType());
  372. assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
  373. return DiagnoseUnexpandedParameterPacks(NameInfo.getLoc(), UPPC, Unexpanded);
  374. }
  375. bool Sema::DiagnoseUnexpandedParameterPack(SourceLocation Loc,
  376. TemplateName Template,
  377. UnexpandedParameterPackContext UPPC) {
  378. if (Template.isNull() || !Template.containsUnexpandedParameterPack())
  379. return false;
  380. SmallVector<UnexpandedParameterPack, 2> Unexpanded;
  381. CollectUnexpandedParameterPacksVisitor(Unexpanded)
  382. .TraverseTemplateName(Template);
  383. assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
  384. return DiagnoseUnexpandedParameterPacks(Loc, UPPC, Unexpanded);
  385. }
  386. bool Sema::DiagnoseUnexpandedParameterPack(TemplateArgumentLoc Arg,
  387. UnexpandedParameterPackContext UPPC) {
  388. if (Arg.getArgument().isNull() ||
  389. !Arg.getArgument().containsUnexpandedParameterPack())
  390. return false;
  391. SmallVector<UnexpandedParameterPack, 2> Unexpanded;
  392. CollectUnexpandedParameterPacksVisitor(Unexpanded)
  393. .TraverseTemplateArgumentLoc(Arg);
  394. assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs");
  395. return DiagnoseUnexpandedParameterPacks(Arg.getLocation(), UPPC, Unexpanded);
  396. }
  397. void Sema::collectUnexpandedParameterPacks(TemplateArgument Arg,
  398. SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
  399. CollectUnexpandedParameterPacksVisitor(Unexpanded)
  400. .TraverseTemplateArgument(Arg);
  401. }
  402. void Sema::collectUnexpandedParameterPacks(TemplateArgumentLoc Arg,
  403. SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
  404. CollectUnexpandedParameterPacksVisitor(Unexpanded)
  405. .TraverseTemplateArgumentLoc(Arg);
  406. }
  407. void Sema::collectUnexpandedParameterPacks(QualType T,
  408. SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
  409. CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseType(T);
  410. }
  411. void Sema::collectUnexpandedParameterPacks(TypeLoc TL,
  412. SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
  413. CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseTypeLoc(TL);
  414. }
  415. void Sema::collectUnexpandedParameterPacks(
  416. NestedNameSpecifierLoc NNS,
  417. SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
  418. CollectUnexpandedParameterPacksVisitor(Unexpanded)
  419. .TraverseNestedNameSpecifierLoc(NNS);
  420. }
  421. void Sema::collectUnexpandedParameterPacks(
  422. const DeclarationNameInfo &NameInfo,
  423. SmallVectorImpl<UnexpandedParameterPack> &Unexpanded) {
  424. CollectUnexpandedParameterPacksVisitor(Unexpanded)
  425. .TraverseDeclarationNameInfo(NameInfo);
  426. }
  427. ParsedTemplateArgument
  428. Sema::ActOnPackExpansion(const ParsedTemplateArgument &Arg,
  429. SourceLocation EllipsisLoc) {
  430. if (Arg.isInvalid())
  431. return Arg;
  432. switch (Arg.getKind()) {
  433. case ParsedTemplateArgument::Type: {
  434. TypeResult Result = ActOnPackExpansion(Arg.getAsType(), EllipsisLoc);
  435. if (Result.isInvalid())
  436. return ParsedTemplateArgument();
  437. return ParsedTemplateArgument(Arg.getKind(), Result.get().getAsOpaquePtr(),
  438. Arg.getLocation());
  439. }
  440. case ParsedTemplateArgument::NonType: {
  441. ExprResult Result = ActOnPackExpansion(Arg.getAsExpr(), EllipsisLoc);
  442. if (Result.isInvalid())
  443. return ParsedTemplateArgument();
  444. return ParsedTemplateArgument(Arg.getKind(), Result.get(),
  445. Arg.getLocation());
  446. }
  447. case ParsedTemplateArgument::Template:
  448. if (!Arg.getAsTemplate().get().containsUnexpandedParameterPack()) {
  449. SourceRange R(Arg.getLocation());
  450. if (Arg.getScopeSpec().isValid())
  451. R.setBegin(Arg.getScopeSpec().getBeginLoc());
  452. Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
  453. << R;
  454. return ParsedTemplateArgument();
  455. }
  456. return Arg.getTemplatePackExpansion(EllipsisLoc);
  457. }
  458. llvm_unreachable("Unhandled template argument kind?");
  459. }
  460. TypeResult Sema::ActOnPackExpansion(ParsedType Type,
  461. SourceLocation EllipsisLoc) {
  462. TypeSourceInfo *TSInfo;
  463. GetTypeFromParser(Type, &TSInfo);
  464. if (!TSInfo)
  465. return true;
  466. TypeSourceInfo *TSResult = CheckPackExpansion(TSInfo, EllipsisLoc, None);
  467. if (!TSResult)
  468. return true;
  469. return CreateParsedType(TSResult->getType(), TSResult);
  470. }
  471. TypeSourceInfo *
  472. Sema::CheckPackExpansion(TypeSourceInfo *Pattern, SourceLocation EllipsisLoc,
  473. Optional<unsigned> NumExpansions) {
  474. // Create the pack expansion type and source-location information.
  475. QualType Result = CheckPackExpansion(Pattern->getType(),
  476. Pattern->getTypeLoc().getSourceRange(),
  477. EllipsisLoc, NumExpansions);
  478. if (Result.isNull())
  479. return nullptr;
  480. TypeLocBuilder TLB;
  481. TLB.pushFullCopy(Pattern->getTypeLoc());
  482. PackExpansionTypeLoc TL = TLB.push<PackExpansionTypeLoc>(Result);
  483. TL.setEllipsisLoc(EllipsisLoc);
  484. return TLB.getTypeSourceInfo(Context, Result);
  485. }
  486. QualType Sema::CheckPackExpansion(QualType Pattern, SourceRange PatternRange,
  487. SourceLocation EllipsisLoc,
  488. Optional<unsigned> NumExpansions) {
  489. // C++0x [temp.variadic]p5:
  490. // The pattern of a pack expansion shall name one or more
  491. // parameter packs that are not expanded by a nested pack
  492. // expansion.
  493. if (!Pattern->containsUnexpandedParameterPack()) {
  494. Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
  495. << PatternRange;
  496. return QualType();
  497. }
  498. return Context.getPackExpansionType(Pattern, NumExpansions);
  499. }
  500. ExprResult Sema::ActOnPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc) {
  501. return CheckPackExpansion(Pattern, EllipsisLoc, None);
  502. }
  503. ExprResult Sema::CheckPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
  504. Optional<unsigned> NumExpansions) {
  505. if (!Pattern)
  506. return ExprError();
  507. // C++0x [temp.variadic]p5:
  508. // The pattern of a pack expansion shall name one or more
  509. // parameter packs that are not expanded by a nested pack
  510. // expansion.
  511. if (!Pattern->containsUnexpandedParameterPack()) {
  512. Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
  513. << Pattern->getSourceRange();
  514. return ExprError();
  515. }
  516. // Create the pack expansion expression and source-location information.
  517. return new (Context)
  518. PackExpansionExpr(Context.DependentTy, Pattern, EllipsisLoc, NumExpansions);
  519. }
  520. bool Sema::CheckParameterPacksForExpansion(
  521. SourceLocation EllipsisLoc, SourceRange PatternRange,
  522. ArrayRef<UnexpandedParameterPack> Unexpanded,
  523. const MultiLevelTemplateArgumentList &TemplateArgs, bool &ShouldExpand,
  524. bool &RetainExpansion, Optional<unsigned> &NumExpansions) {
  525. ShouldExpand = true;
  526. RetainExpansion = false;
  527. std::pair<IdentifierInfo *, SourceLocation> FirstPack;
  528. bool HaveFirstPack = false;
  529. Optional<unsigned> NumPartialExpansions;
  530. SourceLocation PartiallySubstitutedPackLoc;
  531. for (ArrayRef<UnexpandedParameterPack>::iterator i = Unexpanded.begin(),
  532. end = Unexpanded.end();
  533. i != end; ++i) {
  534. // Compute the depth and index for this parameter pack.
  535. unsigned Depth = 0, Index = 0;
  536. IdentifierInfo *Name;
  537. bool IsFunctionParameterPack = false;
  538. if (const TemplateTypeParmType *TTP
  539. = i->first.dyn_cast<const TemplateTypeParmType *>()) {
  540. Depth = TTP->getDepth();
  541. Index = TTP->getIndex();
  542. Name = TTP->getIdentifier();
  543. } else {
  544. NamedDecl *ND = i->first.get<NamedDecl *>();
  545. if (isa<ParmVarDecl>(ND))
  546. IsFunctionParameterPack = true;
  547. else
  548. std::tie(Depth, Index) = getDepthAndIndex(ND);
  549. Name = ND->getIdentifier();
  550. }
  551. // Determine the size of this argument pack.
  552. unsigned NewPackSize;
  553. if (IsFunctionParameterPack) {
  554. // Figure out whether we're instantiating to an argument pack or not.
  555. typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack;
  556. llvm::PointerUnion<Decl *, DeclArgumentPack *> *Instantiation
  557. = CurrentInstantiationScope->findInstantiationOf(
  558. i->first.get<NamedDecl *>());
  559. if (Instantiation->is<DeclArgumentPack *>()) {
  560. // We could expand this function parameter pack.
  561. NewPackSize = Instantiation->get<DeclArgumentPack *>()->size();
  562. } else {
  563. // We can't expand this function parameter pack, so we can't expand
  564. // the pack expansion.
  565. ShouldExpand = false;
  566. continue;
  567. }
  568. } else {
  569. // If we don't have a template argument at this depth/index, then we
  570. // cannot expand the pack expansion. Make a note of this, but we still
  571. // want to check any parameter packs we *do* have arguments for.
  572. if (Depth >= TemplateArgs.getNumLevels() ||
  573. !TemplateArgs.hasTemplateArgument(Depth, Index)) {
  574. ShouldExpand = false;
  575. continue;
  576. }
  577. // Determine the size of the argument pack.
  578. NewPackSize = TemplateArgs(Depth, Index).pack_size();
  579. }
  580. // C++0x [temp.arg.explicit]p9:
  581. // Template argument deduction can extend the sequence of template
  582. // arguments corresponding to a template parameter pack, even when the
  583. // sequence contains explicitly specified template arguments.
  584. if (!IsFunctionParameterPack && CurrentInstantiationScope) {
  585. if (NamedDecl *PartialPack
  586. = CurrentInstantiationScope->getPartiallySubstitutedPack()){
  587. unsigned PartialDepth, PartialIndex;
  588. std::tie(PartialDepth, PartialIndex) = getDepthAndIndex(PartialPack);
  589. if (PartialDepth == Depth && PartialIndex == Index) {
  590. RetainExpansion = true;
  591. // We don't actually know the new pack size yet.
  592. NumPartialExpansions = NewPackSize;
  593. PartiallySubstitutedPackLoc = i->second;
  594. continue;
  595. }
  596. }
  597. }
  598. if (!NumExpansions) {
  599. // The is the first pack we've seen for which we have an argument.
  600. // Record it.
  601. NumExpansions = NewPackSize;
  602. FirstPack.first = Name;
  603. FirstPack.second = i->second;
  604. HaveFirstPack = true;
  605. continue;
  606. }
  607. if (NewPackSize != *NumExpansions) {
  608. // C++0x [temp.variadic]p5:
  609. // All of the parameter packs expanded by a pack expansion shall have
  610. // the same number of arguments specified.
  611. if (HaveFirstPack)
  612. Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict)
  613. << FirstPack.first << Name << *NumExpansions << NewPackSize
  614. << SourceRange(FirstPack.second) << SourceRange(i->second);
  615. else
  616. Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict_multilevel)
  617. << Name << *NumExpansions << NewPackSize
  618. << SourceRange(i->second);
  619. return true;
  620. }
  621. }
  622. // If we're performing a partial expansion but we also have a full expansion,
  623. // expand to the number of common arguments. For example, given:
  624. //
  625. // template<typename ...T> struct A {
  626. // template<typename ...U> void f(pair<T, U>...);
  627. // };
  628. //
  629. // ... a call to 'A<int, int>().f<int>' should expand the pack once and
  630. // retain an expansion.
  631. if (NumPartialExpansions) {
  632. if (NumExpansions && *NumExpansions < *NumPartialExpansions) {
  633. NamedDecl *PartialPack =
  634. CurrentInstantiationScope->getPartiallySubstitutedPack();
  635. Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict_partial)
  636. << PartialPack << *NumPartialExpansions << *NumExpansions
  637. << SourceRange(PartiallySubstitutedPackLoc);
  638. return true;
  639. }
  640. NumExpansions = NumPartialExpansions;
  641. }
  642. return false;
  643. }
  644. Optional<unsigned> Sema::getNumArgumentsInExpansion(QualType T,
  645. const MultiLevelTemplateArgumentList &TemplateArgs) {
  646. QualType Pattern = cast<PackExpansionType>(T)->getPattern();
  647. SmallVector<UnexpandedParameterPack, 2> Unexpanded;
  648. CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseType(Pattern);
  649. Optional<unsigned> Result;
  650. for (unsigned I = 0, N = Unexpanded.size(); I != N; ++I) {
  651. // Compute the depth and index for this parameter pack.
  652. unsigned Depth;
  653. unsigned Index;
  654. if (const TemplateTypeParmType *TTP
  655. = Unexpanded[I].first.dyn_cast<const TemplateTypeParmType *>()) {
  656. Depth = TTP->getDepth();
  657. Index = TTP->getIndex();
  658. } else {
  659. NamedDecl *ND = Unexpanded[I].first.get<NamedDecl *>();
  660. if (isa<ParmVarDecl>(ND)) {
  661. // Function parameter pack.
  662. typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack;
  663. llvm::PointerUnion<Decl *, DeclArgumentPack *> *Instantiation
  664. = CurrentInstantiationScope->findInstantiationOf(
  665. Unexpanded[I].first.get<NamedDecl *>());
  666. if (Instantiation->is<Decl*>())
  667. // The pattern refers to an unexpanded pack. We're not ready to expand
  668. // this pack yet.
  669. return None;
  670. unsigned Size = Instantiation->get<DeclArgumentPack *>()->size();
  671. assert((!Result || *Result == Size) && "inconsistent pack sizes");
  672. Result = Size;
  673. continue;
  674. }
  675. std::tie(Depth, Index) = getDepthAndIndex(ND);
  676. }
  677. if (Depth >= TemplateArgs.getNumLevels() ||
  678. !TemplateArgs.hasTemplateArgument(Depth, Index))
  679. // The pattern refers to an unknown template argument. We're not ready to
  680. // expand this pack yet.
  681. return None;
  682. // Determine the size of the argument pack.
  683. unsigned Size = TemplateArgs(Depth, Index).pack_size();
  684. assert((!Result || *Result == Size) && "inconsistent pack sizes");
  685. Result = Size;
  686. }
  687. return Result;
  688. }
  689. bool Sema::containsUnexpandedParameterPacks(Declarator &D) {
  690. const DeclSpec &DS = D.getDeclSpec();
  691. switch (DS.getTypeSpecType()) {
  692. case TST_typename:
  693. case TST_typeofType:
  694. case TST_underlyingType:
  695. case TST_atomic: {
  696. QualType T = DS.getRepAsType().get();
  697. if (!T.isNull() && T->containsUnexpandedParameterPack())
  698. return true;
  699. break;
  700. }
  701. case TST_typeofExpr:
  702. case TST_decltype:
  703. if (DS.getRepAsExpr() &&
  704. DS.getRepAsExpr()->containsUnexpandedParameterPack())
  705. return true;
  706. break;
  707. case TST_unspecified:
  708. case TST_void:
  709. case TST_char:
  710. case TST_wchar:
  711. case TST_char8:
  712. case TST_char16:
  713. case TST_char32:
  714. case TST_int:
  715. case TST_int128:
  716. case TST_half:
  717. case TST_float:
  718. case TST_double:
  719. case TST_Accum:
  720. case TST_Fract:
  721. case TST_Float16:
  722. case TST_float128:
  723. case TST_bool:
  724. case TST_decimal32:
  725. case TST_decimal64:
  726. case TST_decimal128:
  727. case TST_enum:
  728. case TST_union:
  729. case TST_struct:
  730. case TST_interface:
  731. case TST_class:
  732. case TST_auto:
  733. case TST_auto_type:
  734. case TST_decltype_auto:
  735. #define GENERIC_IMAGE_TYPE(ImgType, Id) case TST_##ImgType##_t:
  736. #include "clang/Basic/OpenCLImageTypes.def"
  737. case TST_unknown_anytype:
  738. case TST_error:
  739. break;
  740. }
  741. for (unsigned I = 0, N = D.getNumTypeObjects(); I != N; ++I) {
  742. const DeclaratorChunk &Chunk = D.getTypeObject(I);
  743. switch (Chunk.Kind) {
  744. case DeclaratorChunk::Pointer:
  745. case DeclaratorChunk::Reference:
  746. case DeclaratorChunk::Paren:
  747. case DeclaratorChunk::Pipe:
  748. case DeclaratorChunk::BlockPointer:
  749. // These declarator chunks cannot contain any parameter packs.
  750. break;
  751. case DeclaratorChunk::Array:
  752. if (Chunk.Arr.NumElts &&
  753. Chunk.Arr.NumElts->containsUnexpandedParameterPack())
  754. return true;
  755. break;
  756. case DeclaratorChunk::Function:
  757. for (unsigned i = 0, e = Chunk.Fun.NumParams; i != e; ++i) {
  758. ParmVarDecl *Param = cast<ParmVarDecl>(Chunk.Fun.Params[i].Param);
  759. QualType ParamTy = Param->getType();
  760. assert(!ParamTy.isNull() && "Couldn't parse type?");
  761. if (ParamTy->containsUnexpandedParameterPack()) return true;
  762. }
  763. if (Chunk.Fun.getExceptionSpecType() == EST_Dynamic) {
  764. for (unsigned i = 0; i != Chunk.Fun.getNumExceptions(); ++i) {
  765. if (Chunk.Fun.Exceptions[i]
  766. .Ty.get()
  767. ->containsUnexpandedParameterPack())
  768. return true;
  769. }
  770. } else if (isComputedNoexcept(Chunk.Fun.getExceptionSpecType()) &&
  771. Chunk.Fun.NoexceptExpr->containsUnexpandedParameterPack())
  772. return true;
  773. if (Chunk.Fun.hasTrailingReturnType()) {
  774. QualType T = Chunk.Fun.getTrailingReturnType().get();
  775. if (!T.isNull() && T->containsUnexpandedParameterPack())
  776. return true;
  777. }
  778. break;
  779. case DeclaratorChunk::MemberPointer:
  780. if (Chunk.Mem.Scope().getScopeRep() &&
  781. Chunk.Mem.Scope().getScopeRep()->containsUnexpandedParameterPack())
  782. return true;
  783. break;
  784. }
  785. }
  786. return false;
  787. }
  788. namespace {
  789. // Callback to only accept typo corrections that refer to parameter packs.
  790. class ParameterPackValidatorCCC : public CorrectionCandidateCallback {
  791. public:
  792. bool ValidateCandidate(const TypoCorrection &candidate) override {
  793. NamedDecl *ND = candidate.getCorrectionDecl();
  794. return ND && ND->isParameterPack();
  795. }
  796. };
  797. }
  798. /// Called when an expression computing the size of a parameter pack
  799. /// is parsed.
  800. ///
  801. /// \code
  802. /// template<typename ...Types> struct count {
  803. /// static const unsigned value = sizeof...(Types);
  804. /// };
  805. /// \endcode
  806. ///
  807. //
  808. /// \param OpLoc The location of the "sizeof" keyword.
  809. /// \param Name The name of the parameter pack whose size will be determined.
  810. /// \param NameLoc The source location of the name of the parameter pack.
  811. /// \param RParenLoc The location of the closing parentheses.
  812. ExprResult Sema::ActOnSizeofParameterPackExpr(Scope *S,
  813. SourceLocation OpLoc,
  814. IdentifierInfo &Name,
  815. SourceLocation NameLoc,
  816. SourceLocation RParenLoc) {
  817. // C++0x [expr.sizeof]p5:
  818. // The identifier in a sizeof... expression shall name a parameter pack.
  819. LookupResult R(*this, &Name, NameLoc, LookupOrdinaryName);
  820. LookupName(R, S);
  821. NamedDecl *ParameterPack = nullptr;
  822. switch (R.getResultKind()) {
  823. case LookupResult::Found:
  824. ParameterPack = R.getFoundDecl();
  825. break;
  826. case LookupResult::NotFound:
  827. case LookupResult::NotFoundInCurrentInstantiation:
  828. if (TypoCorrection Corrected =
  829. CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, nullptr,
  830. llvm::make_unique<ParameterPackValidatorCCC>(),
  831. CTK_ErrorRecovery)) {
  832. diagnoseTypo(Corrected,
  833. PDiag(diag::err_sizeof_pack_no_pack_name_suggest) << &Name,
  834. PDiag(diag::note_parameter_pack_here));
  835. ParameterPack = Corrected.getCorrectionDecl();
  836. }
  837. break;
  838. case LookupResult::FoundOverloaded:
  839. case LookupResult::FoundUnresolvedValue:
  840. break;
  841. case LookupResult::Ambiguous:
  842. DiagnoseAmbiguousLookup(R);
  843. return ExprError();
  844. }
  845. if (!ParameterPack || !ParameterPack->isParameterPack()) {
  846. Diag(NameLoc, diag::err_sizeof_pack_no_pack_name)
  847. << &Name;
  848. return ExprError();
  849. }
  850. MarkAnyDeclReferenced(OpLoc, ParameterPack, true);
  851. return SizeOfPackExpr::Create(Context, OpLoc, ParameterPack, NameLoc,
  852. RParenLoc);
  853. }
  854. TemplateArgumentLoc
  855. Sema::getTemplateArgumentPackExpansionPattern(
  856. TemplateArgumentLoc OrigLoc,
  857. SourceLocation &Ellipsis, Optional<unsigned> &NumExpansions) const {
  858. const TemplateArgument &Argument = OrigLoc.getArgument();
  859. assert(Argument.isPackExpansion());
  860. switch (Argument.getKind()) {
  861. case TemplateArgument::Type: {
  862. // FIXME: We shouldn't ever have to worry about missing
  863. // type-source info!
  864. TypeSourceInfo *ExpansionTSInfo = OrigLoc.getTypeSourceInfo();
  865. if (!ExpansionTSInfo)
  866. ExpansionTSInfo = Context.getTrivialTypeSourceInfo(Argument.getAsType(),
  867. Ellipsis);
  868. PackExpansionTypeLoc Expansion =
  869. ExpansionTSInfo->getTypeLoc().castAs<PackExpansionTypeLoc>();
  870. Ellipsis = Expansion.getEllipsisLoc();
  871. TypeLoc Pattern = Expansion.getPatternLoc();
  872. NumExpansions = Expansion.getTypePtr()->getNumExpansions();
  873. // We need to copy the TypeLoc because TemplateArgumentLocs store a
  874. // TypeSourceInfo.
  875. // FIXME: Find some way to avoid the copy?
  876. TypeLocBuilder TLB;
  877. TLB.pushFullCopy(Pattern);
  878. TypeSourceInfo *PatternTSInfo =
  879. TLB.getTypeSourceInfo(Context, Pattern.getType());
  880. return TemplateArgumentLoc(TemplateArgument(Pattern.getType()),
  881. PatternTSInfo);
  882. }
  883. case TemplateArgument::Expression: {
  884. PackExpansionExpr *Expansion
  885. = cast<PackExpansionExpr>(Argument.getAsExpr());
  886. Expr *Pattern = Expansion->getPattern();
  887. Ellipsis = Expansion->getEllipsisLoc();
  888. NumExpansions = Expansion->getNumExpansions();
  889. return TemplateArgumentLoc(Pattern, Pattern);
  890. }
  891. case TemplateArgument::TemplateExpansion:
  892. Ellipsis = OrigLoc.getTemplateEllipsisLoc();
  893. NumExpansions = Argument.getNumTemplateExpansions();
  894. return TemplateArgumentLoc(Argument.getPackExpansionPattern(),
  895. OrigLoc.getTemplateQualifierLoc(),
  896. OrigLoc.getTemplateNameLoc());
  897. case TemplateArgument::Declaration:
  898. case TemplateArgument::NullPtr:
  899. case TemplateArgument::Template:
  900. case TemplateArgument::Integral:
  901. case TemplateArgument::Pack:
  902. case TemplateArgument::Null:
  903. return TemplateArgumentLoc();
  904. }
  905. llvm_unreachable("Invalid TemplateArgument Kind!");
  906. }
  907. Optional<unsigned> Sema::getFullyPackExpandedSize(TemplateArgument Arg) {
  908. assert(Arg.containsUnexpandedParameterPack());
  909. // If this is a substituted pack, grab that pack. If not, we don't know
  910. // the size yet.
  911. // FIXME: We could find a size in more cases by looking for a substituted
  912. // pack anywhere within this argument, but that's not necessary in the common
  913. // case for 'sizeof...(A)' handling.
  914. TemplateArgument Pack;
  915. switch (Arg.getKind()) {
  916. case TemplateArgument::Type:
  917. if (auto *Subst = Arg.getAsType()->getAs<SubstTemplateTypeParmPackType>())
  918. Pack = Subst->getArgumentPack();
  919. else
  920. return None;
  921. break;
  922. case TemplateArgument::Expression:
  923. if (auto *Subst =
  924. dyn_cast<SubstNonTypeTemplateParmPackExpr>(Arg.getAsExpr()))
  925. Pack = Subst->getArgumentPack();
  926. else if (auto *Subst = dyn_cast<FunctionParmPackExpr>(Arg.getAsExpr())) {
  927. for (ParmVarDecl *PD : *Subst)
  928. if (PD->isParameterPack())
  929. return None;
  930. return Subst->getNumExpansions();
  931. } else
  932. return None;
  933. break;
  934. case TemplateArgument::Template:
  935. if (SubstTemplateTemplateParmPackStorage *Subst =
  936. Arg.getAsTemplate().getAsSubstTemplateTemplateParmPack())
  937. Pack = Subst->getArgumentPack();
  938. else
  939. return None;
  940. break;
  941. case TemplateArgument::Declaration:
  942. case TemplateArgument::NullPtr:
  943. case TemplateArgument::TemplateExpansion:
  944. case TemplateArgument::Integral:
  945. case TemplateArgument::Pack:
  946. case TemplateArgument::Null:
  947. return None;
  948. }
  949. // Check that no argument in the pack is itself a pack expansion.
  950. for (TemplateArgument Elem : Pack.pack_elements()) {
  951. // There's no point recursing in this case; we would have already
  952. // expanded this pack expansion into the enclosing pack if we could.
  953. if (Elem.isPackExpansion())
  954. return None;
  955. }
  956. return Pack.pack_size();
  957. }
  958. static void CheckFoldOperand(Sema &S, Expr *E) {
  959. if (!E)
  960. return;
  961. E = E->IgnoreImpCasts();
  962. auto *OCE = dyn_cast<CXXOperatorCallExpr>(E);
  963. if ((OCE && OCE->isInfixBinaryOp()) || isa<BinaryOperator>(E) ||
  964. isa<AbstractConditionalOperator>(E)) {
  965. S.Diag(E->getExprLoc(), diag::err_fold_expression_bad_operand)
  966. << E->getSourceRange()
  967. << FixItHint::CreateInsertion(E->getBeginLoc(), "(")
  968. << FixItHint::CreateInsertion(E->getEndLoc(), ")");
  969. }
  970. }
  971. ExprResult Sema::ActOnCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
  972. tok::TokenKind Operator,
  973. SourceLocation EllipsisLoc, Expr *RHS,
  974. SourceLocation RParenLoc) {
  975. // LHS and RHS must be cast-expressions. We allow an arbitrary expression
  976. // in the parser and reduce down to just cast-expressions here.
  977. CheckFoldOperand(*this, LHS);
  978. CheckFoldOperand(*this, RHS);
  979. auto DiscardOperands = [&] {
  980. CorrectDelayedTyposInExpr(LHS);
  981. CorrectDelayedTyposInExpr(RHS);
  982. };
  983. // [expr.prim.fold]p3:
  984. // In a binary fold, op1 and op2 shall be the same fold-operator, and
  985. // either e1 shall contain an unexpanded parameter pack or e2 shall contain
  986. // an unexpanded parameter pack, but not both.
  987. if (LHS && RHS &&
  988. LHS->containsUnexpandedParameterPack() ==
  989. RHS->containsUnexpandedParameterPack()) {
  990. DiscardOperands();
  991. return Diag(EllipsisLoc,
  992. LHS->containsUnexpandedParameterPack()
  993. ? diag::err_fold_expression_packs_both_sides
  994. : diag::err_pack_expansion_without_parameter_packs)
  995. << LHS->getSourceRange() << RHS->getSourceRange();
  996. }
  997. // [expr.prim.fold]p2:
  998. // In a unary fold, the cast-expression shall contain an unexpanded
  999. // parameter pack.
  1000. if (!LHS || !RHS) {
  1001. Expr *Pack = LHS ? LHS : RHS;
  1002. assert(Pack && "fold expression with neither LHS nor RHS");
  1003. DiscardOperands();
  1004. if (!Pack->containsUnexpandedParameterPack())
  1005. return Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
  1006. << Pack->getSourceRange();
  1007. }
  1008. BinaryOperatorKind Opc = ConvertTokenKindToBinaryOpcode(Operator);
  1009. return BuildCXXFoldExpr(LParenLoc, LHS, Opc, EllipsisLoc, RHS, RParenLoc);
  1010. }
  1011. ExprResult Sema::BuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
  1012. BinaryOperatorKind Operator,
  1013. SourceLocation EllipsisLoc, Expr *RHS,
  1014. SourceLocation RParenLoc) {
  1015. return new (Context) CXXFoldExpr(Context.DependentTy, LParenLoc, LHS,
  1016. Operator, EllipsisLoc, RHS, RParenLoc);
  1017. }
  1018. ExprResult Sema::BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
  1019. BinaryOperatorKind Operator) {
  1020. // [temp.variadic]p9:
  1021. // If N is zero for a unary fold-expression, the value of the expression is
  1022. // && -> true
  1023. // || -> false
  1024. // , -> void()
  1025. // if the operator is not listed [above], the instantiation is ill-formed.
  1026. //
  1027. // Note that we need to use something like int() here, not merely 0, to
  1028. // prevent the result from being a null pointer constant.
  1029. QualType ScalarType;
  1030. switch (Operator) {
  1031. case BO_LOr:
  1032. return ActOnCXXBoolLiteral(EllipsisLoc, tok::kw_false);
  1033. case BO_LAnd:
  1034. return ActOnCXXBoolLiteral(EllipsisLoc, tok::kw_true);
  1035. case BO_Comma:
  1036. ScalarType = Context.VoidTy;
  1037. break;
  1038. default:
  1039. return Diag(EllipsisLoc, diag::err_fold_expression_empty)
  1040. << BinaryOperator::getOpcodeStr(Operator);
  1041. }
  1042. return new (Context) CXXScalarValueInitExpr(
  1043. ScalarType, Context.getTrivialTypeSourceInfo(ScalarType, EllipsisLoc),
  1044. EllipsisLoc);
  1045. }