;
33classCollectUnexpandedParameterPacksVisitor
37 boolInLambdaOrBlock =
false;
38 unsignedDepthLimit = (
unsigned)-1;
41 boolContainsIntermediatePacks =
false;
45 if(
auto*VD = dyn_cast<VarDecl>(ND)) {
49 auto*FD = dyn_cast<FunctionDecl>(VD->getDeclContext());
50 auto*FTD = FD ? FD->getDescribedFunctionTemplate() :
nullptr;
51 if(FTD && FTD->getTemplateParameters()->getDepth() >= DepthLimit)
53}
else if(
auto*BD = dyn_cast<BindingDecl>(ND)) {
54 Expr*
E= BD->getBinding();
55 if(
auto*RP = cast_if_present<ResolvedUnexpandedPackExpr>(
E)) {
63Unexpanded.push_back({ND,
Loc});
68 if(
T->getDepth() < DepthLimit)
69Unexpanded.push_back({
T,
Loc});
77 explicitCollectUnexpandedParameterPacksVisitor(
79: Unexpanded(Unexpanded) {
80ShouldWalkTypesOfTypeLocs =
false;
83ShouldVisitImplicitCode =
true;
103 if(
T->isParameterPack())
112 if(
E->getDecl()->isParameterPack())
113addUnexpanded(
E->getDecl(),
E->getLocation());
126 if(
auto*TTP = dyn_cast_or_null<TemplateTemplateParmDecl>(
128 if(TTP->isParameterPack())
133ContainsIntermediatePacks |=
146 for(
unsignedI = 0, N =
E->getNumElements(); I != N; ++I) {
148 if(Element.isPackExpansion())
163 Expr*
E= dyn_cast_or_null<Expr>(S);
221 boolTraverseCXXFoldExpr(
CXXFoldExpr*
E)
override{
return true; }
237 if(
D->isPackExpansion())
240 returnDynamicRecursiveASTVisitor::TraverseUnresolvedUsingValueDecl(
D);
244 boolTraverseUnresolvedUsingTypenameDecl(
246 if(
D->isPackExpansion())
249 returnDynamicRecursiveASTVisitor::TraverseUnresolvedUsingTypenameDecl(
D);
271 if(
Base.isPackExpansion())
279 if(
Init->isPackExpansion())
290 boolTraverseLambdaExpr(
LambdaExpr*Lambda)
override{
297 unsignedOldDepthLimit = DepthLimit;
300DepthLimit = TPL->getDepth();
302DynamicRecursiveASTVisitor::TraverseLambdaExpr(Lambda);
304DepthLimit = OldDepthLimit;
310 if(!
Block->containsUnexpandedParameterPack())
314DynamicRecursiveASTVisitor::TraverseBlockExpr(
Block);
321 if(
C->isPackExpansion())
329ContainsIntermediatePacks =
true;
333 boolTraverseSubstNonTypeTemplateParmPackExpr(
335ContainsIntermediatePacks =
true;
339 boolVisitSubstTemplateTypeParmPackType(
341ContainsIntermediatePacks =
true;
345 boolVisitSubstTemplateTypeParmPackTypeLoc(
347ContainsIntermediatePacks =
true;
351 boolcontainsIntermediatePacks()
const{
returnContainsIntermediatePacks; }
365 if(isa<sema::LambdaScopeInfo>(SI))
376 if(Unexpanded.empty())
386 for(
auto&Pack : Unexpanded) {
387 autoDeclaresThisPack = [&](
NamedDecl*LocalPack) {
389 auto*TTPD = dyn_cast<TemplateTypeParmDecl>(LocalPack);
390 returnTTPD && TTPD->getTypeForDecl() == TTPT;
394 if(llvm::any_of(CSI->LocalPacks, DeclaresThisPack))
395ParamPackReferences.push_back(Pack);
398 if(ParamPackReferences.empty()) {
410 boolEnclosingStmtExpr =
false;
414 Func->CompoundScopes,
416EnclosingStmtExpr =
true;
425 if(!EnclosingStmtExpr) {
426CSI->ContainsUnexpandedParameterPack =
true;
430Unexpanded = ParamPackReferences;
438 for(
unsignedI = 0, N = Unexpanded.size(); I != N; ++I) {
442Name = TTP->getIdentifier();
446 if(Name && NamesKnown.insert(Name).second)
447Names.push_back(Name);
449 if(Unexpanded[I].second.isValid())
450Locations.push_back(Unexpanded[I].second);
453 autoDB =
Diag(
Loc, diag::err_unexpanded_parameter_pack)
454<< (
int)UPPC << (
int)Names.size();
455 for(
size_tI = 0,
E= std::min(Names.size(), (
size_t)2); I !=
E; ++I)
458 for(
unsignedI = 0, N = Locations.size(); I != N; ++I)
473CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseTypeLoc(
475assert(!Unexpanded.empty() &&
"Unable to find unexpanded parameter packs");
488CollectUnexpandedParameterPacksVisitor Visitor(Unexpanded);
489Visitor.TraverseStmt(
E);
496 boolLambdaReferencingOuterPacks =
498assert((!Unexpanded.empty() || LambdaReferencingOuterPacks) &&
499 "Unable to find unexpanded parameter packs");
509CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseStmt(RE);
510assert(!Unexpanded.empty() &&
"Unable to find unexpanded parameter packs");
517 for(
autoParm : Unexpanded)
518 if(ParmSet.contains(Parm.first.dyn_cast<
NamedDecl*>()))
519UnexpandedParms.push_back(Parm);
520 if(UnexpandedParms.empty())
537CollectUnexpandedParameterPacksVisitor(Unexpanded)
539assert(!Unexpanded.empty() &&
"Unable to find unexpanded parameter packs");
574CollectUnexpandedParameterPacksVisitor(Unexpanded)
576assert(!Unexpanded.empty() &&
"Unable to find unexpanded parameter packs");
588CollectUnexpandedParameterPacksVisitor(Unexpanded)
589.TraverseTemplateName(Template);
590assert(!Unexpanded.empty() &&
"Unable to find unexpanded parameter packs");
601CollectUnexpandedParameterPacksVisitor(Unexpanded)
602.TraverseTemplateArgumentLoc(Arg);
603assert(!Unexpanded.empty() &&
"Unable to find unexpanded parameter packs");
609CollectUnexpandedParameterPacksVisitor(Unexpanded)
610.TraverseTemplateArgument(Arg);
615CollectUnexpandedParameterPacksVisitor(Unexpanded)
616.TraverseTemplateArgumentLoc(Arg);
621CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseType(
T);
626CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseTypeLoc(TL);
632CollectUnexpandedParameterPacksVisitor(Unexpanded)
633.TraverseNestedNameSpecifierLoc(NNS);
639CollectUnexpandedParameterPacksVisitor(Unexpanded)
640.TraverseDeclarationNameInfo(NameInfo);
645CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseStmt(
E);
678 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
685llvm_unreachable(
"Unhandled template argument kind?");
705std::optional<unsigned> NumExpansions) {
709EllipsisLoc, NumExpansions);
723std::optional<unsigned> NumExpansions) {
733 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
747std::optional<unsigned> NumExpansions) {
756 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
771 bool&RetainExpansion, std::optional<unsigned> &NumExpansions) {
772ShouldExpand =
true;
773RetainExpansion =
false;
774std::pair<IdentifierInfo *, SourceLocation> FirstPack;
775 boolHaveFirstPack =
false;
776std::optional<unsigned> NumPartialExpansions;
782 unsignedDepth = 0, Index = 0;
784 boolIsVarDeclPack =
false;
789Depth = TTP->getDepth();
790Index = TTP->getIndex();
791Name = TTP->getIdentifier();
792}
else if(
auto*RP =
796 NamedDecl*ND = cast<NamedDecl *>(ParmPack.first);
797 if(isa<VarDecl>(ND))
798IsVarDeclPack =
true;
799 else if(isa<BindingDecl>(ND)) {
801llvm::PointerUnion<Decl *, DeclArgumentPack *> *Instantiation =
803 Decl*B = cast<Decl *>(*Instantiation);
804 Expr*BindingExpr = cast<BindingDecl>(B)->getBinding();
805ResolvedPack = cast_if_present<ResolvedUnexpandedPackExpr>(BindingExpr);
807ShouldExpand =
false;
817 unsignedNewPackSize, PendingPackExpansionSize = 0;
820llvm::PointerUnion<Decl *, DeclArgumentPack *> *Instantiation =
822cast<NamedDecl *>(ParmPack.first));
823 if(isa<DeclArgumentPack *>(*Instantiation)) {
825NewPackSize = cast<DeclArgumentPack *>(*Instantiation)->size();
829ShouldExpand =
false;
832}
else if(ResolvedPack) {
840ShouldExpand =
false;
846TemplateArgs(Depth, Index).getPackAsArray();
847NewPackSize = Pack.size();
848PendingPackExpansionSize =
859 return!cast<PackExpansionExpr>(TA.
getAsExpr())
860->getNumExpansions();
873 unsignedPartialDepth, PartialIndex;
875 if(PartialDepth == Depth && PartialIndex == Index) {
876RetainExpansion =
true;
878NumPartialExpansions = NewPackSize;
879PartiallySubstitutedPackLoc = ParmPack.second;
885 if(!NumExpansions) {
888NumExpansions = NewPackSize;
889FirstPack.first = Name;
890FirstPack.second = ParmPack.second;
891HaveFirstPack =
true;
895 if(NewPackSize != *NumExpansions) {
917 unsignedLeastNewPackSize = NewPackSize - PendingPackExpansionSize;
918 if(PendingPackExpansionSize && LeastNewPackSize <= *NumExpansions) {
919ShouldExpand =
false;
926 Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict)
927<< FirstPack.first << Name << *NumExpansions
928<< (LeastNewPackSize != NewPackSize) << LeastNewPackSize
931 Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict_multilevel)
932<< Name << *NumExpansions << (LeastNewPackSize != NewPackSize)
933<< LeastNewPackSize <<
SourceRange(ParmPack.second);
947 if(NumPartialExpansions) {
948 if(NumExpansions && *NumExpansions < *NumPartialExpansions) {
951 Diag(EllipsisLoc, diag::err_pack_expansion_length_conflict_partial)
952<< PartialPack << *NumPartialExpansions << *NumExpansions
957NumExpansions = NumPartialExpansions;
966std::optional<unsigned>
Result;
967 for(
unsignedI = 0, N = Unexpanded.size(); I != N; ++I) {
974Depth = TTP->getDepth();
975Index = TTP->getIndex();
976}
else if(
auto*PE = Unexpanded[I]
978 unsignedSize = PE->getNumExprs();
979assert((!
Result|| *
Result== Size) &&
"inconsistent pack sizes");
983 NamedDecl*ND = cast<NamedDecl *>(Unexpanded[I].first);
984 if(isa<VarDecl>(ND)) {
988llvm::PointerUnion<Decl *, DeclArgumentPack *> *Instantiation =
990cast<NamedDecl *>(Unexpanded[I].first));
991 if(isa<Decl *>(*Instantiation))
996 unsignedSize = cast<DeclArgumentPack *>(*Instantiation)->size();
997assert((!
Result|| *
Result== Size) &&
"inconsistent pack sizes");
1008 returnstd::nullopt;
1011 unsignedSize = TemplateArgs(Depth, Index).pack_size();
1012assert((!
Result|| *
Result== Size) &&
"inconsistent pack sizes");
1021 QualTypePattern = cast<PackExpansionType>(
T)->getPattern();
1023CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseType(Pattern);
1034#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case TST_##Trait: 1035#include "clang/Basic/TransformTypeTraits.def" 1082#define GENERIC_IMAGE_TYPE(ImgType, Id) case TST_##ImgType##_t: 1083#include "clang/Basic/OpenCLImageTypes.def" 1084#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) case TST_##Name: 1085#include "clang/Basic/HLSLIntangibleTypes.def" 1091 for(
unsignedI = 0, N =
D.getNumTypeObjects(); I != N; ++I) {
1093 switch(Chunk.
Kind) {
1108 for(
unsignedi = 0, e = Chunk.
Fun.
NumParams; i != e; ++i) {
1111assert(!ParamTy.
isNull() &&
"Couldn't parse type?");
1141 if(
Expr*TRC =
D.getTrailingRequiresClause())
1142 if(TRC->containsUnexpandedParameterPack())
1153 boolValidateCandidate(
const TypoCorrection&candidate)
override{
1158std::unique_ptr<CorrectionCandidateCallback> clone()
override{
1159 returnstd::make_unique<ParameterPackValidatorCCC>(*
this);
1183ParameterPackValidatorCCC CCC{};
1188 PDiag(diag::err_sizeof_pack_no_pack_name_suggest) << &Name,
1189 PDiag(diag::note_parameter_pack_here));
1190ParameterPack = Corrected.getCorrectionDecl();
1204 Diag(NameLoc, diag::err_expected_name_of_pack) << &Name;
1210std::optional<unsigned> Length;
1212Length = RP->getNumExprs();
1219 if(
auto*
D= dyn_cast<DeclRefExpr>(PackExpression);
D) {
1235 Diag(PackExpression->
getBeginLoc(), diag::err_expected_name_of_pack)
1244? diag::warn_cxx23_pack_indexing
1245: diag::ext_pack_indexing);
1254 boolFullySubstituted) {
1256std::optional<int64_t> Index;
1264Index =
Value.getExtValue();
1265IndexExpr = Res.
get();
1268 if(Index && FullySubstituted) {
1269 if(*Index < 0 || *Index >= int64_t(ExpandedExprs.size())) {
1270 Diag(PackExpression->
getBeginLoc(), diag::err_pack_index_out_of_bound)
1271<< *Index << PackExpression << ExpandedExprs.size();
1277PackExpression, IndexExpr, Index,
1278ExpandedExprs, FullySubstituted);
1283std::optional<unsigned> &NumExpansions)
const{
1286 switch(Argument.
getKind()) {
1291 if(!ExpansionTSInfo)
1314= cast<PackExpansionExpr>(Argument.
getAsExpr());
1338llvm_unreachable(
"Invalid TemplateArgument Kind!");
1353Pack = Subst->getArgumentPack();
1355 returnstd::nullopt;
1360dyn_cast<SubstNonTypeTemplateParmPackExpr>(Arg.
getAsExpr()))
1361Pack = Subst->getArgumentPack();
1362 else if(
auto*Subst = dyn_cast<FunctionParmPackExpr>(Arg.
getAsExpr())) {
1364 if(PD->isParameterPack())
1365 returnstd::nullopt;
1366 returnSubst->getNumExpansions();
1368 returnstd::nullopt;
1374Pack = Subst->getArgumentPack();
1376 returnstd::nullopt;
1386 returnstd::nullopt;
1393 if(Elem.isPackExpansion())
1394 returnstd::nullopt;
1404 if(Elem.containsUnexpandedParameterPack())
1405 returnstd::nullopt;
1415 auto*OCE = dyn_cast<CXXOperatorCallExpr>(
E);
1416 if((OCE && OCE->isInfixBinaryOp()) || isa<BinaryOperator>(
E) ||
1417isa<AbstractConditionalOperator>(
E)) {
1434 autoDiscardOperands = [&] {
1447 return Diag(EllipsisLoc,
1449? diag::err_fold_expression_packs_both_sides
1450: diag::err_pack_expansion_without_parameter_packs)
1458 Expr*Pack = LHS ? LHS : RHS;
1459assert(Pack &&
"fold expression with neither LHS nor RHS");
1462 return Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
1474 if(!Functions.
empty()) {
1480 if(Callee.isInvalid())
1482ULE = cast<UnresolvedLookupExpr>(Callee.get());
1486 return BuildCXXFoldExpr(ULE, LParenLoc, LHS, Opc, EllipsisLoc, RHS, RParenLoc,
1495std::optional<unsigned> NumExpansions) {
1498EllipsisLoc, RHS, RParenLoc, NumExpansions);
1523 return Diag(EllipsisLoc, diag::err_fold_expression_empty)
static void CheckFoldOperand(Sema &S, Expr *E)
static bool isParameterPack(Expr *PackExpression)
Defines the clang::TypeLoc interface and its subclasses.
unsigned getIntWidth(QualType T) const
DeclarationNameTable DeclarationNames
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
QualType getPackExpansionType(QualType Pattern, std::optional< unsigned > NumExpansions, bool ExpectPackInType=true) const
Form a pack expansion type with the given pattern.
The result of parsing/analyzing an expression, statement etc.
Attr - This represents one attribute.
bool isPackExpansion() const
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given binary opcode.
StringRef getOpcodeStr() const
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Represents a base class of a C++ class.
Represents a C++ base or member initializer.
Represents a folding of a pack over an operator.
An expression "T()" which creates an rvalue of a non-class type T.
Represents a C++ nested-name-specifier or a global scope specifier.
bool isValid() const
A scope specifier is present, and it refers to a real scope.
SourceRange getRange() const
SourceLocation getBeginLoc() const
NestedNameSpecifier * getScopeRep() const
Retrieve the representation of the nested-name-specifier.
const TypeClass * getTypePtr() const
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
A reference to a declared variable, function, enum, etc.
Captures information about "declaration specifiers".
TST getTypeSpecType() const
ParsedType getRepAsType() const
Expr * getRepAsExpr() const
Decl - This represents one declaration (or definition), e.g.
bool isParameterPack() const
Whether this declaration is a parameter pack.
The name of a declaration.
@ CXXConversionFunctionName
QualType getCXXNameType() const
If this name is one of the C++ names (of a constructor, destructor, or conversion function),...
NameKind getNameKind() const
Determine what kind of name this is.
Information about one declarator, including the parsed type information and the identifier.
Recursive AST visitor that supports extension via dynamic dispatch.
virtual bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc)
Recursively visit a template argument location and dispatch to the appropriate method for the argumen...
virtual bool TraverseConstructorInitializer(MaybeConst< CXXCtorInitializer > *Init)
Recursively visit a constructor initializer.
virtual bool TraverseDecl(MaybeConst< Decl > *D)
Recursively visit a declaration, by dispatching to Traverse*Decl() based on the argument's dynamic ty...
virtual bool TraverseCXXBaseSpecifier(const CXXBaseSpecifier &Base)
Recursively visit a base specifier.
virtual bool TraverseStmt(MaybeConst< Stmt > *S)
Recursively visit a statement or expression, by dispatching to Traverse*() based on the argument's dy...
virtual bool TraverseAttr(MaybeConst< Attr > *At)
Recursively visit an attribute, by dispatching to Traverse*Attr() based on the argument's dynamic typ...
virtual bool TraverseTypeLoc(TypeLoc TL)
Recursively visit a type with location, by dispatching to Traverse*TypeLoc() based on the argument ty...
virtual bool TraverseType(QualType T)
Recursively visit a type, by dispatching to Traverse*Type() based on the argument's getTypeClass() pr...
virtual bool TraverseTemplateName(TemplateName Template)
Recursively visit a template name and dispatch to the appropriate method.
virtual bool TraverseLambdaCapture(MaybeConst< LambdaExpr > *LE, const LambdaCapture *C, MaybeConst< Expr > *Init)
Recursively visit a lambda capture.
virtual bool TraverseTemplateArgument(const TemplateArgument &Arg)
Recursively visit a template argument and dispatch to the appropriate method for the argument type.
This represents one expression.
bool containsUnexpandedParameterPack() const
Whether this expression contains an unexpanded parameter pack (for C++11 variadic templates).
bool containsErrors() const
Whether this expression contains subexpressions which had errors, e.g.
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Represents a reference to a function parameter pack or init-capture pack that has been substituted bu...
One of these records is kept for each identifier that is lexed.
const TypeClass * getTypePtr() const
Describes the capture of a variable or of this, or of a C++1y init-capture.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
TemplateParameterList * getTemplateParameterList() const
If this is a generic lambda expression, retrieve the template parameter list associated with it,...
NamedDecl * getPartiallySubstitutedPack(const TemplateArgument **ExplicitArgs=nullptr, unsigned *NumExplicitArgs=nullptr) const
Retrieve the partially-substitued template parameter pack.
llvm::PointerUnion< Decl *, DeclArgumentPack * > * findInstantiationOf(const Decl *D)
Find the instantiation of the declaration D within the current instantiation scope.
Represents the results of name lookup.
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
@ NotFound
No entity found met the criteria.
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
@ Found
Name lookup found a single declaration that met the criteria.
NamedDecl * getFoundDecl() const
Fetch the unique decl found by this lookup.
Sema::LookupNameKind getLookupKind() const
Gets the kind of lookup to perform.
LookupResultKind getResultKind() const
const DeclarationNameInfo & getLookupNameInfo() const
Gets the name info to look up.
Data structure that captures multiple levels of template argument lists for use in template instantia...
bool hasTemplateArgument(unsigned Depth, unsigned Index) const
Determine whether there is a non-NULL template argument at the given depth and index.
unsigned getNumLevels() const
Determine the number of levels in this template argument list.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
A C++ nested-name-specifier augmented with source location information.
bool containsUnexpandedParameterPack() const
Whether this nested-name-specifier contains an unexpanded parameter pack (for C++11 variadic template...
ObjCDictionaryLiteral - AST node to represent objective-c dictionary literals; as in:"name" : NSUserN...
Represents a C++11 pack expansion that produces a sequence of expressions.
Expr * getPattern()
Retrieve the pattern of the pack expansion.
std::optional< unsigned > getNumExpansions() const
Determine the number of expansions that will be produced when this pack expansion is instantiated,...
SourceLocation getEllipsisLoc() const
Retrieve the location of the ellipsis that describes this pack expansion.
void setEllipsisLoc(SourceLocation Loc)
SourceLocation getEllipsisLoc() const
TypeLoc getPatternLoc() const
Represents a pack expansion of types.
std::optional< unsigned > getNumExpansions() const
Retrieve the number of expansions that this pack expansion will generate, if known.
static PackIndexingExpr * Create(ASTContext &Context, SourceLocation EllipsisLoc, SourceLocation RSquareLoc, Expr *PackIdExpr, Expr *IndexExpr, std::optional< int64_t > Index, ArrayRef< Expr * > SubstitutedExprs={}, bool FullySubstituted=false)
Expr * getIndexExpr() const
Represents a parameter to a function.
Represents the parsed form of a C++ template argument.
KindType getKind() const
Determine what kind of template argument we have.
SourceLocation getLocation() const
Retrieve the location of the template argument.
ParsedTemplateTy getAsTemplate() const
Retrieve the template template argument's template name.
ParsedTemplateArgument getTemplatePackExpansion(SourceLocation EllipsisLoc) const
Retrieve a pack expansion of the given template template argument.
ParsedType getAsType() const
Retrieve the template type argument's type.
@ Type
A template type parameter, stored as a type.
@ Template
A template template argument, stored as a template name.
@ NonType
A non-type template parameter, stored as an expression.
bool isInvalid() const
Determine whether the given template argument is invalid.
Expr * getAsExpr() const
Retrieve the non-type template argument's expression.
const CXXScopeSpec & getScopeSpec() const
Retrieve the nested-name-specifier that precedes the template name in a template template argument.
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
SourceLocation getBeginLoc() const LLVM_READONLY
ArrayRef< ParmVarDecl * > getLocalParameters() const
static ResolvedUnexpandedPackExpr * getFromDecl(Decl *)
unsigned getNumExprs() const
Scope - A scope is a transient data structure that is used while parsing the program.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
Sema - This implements semantic analysis and AST building for C.
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
sema::CapturingScopeInfo * getEnclosingLambdaOrBlock() const
Get the innermost lambda or block enclosing the current location, if any.
bool containsUnexpandedParameterPacks(Declarator &D)
Determine whether the given declarator contains any unexpanded parameter packs.
bool CheckParameterPacksForExpansion(SourceLocation EllipsisLoc, SourceRange PatternRange, ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs, bool &ShouldExpand, bool &RetainExpansion, std::optional< unsigned > &NumExpansions)
Determine whether we could expand a pack expansion with the given set of parameter packs into separat...
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
TypeSourceInfo * CheckPackExpansion(TypeSourceInfo *Pattern, SourceLocation EllipsisLoc, std::optional< unsigned > NumExpansions)
Construct a pack expansion type from the pattern of the pack expansion.
ExprResult BuildPackIndexingExpr(Expr *PackExpression, SourceLocation EllipsisLoc, Expr *IndexExpr, SourceLocation RSquareLoc, ArrayRef< Expr * > ExpandedExprs={}, bool FullySubstituted=false)
ASTContext & getASTContext() const
bool DiagnoseUnexpandedParameterPackInRequiresExpr(RequiresExpr *RE)
If the given requirees-expression contains an unexpanded reference to one of its own parameter packs,...
void LookupBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, UnresolvedSetImpl &Functions)
TemplateArgumentLoc getTemplateArgumentPackExpansionPattern(TemplateArgumentLoc OrigLoc, SourceLocation &Ellipsis, std::optional< unsigned > &NumExpansions) const
Returns the pattern of the pack expansion for a template argument.
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)
std::optional< unsigned > getNumArgumentsInExpansionFromUnexpanded(llvm::ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs)
UnexpandedParameterPackContext
The context in which an unexpanded parameter pack is being diagnosed.
const LangOptions & getLangOpts() const
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr, bool RecordFailure=true)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
bool isUnexpandedParameterPackPermitted()
Determine whether an unexpanded parameter pack might be permitted in this location.
ExprResult BuildCXXFoldExpr(UnresolvedLookupExpr *Callee, SourceLocation LParenLoc, Expr *LHS, BinaryOperatorKind Operator, SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc, std::optional< unsigned > NumExpansions)
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
ExprResult ActOnCXXBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind)
ActOnCXXBoolLiteral - Parse {true,false} literals.
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
std::optional< unsigned > getNumArgumentsInExpansion(QualType T, const MultiLevelTemplateArgumentList &TemplateArgs)
Determine the number of arguments in the given pack expansion type.
std::optional< unsigned > getFullyPackExpandedSize(TemplateArgument Arg)
Given a template argument that contains an unexpanded parameter pack, but which has already been subs...
ExprResult ActOnPackIndexingExpr(Scope *S, Expr *PackExpression, SourceLocation EllipsisLoc, SourceLocation LSquareLoc, Expr *IndexExpr, SourceLocation RSquareLoc)
ExprResult CreateUnresolvedLookupExpr(CXXRecordDecl *NamingClass, NestedNameSpecifierLoc NNSLoc, DeclarationNameInfo DNI, const UnresolvedSetImpl &Fns, bool PerformADL=true)
ParsedTemplateArgument ActOnPackExpansion(const ParsedTemplateArgument &Arg, SourceLocation EllipsisLoc)
Invoked when parsing a template argument followed by an ellipsis, which creates a pack expansion.
@ CCEK_ArrayBound
Array bound in array declarator or new-expression.
void diagnoseTypo(const TypoCorrection &Correction, const PartialDiagnostic &TypoDiag, bool ErrorRecovery=true)
void DiagnoseAmbiguousLookup(LookupResult &Result)
Produce a diagnostic describing the ambiguity that resulted from name lookup.
ExprResult ActOnSizeofParameterPackExpr(Scope *S, SourceLocation OpLoc, IdentifierInfo &Name, SourceLocation NameLoc, SourceLocation RParenLoc)
Called when an expression computing the size of a parameter pack is parsed.
ExprResult BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, BinaryOperatorKind Operator)
ExprResult ActOnCXXFoldExpr(Scope *S, SourceLocation LParenLoc, Expr *LHS, tok::TokenKind Operator, SourceLocation EllipsisLoc, Expr *RHS, SourceLocation RParenLoc)
Handle a C++1z fold-expression: ( expr op ... op expr ).
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
bool DiagnoseUnexpandedParameterPacks(SourceLocation Loc, UnexpandedParameterPackContext UPPC, ArrayRef< UnexpandedParameterPack > Unexpanded)
Diagnose unexpanded parameter packs.
ExprResult CorrectDelayedTyposInExpr(Expr *E, VarDecl *InitDecl=nullptr, bool RecoverUncorrectedTypos=false, llvm::function_ref< ExprResult(Expr *)> Filter=[](Expr *E) -> ExprResult { return E;})
Process any TypoExprs in the given Expr and its children, generating diagnostics as appropriate and r...
static SizeOfPackExpr * Create(ASTContext &Context, SourceLocation OperatorLoc, NamedDecl *Pack, SourceLocation PackLoc, SourceLocation RParenLoc, std::optional< unsigned > Length=std::nullopt, ArrayRef< TemplateArgument > PartialArgs={})
Encodes a location in the source.
A trivial tuple used to represent a source range.
void setBegin(SourceLocation b)
SourceLocation getBegin() const
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
Represents a reference to a non-type template parameter pack that has been substituted with a non-tem...
A structure for storing an already-substituted template template parameter pack.
Wrapper for substituted template type parameters.
Represents the result of substituting a set of types for a template type parameter pack.
Location wrapper for a TemplateArgument.
SourceLocation getLocation() const
SourceLocation getTemplateEllipsisLoc() const
const TemplateArgument & getArgument() const
SourceLocation getTemplateNameLoc() const
TypeSourceInfo * getTypeSourceInfo() const
NestedNameSpecifierLoc getTemplateQualifierLoc() const
Represents a template argument.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
std::optional< unsigned > getNumTemplateExpansions() const
Retrieve the number of expansions that a template template argument expansion will produce,...
QualType getAsType() const
Retrieve the type for a type template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
bool containsUnexpandedParameterPack() const
Whether this template argument contains an unexpanded parameter pack.
TemplateArgument getPackExpansionPattern() const
When the template argument is a pack expansion, returns the pattern of the pack expansion.
bool isNull() const
Determine whether this template argument has no value.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
bool isPackExpansion() const
Determine whether this template argument is a pack expansion.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
bool isNull() const
Determine whether this template name is NULL.
bool containsUnexpandedParameterPack() const
Determines whether this template name contains an unexpanded parameter pack (for C++0x variadic templ...
SubstTemplateTemplateParmPackStorage * getAsSubstTemplateTemplateParmPack() const
Retrieve the substituted template template parameter pack, if known.
Wrapper for template type parameters.
bool isParameterPack() const
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
void pushFullCopy(TypeLoc L)
Pushes a copy of the given TypeLoc onto this builder.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
Base wrapper for a particular "section" of type source info.
QualType getType() const
Get the type for which this source info wrapper provides information.
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
SourceLocation getNameLoc() const
The base class of the type hierarchy.
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
const T * getAs() const
Member-template getAs<specific type>'.
Simple class containing the result of Sema::CorrectTypo.
NamedDecl * getCorrectionDecl() const
Gets the pointer to the declaration of the typo correction.
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
A set of unresolved declarations.
Represents a dependent using declaration which was marked with typename.
Represents a dependent using declaration which was not marked with typename.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
bool isParameterPack() const
Determine whether this value is actually a function parameter pack, init-capture pack,...
Represents a variable declaration or definition.
Contains information about the compound statement currently being parsed.
Retains information about a function, method, or block that is currently being parsed.
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
The JSON file list parser is used to communicate input to InstallAPI.
@ TST_typename_pack_indexing
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl *, ResolvedUnexpandedPackExpr * >, SourceLocation > UnexpandedParameterPack
@ Result
The result type of a method or function.
std::pair< unsigned, unsigned > getDepthAndIndex(const NamedDecl *ND)
Retrieve the depth and index of a template parameter.
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
const FunctionProtoType * T
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
@ EST_Dynamic
throw(T1, T2)
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
TypeSourceInfo * getNamedTypeInfo() const
getNamedTypeInfo - Returns the source type info associated to the name.
Expr * NumElts
This is the size of the array, or null if [] or [*] was specified.
bool hasTrailingReturnType() const
Determine whether this function declarator had a trailing-return-type.
TypeAndRange * Exceptions
Pointer to a new[]'d array of TypeAndRange objects that contain the types in the function's dynamic e...
ParamInfo * Params
Params - This is a pointer to a new[]'d array of ParamInfo objects that describe the parameters speci...
ParsedType getTrailingReturnType() const
Get the trailing-return-type for this function declarator.
unsigned NumParams
NumParams - This is the number of formal parameters specified by the declarator.
unsigned getNumExceptions() const
Get the number of dynamic exception specifications.
ExceptionSpecificationType getExceptionSpecType() const
Get the type of exception specification this function has.
Expr * NoexceptExpr
Pointer to the expression in the noexcept-specifier of this function, if it has one.
One instance of this struct is used for each type in a declarator that is parsed.
enum clang::DeclaratorChunk::@223 Kind
MemberPointerTypeInfo Mem
An element in an Objective-C dictionary literal.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4