1 //===------- SemaTemplateVariadic.cpp - C++ Variadic Templates ------------===/
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===/
8 // This file implements semantic analysis for C++0x variadic templates.
9 //===----------------------------------------------------------------------===/
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"
23 using namespace clang
;
25 //----------------------------------------------------------------------------
26 // Visitor that collects unexpanded parameter packs
27 //----------------------------------------------------------------------------
30 /// A class that collects unexpanded parameter packs.
31 class CollectUnexpandedParameterPacksVisitor
:
32 public RecursiveASTVisitor
<CollectUnexpandedParameterPacksVisitor
>
34 typedef RecursiveASTVisitor
<CollectUnexpandedParameterPacksVisitor
>
37 SmallVectorImpl
<UnexpandedParameterPack
> &Unexpanded
;
39 bool InLambda
= false;
40 unsigned DepthLimit
= (unsigned)-1;
42 void addUnexpanded(NamedDecl
*ND
, SourceLocation Loc
= SourceLocation()) {
43 if (auto *VD
= dyn_cast
<VarDecl
>(ND
)) {
44 // For now, the only problematic case is a generic lambda's templated
45 // call operator, so we don't need to look for all the other ways we
46 // could have reached a dependent parameter pack.
47 auto *FD
= dyn_cast
<FunctionDecl
>(VD
->getDeclContext());
48 auto *FTD
= FD
? FD
->getDescribedFunctionTemplate() : nullptr;
49 if (FTD
&& FTD
->getTemplateParameters()->getDepth() >= DepthLimit
)
51 } else if (getDepthAndIndex(ND
).first
>= DepthLimit
)
54 Unexpanded
.push_back({ND
, Loc
});
56 void addUnexpanded(const TemplateTypeParmType
*T
,
57 SourceLocation Loc
= SourceLocation()) {
58 if (T
->getDepth() < DepthLimit
)
59 Unexpanded
.push_back({T
, Loc
});
63 explicit CollectUnexpandedParameterPacksVisitor(
64 SmallVectorImpl
<UnexpandedParameterPack
> &Unexpanded
)
65 : Unexpanded(Unexpanded
) {}
67 bool shouldWalkTypesOfTypeLocs() const { return false; }
69 //------------------------------------------------------------------------
70 // Recording occurrences of (unexpanded) parameter packs.
71 //------------------------------------------------------------------------
73 /// Record occurrences of template type parameter packs.
74 bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL
) {
75 if (TL
.getTypePtr()->isParameterPack())
76 addUnexpanded(TL
.getTypePtr(), TL
.getNameLoc());
80 /// Record occurrences of template type parameter packs
81 /// when we don't have proper source-location information for
84 /// Ideally, this routine would never be used.
85 bool VisitTemplateTypeParmType(TemplateTypeParmType
*T
) {
86 if (T
->isParameterPack())
92 /// Record occurrences of function and non-type template
93 /// parameter packs in an expression.
94 bool VisitDeclRefExpr(DeclRefExpr
*E
) {
95 if (E
->getDecl()->isParameterPack())
96 addUnexpanded(E
->getDecl(), E
->getLocation());
101 /// Record occurrences of template template parameter packs.
102 bool TraverseTemplateName(TemplateName Template
) {
103 if (auto *TTP
= dyn_cast_or_null
<TemplateTemplateParmDecl
>(
104 Template
.getAsTemplateDecl())) {
105 if (TTP
->isParameterPack())
109 return inherited::TraverseTemplateName(Template
);
112 /// Suppress traversal into Objective-C container literal
113 /// elements that are pack expansions.
114 bool TraverseObjCDictionaryLiteral(ObjCDictionaryLiteral
*E
) {
115 if (!E
->containsUnexpandedParameterPack())
118 for (unsigned I
= 0, N
= E
->getNumElements(); I
!= N
; ++I
) {
119 ObjCDictionaryElement Element
= E
->getKeyValueElement(I
);
120 if (Element
.isPackExpansion())
123 TraverseStmt(Element
.Key
);
124 TraverseStmt(Element
.Value
);
128 //------------------------------------------------------------------------
129 // Pruning the search for unexpanded parameter packs.
130 //------------------------------------------------------------------------
132 /// Suppress traversal into statements and expressions that
133 /// do not contain unexpanded parameter packs.
134 bool TraverseStmt(Stmt
*S
) {
135 Expr
*E
= dyn_cast_or_null
<Expr
>(S
);
136 if ((E
&& E
->containsUnexpandedParameterPack()) || InLambda
)
137 return inherited::TraverseStmt(S
);
142 /// Suppress traversal into types that do not contain
143 /// unexpanded parameter packs.
144 bool TraverseType(QualType T
) {
145 if ((!T
.isNull() && T
->containsUnexpandedParameterPack()) || InLambda
)
146 return inherited::TraverseType(T
);
151 /// Suppress traversal into types with location information
152 /// that do not contain unexpanded parameter packs.
153 bool TraverseTypeLoc(TypeLoc TL
) {
154 if ((!TL
.getType().isNull() &&
155 TL
.getType()->containsUnexpandedParameterPack()) ||
157 return inherited::TraverseTypeLoc(TL
);
162 /// Suppress traversal of parameter packs.
163 bool TraverseDecl(Decl
*D
) {
164 // A function parameter pack is a pack expansion, so cannot contain
165 // an unexpanded parameter pack. Likewise for a template parameter
166 // pack that contains any references to other packs.
167 if (D
&& D
->isParameterPack())
170 return inherited::TraverseDecl(D
);
173 /// Suppress traversal of pack-expanded attributes.
174 bool TraverseAttr(Attr
*A
) {
175 if (A
->isPackExpansion())
178 return inherited::TraverseAttr(A
);
181 /// Suppress traversal of pack expansion expressions and types.
183 bool TraversePackExpansionType(PackExpansionType
*T
) { return true; }
184 bool TraversePackExpansionTypeLoc(PackExpansionTypeLoc TL
) { return true; }
185 bool TraversePackExpansionExpr(PackExpansionExpr
*E
) { return true; }
186 bool TraverseCXXFoldExpr(CXXFoldExpr
*E
) { return true; }
190 /// Suppress traversal of using-declaration pack expansion.
191 bool TraverseUnresolvedUsingValueDecl(UnresolvedUsingValueDecl
*D
) {
192 if (D
->isPackExpansion())
195 return inherited::TraverseUnresolvedUsingValueDecl(D
);
198 /// Suppress traversal of using-declaration pack expansion.
199 bool TraverseUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl
*D
) {
200 if (D
->isPackExpansion())
203 return inherited::TraverseUnresolvedUsingTypenameDecl(D
);
206 /// Suppress traversal of template argument pack expansions.
207 bool TraverseTemplateArgument(const TemplateArgument
&Arg
) {
208 if (Arg
.isPackExpansion())
211 return inherited::TraverseTemplateArgument(Arg
);
214 /// Suppress traversal of template argument pack expansions.
215 bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc
&ArgLoc
) {
216 if (ArgLoc
.getArgument().isPackExpansion())
219 return inherited::TraverseTemplateArgumentLoc(ArgLoc
);
222 /// Suppress traversal of base specifier pack expansions.
223 bool TraverseCXXBaseSpecifier(const CXXBaseSpecifier
&Base
) {
224 if (Base
.isPackExpansion())
227 return inherited::TraverseCXXBaseSpecifier(Base
);
230 /// Suppress traversal of mem-initializer pack expansions.
231 bool TraverseConstructorInitializer(CXXCtorInitializer
*Init
) {
232 if (Init
->isPackExpansion())
235 return inherited::TraverseConstructorInitializer(Init
);
238 /// Note whether we're traversing a lambda containing an unexpanded
239 /// parameter pack. In this case, the unexpanded pack can occur anywhere,
240 /// including all the places where we normally wouldn't look. Within a
241 /// lambda, we don't propagate the 'contains unexpanded parameter pack' bit
242 /// outside an expression.
243 bool TraverseLambdaExpr(LambdaExpr
*Lambda
) {
244 // The ContainsUnexpandedParameterPack bit on a lambda is always correct,
245 // even if it's contained within another lambda.
246 if (!Lambda
->containsUnexpandedParameterPack())
249 bool WasInLambda
= InLambda
;
250 unsigned OldDepthLimit
= DepthLimit
;
253 if (auto *TPL
= Lambda
->getTemplateParameterList())
254 DepthLimit
= TPL
->getDepth();
256 inherited::TraverseLambdaExpr(Lambda
);
258 InLambda
= WasInLambda
;
259 DepthLimit
= OldDepthLimit
;
263 /// Suppress traversal within pack expansions in lambda captures.
264 bool TraverseLambdaCapture(LambdaExpr
*Lambda
, const LambdaCapture
*C
,
266 if (C
->isPackExpansion())
269 return inherited::TraverseLambdaCapture(Lambda
, C
, Init
);
274 /// Determine whether it's possible for an unexpanded parameter pack to
275 /// be valid in this location. This only happens when we're in a declaration
276 /// that is nested within an expression that could be expanded, such as a
277 /// lambda-expression within a function call.
279 /// This is conservatively correct, but may claim that some unexpanded packs are
280 /// permitted when they are not.
281 bool Sema::isUnexpandedParameterPackPermitted() {
282 for (auto *SI
: FunctionScopes
)
283 if (isa
<sema::LambdaScopeInfo
>(SI
))
288 /// Diagnose all of the unexpanded parameter packs in the given
291 Sema::DiagnoseUnexpandedParameterPacks(SourceLocation Loc
,
292 UnexpandedParameterPackContext UPPC
,
293 ArrayRef
<UnexpandedParameterPack
> Unexpanded
) {
294 if (Unexpanded
.empty())
297 // If we are within a lambda expression and referencing a pack that is not
298 // declared within the lambda itself, that lambda contains an unexpanded
299 // parameter pack, and we are done.
300 // FIXME: Store 'Unexpanded' on the lambda so we don't need to recompute it
302 SmallVector
<UnexpandedParameterPack
, 4> LambdaParamPackReferences
;
303 if (auto *LSI
= getEnclosingLambda()) {
304 for (auto &Pack
: Unexpanded
) {
305 auto DeclaresThisPack
= [&](NamedDecl
*LocalPack
) {
306 if (auto *TTPT
= Pack
.first
.dyn_cast
<const TemplateTypeParmType
*>()) {
307 auto *TTPD
= dyn_cast
<TemplateTypeParmDecl
>(LocalPack
);
308 return TTPD
&& TTPD
->getTypeForDecl() == TTPT
;
310 return declaresSameEntity(Pack
.first
.get
<NamedDecl
*>(), LocalPack
);
312 if (llvm::any_of(LSI
->LocalPacks
, DeclaresThisPack
))
313 LambdaParamPackReferences
.push_back(Pack
);
316 if (LambdaParamPackReferences
.empty()) {
317 // Construct in lambda only references packs declared outside the lambda.
318 // That's OK for now, but the lambda itself is considered to contain an
319 // unexpanded pack in this case, which will require expansion outside the
322 // We do not permit pack expansion that would duplicate a statement
323 // expression, not even within a lambda.
324 // FIXME: We could probably support this for statement expressions that
325 // do not contain labels.
326 // FIXME: This is insufficient to detect this problem; consider
327 // f( ({ bad: 0; }) + pack ... );
328 bool EnclosingStmtExpr
= false;
329 for (unsigned N
= FunctionScopes
.size(); N
; --N
) {
330 sema::FunctionScopeInfo
*Func
= FunctionScopes
[N
-1];
332 Func
->CompoundScopes
,
333 [](sema::CompoundScopeInfo
&CSI
) { return CSI
.IsStmtExpr
; })) {
334 EnclosingStmtExpr
= true;
337 // Coumpound-statements outside the lambda are OK for now; we'll check
338 // for those when we finish handling the lambda.
343 if (!EnclosingStmtExpr
) {
344 LSI
->ContainsUnexpandedParameterPack
= true;
348 Unexpanded
= LambdaParamPackReferences
;
352 SmallVector
<SourceLocation
, 4> Locations
;
353 SmallVector
<IdentifierInfo
*, 4> Names
;
354 llvm::SmallPtrSet
<IdentifierInfo
*, 4> NamesKnown
;
356 for (unsigned I
= 0, N
= Unexpanded
.size(); I
!= N
; ++I
) {
357 IdentifierInfo
*Name
= nullptr;
358 if (const TemplateTypeParmType
*TTP
359 = Unexpanded
[I
].first
.dyn_cast
<const TemplateTypeParmType
*>())
360 Name
= TTP
->getIdentifier();
362 Name
= Unexpanded
[I
].first
.get
<NamedDecl
*>()->getIdentifier();
364 if (Name
&& NamesKnown
.insert(Name
).second
)
365 Names
.push_back(Name
);
367 if (Unexpanded
[I
].second
.isValid())
368 Locations
.push_back(Unexpanded
[I
].second
);
371 auto DB
= Diag(Loc
, diag::err_unexpanded_parameter_pack
)
372 << (int)UPPC
<< (int)Names
.size();
373 for (size_t I
= 0, E
= std::min(Names
.size(), (size_t)2); I
!= E
; ++I
)
376 for (unsigned I
= 0, N
= Locations
.size(); I
!= N
; ++I
)
377 DB
<< SourceRange(Locations
[I
]);
381 bool Sema::DiagnoseUnexpandedParameterPack(SourceLocation Loc
,
383 UnexpandedParameterPackContext UPPC
) {
384 // C++0x [temp.variadic]p5:
385 // An appearance of a name of a parameter pack that is not expanded is
387 if (!T
->getType()->containsUnexpandedParameterPack())
390 SmallVector
<UnexpandedParameterPack
, 2> Unexpanded
;
391 CollectUnexpandedParameterPacksVisitor(Unexpanded
).TraverseTypeLoc(
393 assert(!Unexpanded
.empty() && "Unable to find unexpanded parameter packs");
394 return DiagnoseUnexpandedParameterPacks(Loc
, UPPC
, Unexpanded
);
397 bool Sema::DiagnoseUnexpandedParameterPack(Expr
*E
,
398 UnexpandedParameterPackContext UPPC
) {
399 // C++0x [temp.variadic]p5:
400 // An appearance of a name of a parameter pack that is not expanded is
402 if (!E
->containsUnexpandedParameterPack())
405 SmallVector
<UnexpandedParameterPack
, 2> Unexpanded
;
406 CollectUnexpandedParameterPacksVisitor(Unexpanded
).TraverseStmt(E
);
407 assert(!Unexpanded
.empty() && "Unable to find unexpanded parameter packs");
408 return DiagnoseUnexpandedParameterPacks(E
->getBeginLoc(), UPPC
, Unexpanded
);
411 bool Sema::DiagnoseUnexpandedParameterPackInRequiresExpr(RequiresExpr
*RE
) {
412 if (!RE
->containsUnexpandedParameterPack())
415 SmallVector
<UnexpandedParameterPack
, 2> Unexpanded
;
416 CollectUnexpandedParameterPacksVisitor(Unexpanded
).TraverseStmt(RE
);
417 assert(!Unexpanded
.empty() && "Unable to find unexpanded parameter packs");
419 // We only care about unexpanded references to the RequiresExpr's own
421 auto Parms
= RE
->getLocalParameters();
422 llvm::SmallPtrSet
<NamedDecl
*, 8> ParmSet(Parms
.begin(), Parms
.end());
423 SmallVector
<UnexpandedParameterPack
, 2> UnexpandedParms
;
424 for (auto Parm
: Unexpanded
)
425 if (ParmSet
.contains(Parm
.first
.dyn_cast
<NamedDecl
*>()))
426 UnexpandedParms
.push_back(Parm
);
427 if (UnexpandedParms
.empty())
430 return DiagnoseUnexpandedParameterPacks(RE
->getBeginLoc(), UPPC_Requirement
,
434 bool Sema::DiagnoseUnexpandedParameterPack(const CXXScopeSpec
&SS
,
435 UnexpandedParameterPackContext UPPC
) {
436 // C++0x [temp.variadic]p5:
437 // An appearance of a name of a parameter pack that is not expanded is
439 if (!SS
.getScopeRep() ||
440 !SS
.getScopeRep()->containsUnexpandedParameterPack())
443 SmallVector
<UnexpandedParameterPack
, 2> Unexpanded
;
444 CollectUnexpandedParameterPacksVisitor(Unexpanded
)
445 .TraverseNestedNameSpecifier(SS
.getScopeRep());
446 assert(!Unexpanded
.empty() && "Unable to find unexpanded parameter packs");
447 return DiagnoseUnexpandedParameterPacks(SS
.getRange().getBegin(),
451 bool Sema::DiagnoseUnexpandedParameterPack(const DeclarationNameInfo
&NameInfo
,
452 UnexpandedParameterPackContext UPPC
) {
453 // C++0x [temp.variadic]p5:
454 // An appearance of a name of a parameter pack that is not expanded is
456 switch (NameInfo
.getName().getNameKind()) {
457 case DeclarationName::Identifier
:
458 case DeclarationName::ObjCZeroArgSelector
:
459 case DeclarationName::ObjCOneArgSelector
:
460 case DeclarationName::ObjCMultiArgSelector
:
461 case DeclarationName::CXXOperatorName
:
462 case DeclarationName::CXXLiteralOperatorName
:
463 case DeclarationName::CXXUsingDirective
:
464 case DeclarationName::CXXDeductionGuideName
:
467 case DeclarationName::CXXConstructorName
:
468 case DeclarationName::CXXDestructorName
:
469 case DeclarationName::CXXConversionFunctionName
:
470 // FIXME: We shouldn't need this null check!
471 if (TypeSourceInfo
*TSInfo
= NameInfo
.getNamedTypeInfo())
472 return DiagnoseUnexpandedParameterPack(NameInfo
.getLoc(), TSInfo
, UPPC
);
474 if (!NameInfo
.getName().getCXXNameType()->containsUnexpandedParameterPack())
480 SmallVector
<UnexpandedParameterPack
, 2> Unexpanded
;
481 CollectUnexpandedParameterPacksVisitor(Unexpanded
)
482 .TraverseType(NameInfo
.getName().getCXXNameType());
483 assert(!Unexpanded
.empty() && "Unable to find unexpanded parameter packs");
484 return DiagnoseUnexpandedParameterPacks(NameInfo
.getLoc(), UPPC
, Unexpanded
);
487 bool Sema::DiagnoseUnexpandedParameterPack(SourceLocation Loc
,
488 TemplateName Template
,
489 UnexpandedParameterPackContext UPPC
) {
491 if (Template
.isNull() || !Template
.containsUnexpandedParameterPack())
494 SmallVector
<UnexpandedParameterPack
, 2> Unexpanded
;
495 CollectUnexpandedParameterPacksVisitor(Unexpanded
)
496 .TraverseTemplateName(Template
);
497 assert(!Unexpanded
.empty() && "Unable to find unexpanded parameter packs");
498 return DiagnoseUnexpandedParameterPacks(Loc
, UPPC
, Unexpanded
);
501 bool Sema::DiagnoseUnexpandedParameterPack(TemplateArgumentLoc Arg
,
502 UnexpandedParameterPackContext UPPC
) {
503 if (Arg
.getArgument().isNull() ||
504 !Arg
.getArgument().containsUnexpandedParameterPack())
507 SmallVector
<UnexpandedParameterPack
, 2> Unexpanded
;
508 CollectUnexpandedParameterPacksVisitor(Unexpanded
)
509 .TraverseTemplateArgumentLoc(Arg
);
510 assert(!Unexpanded
.empty() && "Unable to find unexpanded parameter packs");
511 return DiagnoseUnexpandedParameterPacks(Arg
.getLocation(), UPPC
, Unexpanded
);
514 void Sema::collectUnexpandedParameterPacks(TemplateArgument Arg
,
515 SmallVectorImpl
<UnexpandedParameterPack
> &Unexpanded
) {
516 CollectUnexpandedParameterPacksVisitor(Unexpanded
)
517 .TraverseTemplateArgument(Arg
);
520 void Sema::collectUnexpandedParameterPacks(TemplateArgumentLoc Arg
,
521 SmallVectorImpl
<UnexpandedParameterPack
> &Unexpanded
) {
522 CollectUnexpandedParameterPacksVisitor(Unexpanded
)
523 .TraverseTemplateArgumentLoc(Arg
);
526 void Sema::collectUnexpandedParameterPacks(QualType T
,
527 SmallVectorImpl
<UnexpandedParameterPack
> &Unexpanded
) {
528 CollectUnexpandedParameterPacksVisitor(Unexpanded
).TraverseType(T
);
531 void Sema::collectUnexpandedParameterPacks(TypeLoc TL
,
532 SmallVectorImpl
<UnexpandedParameterPack
> &Unexpanded
) {
533 CollectUnexpandedParameterPacksVisitor(Unexpanded
).TraverseTypeLoc(TL
);
536 void Sema::collectUnexpandedParameterPacks(
537 NestedNameSpecifierLoc NNS
,
538 SmallVectorImpl
<UnexpandedParameterPack
> &Unexpanded
) {
539 CollectUnexpandedParameterPacksVisitor(Unexpanded
)
540 .TraverseNestedNameSpecifierLoc(NNS
);
543 void Sema::collectUnexpandedParameterPacks(
544 const DeclarationNameInfo
&NameInfo
,
545 SmallVectorImpl
<UnexpandedParameterPack
> &Unexpanded
) {
546 CollectUnexpandedParameterPacksVisitor(Unexpanded
)
547 .TraverseDeclarationNameInfo(NameInfo
);
551 ParsedTemplateArgument
552 Sema::ActOnPackExpansion(const ParsedTemplateArgument
&Arg
,
553 SourceLocation EllipsisLoc
) {
557 switch (Arg
.getKind()) {
558 case ParsedTemplateArgument::Type
: {
559 TypeResult Result
= ActOnPackExpansion(Arg
.getAsType(), EllipsisLoc
);
560 if (Result
.isInvalid())
561 return ParsedTemplateArgument();
563 return ParsedTemplateArgument(Arg
.getKind(), Result
.get().getAsOpaquePtr(),
567 case ParsedTemplateArgument::NonType
: {
568 ExprResult Result
= ActOnPackExpansion(Arg
.getAsExpr(), EllipsisLoc
);
569 if (Result
.isInvalid())
570 return ParsedTemplateArgument();
572 return ParsedTemplateArgument(Arg
.getKind(), Result
.get(),
576 case ParsedTemplateArgument::Template
:
577 if (!Arg
.getAsTemplate().get().containsUnexpandedParameterPack()) {
578 SourceRange
R(Arg
.getLocation());
579 if (Arg
.getScopeSpec().isValid())
580 R
.setBegin(Arg
.getScopeSpec().getBeginLoc());
581 Diag(EllipsisLoc
, diag::err_pack_expansion_without_parameter_packs
)
583 return ParsedTemplateArgument();
586 return Arg
.getTemplatePackExpansion(EllipsisLoc
);
588 llvm_unreachable("Unhandled template argument kind?");
591 TypeResult
Sema::ActOnPackExpansion(ParsedType Type
,
592 SourceLocation EllipsisLoc
) {
593 TypeSourceInfo
*TSInfo
;
594 GetTypeFromParser(Type
, &TSInfo
);
598 TypeSourceInfo
*TSResult
=
599 CheckPackExpansion(TSInfo
, EllipsisLoc
, std::nullopt
);
603 return CreateParsedType(TSResult
->getType(), TSResult
);
607 Sema::CheckPackExpansion(TypeSourceInfo
*Pattern
, SourceLocation EllipsisLoc
,
608 std::optional
<unsigned> NumExpansions
) {
609 // Create the pack expansion type and source-location information.
610 QualType Result
= CheckPackExpansion(Pattern
->getType(),
611 Pattern
->getTypeLoc().getSourceRange(),
612 EllipsisLoc
, NumExpansions
);
617 TLB
.pushFullCopy(Pattern
->getTypeLoc());
618 PackExpansionTypeLoc TL
= TLB
.push
<PackExpansionTypeLoc
>(Result
);
619 TL
.setEllipsisLoc(EllipsisLoc
);
621 return TLB
.getTypeSourceInfo(Context
, Result
);
624 QualType
Sema::CheckPackExpansion(QualType Pattern
, SourceRange PatternRange
,
625 SourceLocation EllipsisLoc
,
626 std::optional
<unsigned> NumExpansions
) {
627 // C++11 [temp.variadic]p5:
628 // The pattern of a pack expansion shall name one or more
629 // parameter packs that are not expanded by a nested pack
632 // A pattern containing a deduced type can't occur "naturally" but arises in
633 // the desugaring of an init-capture pack.
634 if (!Pattern
->containsUnexpandedParameterPack() &&
635 !Pattern
->getContainedDeducedType()) {
636 Diag(EllipsisLoc
, diag::err_pack_expansion_without_parameter_packs
)
641 return Context
.getPackExpansionType(Pattern
, NumExpansions
,
642 /*ExpectPackInType=*/false);
645 ExprResult
Sema::ActOnPackExpansion(Expr
*Pattern
, SourceLocation EllipsisLoc
) {
646 return CheckPackExpansion(Pattern
, EllipsisLoc
, std::nullopt
);
649 ExprResult
Sema::CheckPackExpansion(Expr
*Pattern
, SourceLocation EllipsisLoc
,
650 std::optional
<unsigned> NumExpansions
) {
654 // C++0x [temp.variadic]p5:
655 // The pattern of a pack expansion shall name one or more
656 // parameter packs that are not expanded by a nested pack
658 if (!Pattern
->containsUnexpandedParameterPack()) {
659 Diag(EllipsisLoc
, diag::err_pack_expansion_without_parameter_packs
)
660 << Pattern
->getSourceRange();
661 CorrectDelayedTyposInExpr(Pattern
);
665 // Create the pack expansion expression and source-location information.
667 PackExpansionExpr(Context
.DependentTy
, Pattern
, EllipsisLoc
, NumExpansions
);
670 bool Sema::CheckParameterPacksForExpansion(
671 SourceLocation EllipsisLoc
, SourceRange PatternRange
,
672 ArrayRef
<UnexpandedParameterPack
> Unexpanded
,
673 const MultiLevelTemplateArgumentList
&TemplateArgs
, bool &ShouldExpand
,
674 bool &RetainExpansion
, std::optional
<unsigned> &NumExpansions
) {
676 RetainExpansion
= false;
677 std::pair
<IdentifierInfo
*, SourceLocation
> FirstPack
;
678 bool HaveFirstPack
= false;
679 std::optional
<unsigned> NumPartialExpansions
;
680 SourceLocation PartiallySubstitutedPackLoc
;
682 for (UnexpandedParameterPack ParmPack
: Unexpanded
) {
683 // Compute the depth and index for this parameter pack.
684 unsigned Depth
= 0, Index
= 0;
685 IdentifierInfo
*Name
;
686 bool IsVarDeclPack
= false;
688 if (const TemplateTypeParmType
*TTP
=
689 ParmPack
.first
.dyn_cast
<const TemplateTypeParmType
*>()) {
690 Depth
= TTP
->getDepth();
691 Index
= TTP
->getIndex();
692 Name
= TTP
->getIdentifier();
694 NamedDecl
*ND
= ParmPack
.first
.get
<NamedDecl
*>();
695 if (isa
<VarDecl
>(ND
))
696 IsVarDeclPack
= true;
698 std::tie(Depth
, Index
) = getDepthAndIndex(ND
);
700 Name
= ND
->getIdentifier();
703 // Determine the size of this argument pack.
704 unsigned NewPackSize
;
706 // Figure out whether we're instantiating to an argument pack or not.
707 typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack
;
709 llvm::PointerUnion
<Decl
*, DeclArgumentPack
*> *Instantiation
=
710 CurrentInstantiationScope
->findInstantiationOf(
711 ParmPack
.first
.get
<NamedDecl
*>());
712 if (Instantiation
->is
<DeclArgumentPack
*>()) {
713 // We could expand this function parameter pack.
714 NewPackSize
= Instantiation
->get
<DeclArgumentPack
*>()->size();
716 // We can't expand this function parameter pack, so we can't expand
717 // the pack expansion.
718 ShouldExpand
= false;
722 // If we don't have a template argument at this depth/index, then we
723 // cannot expand the pack expansion. Make a note of this, but we still
724 // want to check any parameter packs we *do* have arguments for.
725 if (Depth
>= TemplateArgs
.getNumLevels() ||
726 !TemplateArgs
.hasTemplateArgument(Depth
, Index
)) {
727 ShouldExpand
= false;
731 // Determine the size of the argument pack.
732 NewPackSize
= TemplateArgs(Depth
, Index
).pack_size();
735 // C++0x [temp.arg.explicit]p9:
736 // Template argument deduction can extend the sequence of template
737 // arguments corresponding to a template parameter pack, even when the
738 // sequence contains explicitly specified template arguments.
739 if (!IsVarDeclPack
&& CurrentInstantiationScope
) {
740 if (NamedDecl
*PartialPack
=
741 CurrentInstantiationScope
->getPartiallySubstitutedPack()) {
742 unsigned PartialDepth
, PartialIndex
;
743 std::tie(PartialDepth
, PartialIndex
) = getDepthAndIndex(PartialPack
);
744 if (PartialDepth
== Depth
&& PartialIndex
== Index
) {
745 RetainExpansion
= true;
746 // We don't actually know the new pack size yet.
747 NumPartialExpansions
= NewPackSize
;
748 PartiallySubstitutedPackLoc
= ParmPack
.second
;
754 if (!NumExpansions
) {
755 // The is the first pack we've seen for which we have an argument.
757 NumExpansions
= NewPackSize
;
758 FirstPack
.first
= Name
;
759 FirstPack
.second
= ParmPack
.second
;
760 HaveFirstPack
= true;
764 if (NewPackSize
!= *NumExpansions
) {
765 // C++0x [temp.variadic]p5:
766 // All of the parameter packs expanded by a pack expansion shall have
767 // the same number of arguments specified.
769 Diag(EllipsisLoc
, diag::err_pack_expansion_length_conflict
)
770 << FirstPack
.first
<< Name
<< *NumExpansions
<< NewPackSize
771 << SourceRange(FirstPack
.second
) << SourceRange(ParmPack
.second
);
773 Diag(EllipsisLoc
, diag::err_pack_expansion_length_conflict_multilevel
)
774 << Name
<< *NumExpansions
<< NewPackSize
775 << SourceRange(ParmPack
.second
);
780 // If we're performing a partial expansion but we also have a full expansion,
781 // expand to the number of common arguments. For example, given:
783 // template<typename ...T> struct A {
784 // template<typename ...U> void f(pair<T, U>...);
787 // ... a call to 'A<int, int>().f<int>' should expand the pack once and
788 // retain an expansion.
789 if (NumPartialExpansions
) {
790 if (NumExpansions
&& *NumExpansions
< *NumPartialExpansions
) {
791 NamedDecl
*PartialPack
=
792 CurrentInstantiationScope
->getPartiallySubstitutedPack();
793 Diag(EllipsisLoc
, diag::err_pack_expansion_length_conflict_partial
)
794 << PartialPack
<< *NumPartialExpansions
<< *NumExpansions
795 << SourceRange(PartiallySubstitutedPackLoc
);
799 NumExpansions
= NumPartialExpansions
;
805 std::optional
<unsigned> Sema::getNumArgumentsInExpansion(
806 QualType T
, const MultiLevelTemplateArgumentList
&TemplateArgs
) {
807 QualType Pattern
= cast
<PackExpansionType
>(T
)->getPattern();
808 SmallVector
<UnexpandedParameterPack
, 2> Unexpanded
;
809 CollectUnexpandedParameterPacksVisitor(Unexpanded
).TraverseType(Pattern
);
811 std::optional
<unsigned> Result
;
812 for (unsigned I
= 0, N
= Unexpanded
.size(); I
!= N
; ++I
) {
813 // Compute the depth and index for this parameter pack.
817 if (const TemplateTypeParmType
*TTP
=
818 Unexpanded
[I
].first
.dyn_cast
<const TemplateTypeParmType
*>()) {
819 Depth
= TTP
->getDepth();
820 Index
= TTP
->getIndex();
822 NamedDecl
*ND
= Unexpanded
[I
].first
.get
<NamedDecl
*>();
823 if (isa
<VarDecl
>(ND
)) {
824 // Function parameter pack or init-capture pack.
825 typedef LocalInstantiationScope::DeclArgumentPack DeclArgumentPack
;
827 llvm::PointerUnion
<Decl
*, DeclArgumentPack
*> *Instantiation
=
828 CurrentInstantiationScope
->findInstantiationOf(
829 Unexpanded
[I
].first
.get
<NamedDecl
*>());
830 if (Instantiation
->is
<Decl
*>())
831 // The pattern refers to an unexpanded pack. We're not ready to expand
835 unsigned Size
= Instantiation
->get
<DeclArgumentPack
*>()->size();
836 assert((!Result
|| *Result
== Size
) && "inconsistent pack sizes");
841 std::tie(Depth
, Index
) = getDepthAndIndex(ND
);
843 if (Depth
>= TemplateArgs
.getNumLevels() ||
844 !TemplateArgs
.hasTemplateArgument(Depth
, Index
))
845 // The pattern refers to an unknown template argument. We're not ready to
846 // expand this pack yet.
849 // Determine the size of the argument pack.
850 unsigned Size
= TemplateArgs(Depth
, Index
).pack_size();
851 assert((!Result
|| *Result
== Size
) && "inconsistent pack sizes");
858 bool Sema::containsUnexpandedParameterPacks(Declarator
&D
) {
859 const DeclSpec
&DS
= D
.getDeclSpec();
860 switch (DS
.getTypeSpecType()) {
862 case TST_typeof_unqualType
:
864 #define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case TST_##Trait:
865 #include "clang/Basic/TransformTypeTraits.def"
867 QualType T
= DS
.getRepAsType().get();
868 if (!T
.isNull() && T
->containsUnexpandedParameterPack())
873 case TST_typeof_unqualExpr
:
877 if (DS
.getRepAsExpr() &&
878 DS
.getRepAsExpr()->containsUnexpandedParameterPack())
882 case TST_unspecified
:
910 case TST_decltype_auto
:
912 #define GENERIC_IMAGE_TYPE(ImgType, Id) case TST_##ImgType##_t:
913 #include "clang/Basic/OpenCLImageTypes.def"
914 case TST_unknown_anytype
:
919 for (unsigned I
= 0, N
= D
.getNumTypeObjects(); I
!= N
; ++I
) {
920 const DeclaratorChunk
&Chunk
= D
.getTypeObject(I
);
921 switch (Chunk
.Kind
) {
922 case DeclaratorChunk::Pointer
:
923 case DeclaratorChunk::Reference
:
924 case DeclaratorChunk::Paren
:
925 case DeclaratorChunk::Pipe
:
926 case DeclaratorChunk::BlockPointer
:
927 // These declarator chunks cannot contain any parameter packs.
930 case DeclaratorChunk::Array
:
931 if (Chunk
.Arr
.NumElts
&&
932 Chunk
.Arr
.NumElts
->containsUnexpandedParameterPack())
935 case DeclaratorChunk::Function
:
936 for (unsigned i
= 0, e
= Chunk
.Fun
.NumParams
; i
!= e
; ++i
) {
937 ParmVarDecl
*Param
= cast
<ParmVarDecl
>(Chunk
.Fun
.Params
[i
].Param
);
938 QualType ParamTy
= Param
->getType();
939 assert(!ParamTy
.isNull() && "Couldn't parse type?");
940 if (ParamTy
->containsUnexpandedParameterPack()) return true;
943 if (Chunk
.Fun
.getExceptionSpecType() == EST_Dynamic
) {
944 for (unsigned i
= 0; i
!= Chunk
.Fun
.getNumExceptions(); ++i
) {
945 if (Chunk
.Fun
.Exceptions
[i
]
947 ->containsUnexpandedParameterPack())
950 } else if (isComputedNoexcept(Chunk
.Fun
.getExceptionSpecType()) &&
951 Chunk
.Fun
.NoexceptExpr
->containsUnexpandedParameterPack())
954 if (Chunk
.Fun
.hasTrailingReturnType()) {
955 QualType T
= Chunk
.Fun
.getTrailingReturnType().get();
956 if (!T
.isNull() && T
->containsUnexpandedParameterPack())
961 case DeclaratorChunk::MemberPointer
:
962 if (Chunk
.Mem
.Scope().getScopeRep() &&
963 Chunk
.Mem
.Scope().getScopeRep()->containsUnexpandedParameterPack())
969 if (Expr
*TRC
= D
.getTrailingRequiresClause())
970 if (TRC
->containsUnexpandedParameterPack())
978 // Callback to only accept typo corrections that refer to parameter packs.
979 class ParameterPackValidatorCCC final
: public CorrectionCandidateCallback
{
981 bool ValidateCandidate(const TypoCorrection
&candidate
) override
{
982 NamedDecl
*ND
= candidate
.getCorrectionDecl();
983 return ND
&& ND
->isParameterPack();
986 std::unique_ptr
<CorrectionCandidateCallback
> clone() override
{
987 return std::make_unique
<ParameterPackValidatorCCC
>(*this);
993 /// Called when an expression computing the size of a parameter pack
997 /// template<typename ...Types> struct count {
998 /// static const unsigned value = sizeof...(Types);
1003 /// \param OpLoc The location of the "sizeof" keyword.
1004 /// \param Name The name of the parameter pack whose size will be determined.
1005 /// \param NameLoc The source location of the name of the parameter pack.
1006 /// \param RParenLoc The location of the closing parentheses.
1007 ExprResult
Sema::ActOnSizeofParameterPackExpr(Scope
*S
,
1008 SourceLocation OpLoc
,
1009 IdentifierInfo
&Name
,
1010 SourceLocation NameLoc
,
1011 SourceLocation RParenLoc
) {
1012 // C++0x [expr.sizeof]p5:
1013 // The identifier in a sizeof... expression shall name a parameter pack.
1014 LookupResult
R(*this, &Name
, NameLoc
, LookupOrdinaryName
);
1017 NamedDecl
*ParameterPack
= nullptr;
1018 switch (R
.getResultKind()) {
1019 case LookupResult::Found
:
1020 ParameterPack
= R
.getFoundDecl();
1023 case LookupResult::NotFound
:
1024 case LookupResult::NotFoundInCurrentInstantiation
: {
1025 ParameterPackValidatorCCC CCC
{};
1026 if (TypoCorrection Corrected
=
1027 CorrectTypo(R
.getLookupNameInfo(), R
.getLookupKind(), S
, nullptr,
1028 CCC
, CTK_ErrorRecovery
)) {
1029 diagnoseTypo(Corrected
,
1030 PDiag(diag::err_sizeof_pack_no_pack_name_suggest
) << &Name
,
1031 PDiag(diag::note_parameter_pack_here
));
1032 ParameterPack
= Corrected
.getCorrectionDecl();
1036 case LookupResult::FoundOverloaded
:
1037 case LookupResult::FoundUnresolvedValue
:
1040 case LookupResult::Ambiguous
:
1041 DiagnoseAmbiguousLookup(R
);
1045 if (!ParameterPack
|| !ParameterPack
->isParameterPack()) {
1046 Diag(NameLoc
, diag::err_sizeof_pack_no_pack_name
)
1051 MarkAnyDeclReferenced(OpLoc
, ParameterPack
, true);
1053 return SizeOfPackExpr::Create(Context
, OpLoc
, ParameterPack
, NameLoc
,
1057 TemplateArgumentLoc
Sema::getTemplateArgumentPackExpansionPattern(
1058 TemplateArgumentLoc OrigLoc
, SourceLocation
&Ellipsis
,
1059 std::optional
<unsigned> &NumExpansions
) const {
1060 const TemplateArgument
&Argument
= OrigLoc
.getArgument();
1061 assert(Argument
.isPackExpansion());
1062 switch (Argument
.getKind()) {
1063 case TemplateArgument::Type
: {
1064 // FIXME: We shouldn't ever have to worry about missing
1065 // type-source info!
1066 TypeSourceInfo
*ExpansionTSInfo
= OrigLoc
.getTypeSourceInfo();
1067 if (!ExpansionTSInfo
)
1068 ExpansionTSInfo
= Context
.getTrivialTypeSourceInfo(Argument
.getAsType(),
1070 PackExpansionTypeLoc Expansion
=
1071 ExpansionTSInfo
->getTypeLoc().castAs
<PackExpansionTypeLoc
>();
1072 Ellipsis
= Expansion
.getEllipsisLoc();
1074 TypeLoc Pattern
= Expansion
.getPatternLoc();
1075 NumExpansions
= Expansion
.getTypePtr()->getNumExpansions();
1077 // We need to copy the TypeLoc because TemplateArgumentLocs store a
1079 // FIXME: Find some way to avoid the copy?
1081 TLB
.pushFullCopy(Pattern
);
1082 TypeSourceInfo
*PatternTSInfo
=
1083 TLB
.getTypeSourceInfo(Context
, Pattern
.getType());
1084 return TemplateArgumentLoc(TemplateArgument(Pattern
.getType()),
1088 case TemplateArgument::Expression
: {
1089 PackExpansionExpr
*Expansion
1090 = cast
<PackExpansionExpr
>(Argument
.getAsExpr());
1091 Expr
*Pattern
= Expansion
->getPattern();
1092 Ellipsis
= Expansion
->getEllipsisLoc();
1093 NumExpansions
= Expansion
->getNumExpansions();
1094 return TemplateArgumentLoc(Pattern
, Pattern
);
1097 case TemplateArgument::TemplateExpansion
:
1098 Ellipsis
= OrigLoc
.getTemplateEllipsisLoc();
1099 NumExpansions
= Argument
.getNumTemplateExpansions();
1100 return TemplateArgumentLoc(Context
, Argument
.getPackExpansionPattern(),
1101 OrigLoc
.getTemplateQualifierLoc(),
1102 OrigLoc
.getTemplateNameLoc());
1104 case TemplateArgument::Declaration
:
1105 case TemplateArgument::NullPtr
:
1106 case TemplateArgument::Template
:
1107 case TemplateArgument::Integral
:
1108 case TemplateArgument::Pack
:
1109 case TemplateArgument::Null
:
1110 return TemplateArgumentLoc();
1113 llvm_unreachable("Invalid TemplateArgument Kind!");
1116 std::optional
<unsigned> Sema::getFullyPackExpandedSize(TemplateArgument Arg
) {
1117 assert(Arg
.containsUnexpandedParameterPack());
1119 // If this is a substituted pack, grab that pack. If not, we don't know
1121 // FIXME: We could find a size in more cases by looking for a substituted
1122 // pack anywhere within this argument, but that's not necessary in the common
1123 // case for 'sizeof...(A)' handling.
1124 TemplateArgument Pack
;
1125 switch (Arg
.getKind()) {
1126 case TemplateArgument::Type
:
1127 if (auto *Subst
= Arg
.getAsType()->getAs
<SubstTemplateTypeParmPackType
>())
1128 Pack
= Subst
->getArgumentPack();
1130 return std::nullopt
;
1133 case TemplateArgument::Expression
:
1135 dyn_cast
<SubstNonTypeTemplateParmPackExpr
>(Arg
.getAsExpr()))
1136 Pack
= Subst
->getArgumentPack();
1137 else if (auto *Subst
= dyn_cast
<FunctionParmPackExpr
>(Arg
.getAsExpr())) {
1138 for (VarDecl
*PD
: *Subst
)
1139 if (PD
->isParameterPack())
1140 return std::nullopt
;
1141 return Subst
->getNumExpansions();
1143 return std::nullopt
;
1146 case TemplateArgument::Template
:
1147 if (SubstTemplateTemplateParmPackStorage
*Subst
=
1148 Arg
.getAsTemplate().getAsSubstTemplateTemplateParmPack())
1149 Pack
= Subst
->getArgumentPack();
1151 return std::nullopt
;
1154 case TemplateArgument::Declaration
:
1155 case TemplateArgument::NullPtr
:
1156 case TemplateArgument::TemplateExpansion
:
1157 case TemplateArgument::Integral
:
1158 case TemplateArgument::Pack
:
1159 case TemplateArgument::Null
:
1160 return std::nullopt
;
1163 // Check that no argument in the pack is itself a pack expansion.
1164 for (TemplateArgument Elem
: Pack
.pack_elements()) {
1165 // There's no point recursing in this case; we would have already
1166 // expanded this pack expansion into the enclosing pack if we could.
1167 if (Elem
.isPackExpansion())
1168 return std::nullopt
;
1170 return Pack
.pack_size();
1173 static void CheckFoldOperand(Sema
&S
, Expr
*E
) {
1177 E
= E
->IgnoreImpCasts();
1178 auto *OCE
= dyn_cast
<CXXOperatorCallExpr
>(E
);
1179 if ((OCE
&& OCE
->isInfixBinaryOp()) || isa
<BinaryOperator
>(E
) ||
1180 isa
<AbstractConditionalOperator
>(E
)) {
1181 S
.Diag(E
->getExprLoc(), diag::err_fold_expression_bad_operand
)
1182 << E
->getSourceRange()
1183 << FixItHint::CreateInsertion(E
->getBeginLoc(), "(")
1184 << FixItHint::CreateInsertion(E
->getEndLoc(), ")");
1188 ExprResult
Sema::ActOnCXXFoldExpr(Scope
*S
, SourceLocation LParenLoc
, Expr
*LHS
,
1189 tok::TokenKind Operator
,
1190 SourceLocation EllipsisLoc
, Expr
*RHS
,
1191 SourceLocation RParenLoc
) {
1192 // LHS and RHS must be cast-expressions. We allow an arbitrary expression
1193 // in the parser and reduce down to just cast-expressions here.
1194 CheckFoldOperand(*this, LHS
);
1195 CheckFoldOperand(*this, RHS
);
1197 auto DiscardOperands
= [&] {
1198 CorrectDelayedTyposInExpr(LHS
);
1199 CorrectDelayedTyposInExpr(RHS
);
1202 // [expr.prim.fold]p3:
1203 // In a binary fold, op1 and op2 shall be the same fold-operator, and
1204 // either e1 shall contain an unexpanded parameter pack or e2 shall contain
1205 // an unexpanded parameter pack, but not both.
1207 LHS
->containsUnexpandedParameterPack() ==
1208 RHS
->containsUnexpandedParameterPack()) {
1210 return Diag(EllipsisLoc
,
1211 LHS
->containsUnexpandedParameterPack()
1212 ? diag::err_fold_expression_packs_both_sides
1213 : diag::err_pack_expansion_without_parameter_packs
)
1214 << LHS
->getSourceRange() << RHS
->getSourceRange();
1217 // [expr.prim.fold]p2:
1218 // In a unary fold, the cast-expression shall contain an unexpanded
1221 Expr
*Pack
= LHS
? LHS
: RHS
;
1222 assert(Pack
&& "fold expression with neither LHS nor RHS");
1223 if (!Pack
->containsUnexpandedParameterPack()) {
1225 return Diag(EllipsisLoc
, diag::err_pack_expansion_without_parameter_packs
)
1226 << Pack
->getSourceRange();
1230 BinaryOperatorKind Opc
= ConvertTokenKindToBinaryOpcode(Operator
);
1232 // Perform first-phase name lookup now.
1233 UnresolvedLookupExpr
*ULE
= nullptr;
1235 UnresolvedSet
<16> Functions
;
1236 LookupBinOp(S
, EllipsisLoc
, Opc
, Functions
);
1237 if (!Functions
.empty()) {
1238 DeclarationName OpName
= Context
.DeclarationNames
.getCXXOperatorName(
1239 BinaryOperator::getOverloadedOperator(Opc
));
1240 ExprResult Callee
= CreateUnresolvedLookupExpr(
1241 /*NamingClass*/ nullptr, NestedNameSpecifierLoc(),
1242 DeclarationNameInfo(OpName
, EllipsisLoc
), Functions
);
1243 if (Callee
.isInvalid())
1245 ULE
= cast
<UnresolvedLookupExpr
>(Callee
.get());
1249 return BuildCXXFoldExpr(ULE
, LParenLoc
, LHS
, Opc
, EllipsisLoc
, RHS
, RParenLoc
,
1253 ExprResult
Sema::BuildCXXFoldExpr(UnresolvedLookupExpr
*Callee
,
1254 SourceLocation LParenLoc
, Expr
*LHS
,
1255 BinaryOperatorKind Operator
,
1256 SourceLocation EllipsisLoc
, Expr
*RHS
,
1257 SourceLocation RParenLoc
,
1258 std::optional
<unsigned> NumExpansions
) {
1259 return new (Context
)
1260 CXXFoldExpr(Context
.DependentTy
, Callee
, LParenLoc
, LHS
, Operator
,
1261 EllipsisLoc
, RHS
, RParenLoc
, NumExpansions
);
1264 ExprResult
Sema::BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc
,
1265 BinaryOperatorKind Operator
) {
1266 // [temp.variadic]p9:
1267 // If N is zero for a unary fold-expression, the value of the expression is
1271 // if the operator is not listed [above], the instantiation is ill-formed.
1273 // Note that we need to use something like int() here, not merely 0, to
1274 // prevent the result from being a null pointer constant.
1275 QualType ScalarType
;
1278 return ActOnCXXBoolLiteral(EllipsisLoc
, tok::kw_false
);
1280 return ActOnCXXBoolLiteral(EllipsisLoc
, tok::kw_true
);
1282 ScalarType
= Context
.VoidTy
;
1286 return Diag(EllipsisLoc
, diag::err_fold_expression_empty
)
1287 << BinaryOperator::getOpcodeStr(Operator
);
1290 return new (Context
) CXXScalarValueInitExpr(
1291 ScalarType
, Context
.getTrivialTypeSourceInfo(ScalarType
, EllipsisLoc
),