30#include "llvm/ADT/STLExtras.h"
77 unsigned CurScopeIndex = FunctionScopes.size() - 1;
79 FunctionScopes[CurScopeIndex]))
83 "The function on the top of sema's function-info stack must be a lambda");
86 const bool IsCapturingThis = !VarToCapture;
87 const bool IsCapturingVariable = !IsCapturingThis;
106 return NoLambdaIsCaptureReady;
125 if (IsCapturingVariable && !LSI->
isCaptured(VarToCapture))
126 return NoLambdaIsCaptureReady;
128 return NoLambdaIsCaptureReady;
133 assert(CurScopeIndex);
139 assert(CurScopeIndex < (FunctionScopes.size() - 1));
143 return CurScopeIndex + 1;
144 return NoLambdaIsCaptureReady;
191 if (!OptionalStackIndex)
192 return NoLambdaIsCaptureCapable;
194 const unsigned IndexOfCaptureReadyLambda = *OptionalStackIndex;
199 const bool IsCapturingThis = !VarToCapture;
200 const bool IsCapturingVariable = !IsCapturingThis;
202 if (IsCapturingVariable) {
211 false, CaptureType, DeclRefType,
212 &IndexOfCaptureReadyLambda);
213 if (!CanCaptureVariable)
214 return NoLambdaIsCaptureCapable;
219 const bool CanCaptureThis =
223 &IndexOfCaptureReadyLambda);
225 return NoLambdaIsCaptureCapable;
227 return IndexOfCaptureReadyLambda;
246 unsigned LambdaDependencyKind,
250 bool IsGenericLambda =
255 IsGenericLambda, CaptureDefault);
261std::tuple<MangleNumberingContext *, Decl *>
273 ExternallyVisibleVariableInModulePurview,
277 bool IsInNonspecializedTemplate =
290 static constexpr auto IsExternallyVisibleInModulePurview =
292 return (ND->isInNamedModule() || ND->isFromGlobalModule()) &&
293 ND->isExternallyVisible();
300 if (!ManglingContextDecl)
303 if (
ParmVarDecl *Param = dyn_cast<ParmVarDecl>(ManglingContextDecl)) {
306 if (LexicalDC->isRecord())
308 }
else if (
VarDecl *Var = dyn_cast<VarDecl>(ManglingContextDecl)) {
309 if (Var->getMostRecentDecl()->isInline())
310 return InlineVariable;
312 if (IsExternallyVisibleInModulePurview(Var))
313 return ExternallyVisibleVariableInModulePurview;
315 if (Var->getDeclContext()->isRecord() && IsInNonspecializedTemplate)
316 return TemplatedVariable;
318 if (Var->getDescribedVarTemplate())
319 return TemplatedVariable;
321 if (
auto *VTS = dyn_cast<VarTemplateSpecializationDecl>(Var)) {
322 if (!VTS->isExplicitSpecialization())
323 return TemplatedVariable;
328 ManglingContextDecl)) {
339 static constexpr auto IsInFunctionThatRequiresMangling =
342 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(DC))
343 if (FD->isInlined() || IsExternallyVisibleInModulePurview(FD))
361 if ((IsInNonspecializedTemplate &&
363 IsInFunctionThatRequiresMangling(
CurContext)) {
364 while (
auto *CD = dyn_cast<CapturedDecl>(DC))
366 return std::make_tuple(&
Context.getManglingNumberContext(DC),
nullptr);
369 return std::make_tuple(
nullptr,
nullptr);
382 case ExternallyVisibleVariableInModulePurview:
383 case TemplatedVariable:
388 return std::make_tuple(
390 ManglingContextDecl),
391 ManglingContextDecl);
394 llvm_unreachable(
"unexpected context");
401 assert(MethodTypeInfo &&
"expected a non null type");
407 if (Class->isDependentContext() || TemplateParams) {
410 if (
Result->isUndeducedType()) {
431 if (
Method->getType()->isDependentType())
437 QualType ExplicitObjectParameterType = Param->getType()
438 .getNonReferenceType()
439 .getUnqualifiedType()
442 if (LambdaType == ExplicitObjectParameterType)
459 auto [It, Inserted] =
Context.LambdaCastPaths.try_emplace(
Method);
461 return It->second.empty();
468 Diag(Param->getLocation(), diag::err_invalid_explicit_object_type_in_lambda)
469 << ExplicitObjectParameterType;
475 Diag(CallLoc, diag::err_explicit_object_lambda_ambiguous_base)
476 << LambdaType << PathsDisplay;
482 diag::err_explicit_object_lambda_inaccessible_base))
491 std::optional<CXXRecordDecl::LambdaNumbering> NumberingOverride) {
494 auto getMangleNumberingContext =
498 if (ManglingContextDecl)
499 return &
Context.getManglingNumberContext(
502 auto DC =
Class->getDeclContext();
503 while (
auto *CD = dyn_cast<CapturedDecl>(DC))
504 DC = CD->getParent();
505 return &
Context.getManglingNumberContext(DC);
510 std::tie(MCtx, ContextDecl) =
518 Class->setLambdaContextDecl(ContextDecl);
530 MCtx = getMangleNumberingContext(
Class, ContextDecl);
531 assert(MCtx &&
"Retrieving mangle numbering context failed!");
540 if (NumberingOverride) {
541 Numbering = *NumberingOverride;
548 Class->setLambdaNumbering(Numbering);
560 auto *&Slot =
Context.getLambdaDeclarationSlotForMerging(
574 bool ExplicitResultType) {
575 if (ExplicitResultType) {
580 diag::err_lambda_incomplete_result);
590 bool ExplicitParams,
bool Mutable) {
593 LSI->
Lambda = LambdaClass;
613 assert(LSI &&
"Expected a lambda scope");
615 "Already acted on explicit template parameters");
617 "Explicit template parameters should come "
618 "before invented (auto) ones");
619 assert(!TParams.empty() &&
620 "No template parameters to act on");
642 = dyn_cast<EnumConstantDecl>(DRE->getDecl())) {
651 if (BO->getOpcode() == BO_Comma)
658 if (
StmtExpr *SE = dyn_cast<StmtExpr>(E)) {
659 if (
Expr *last = dyn_cast_or_null<Expr>(SE->getSubStmt()->body_back()))
680 if (ICE->getCastKind() == CK_IntegralCast)
710 if (!ED)
return nullptr;
713 for (++i; i != e; ++i) {
729 i = returns.begin(), e = returns.end(); i != e; ++i) {
758 "lambda expressions use auto deduction in C++14 onwards");
795 assert(!CSI.
ReturnType.
isNull() &&
"We should have a tentative return type.");
825 if (
Context.getCanonicalFunctionResultType(ReturnType) ==
830 if (BlockNullability &&
831 (!RetTyNullability ||
840 diag::err_typecheck_missing_return_type_incompatible)
858 assert(!DeductType.
isNull() &&
"can't build reference to auto");
862 if (
Init->containsUnexpandedParameterPack()) {
864 ? diag::warn_cxx17_compat_init_capture_pack
865 : diag::ext_init_capture_pack);
866 DeductType =
Context.getPackExpansionType(DeductType, NumExpansions,
893 Loc,
Init->getBeginLoc(),
Init->getEndLoc())
919 PETL.setEllipsisLoc(EllipsisLoc);
926 InitCaptureType, TSI,
SC_Auto);
939 assert(Var->
isInitCapture() &&
"init capture flag should be set");
982 bool &ExplicitResultType) {
984 ExplicitResultType =
false;
990 "Unexpected storage specifier");
991 bool IsLambdaStatic =
1004 bool HasExplicitObjectParameter =
1009 !HasExplicitObjectParameter)
1020 diag::err_return_value_with_address_space);
1025 assert(MethodTyInfo &&
"no type from lambda-declarator");
1032 return MethodTyInfo;
1045 Context.DeclarationNames.getCXXOperatorName(OO_Call);
1063 assert(TemplateParams &&
"no template parameters");
1066 TemplateParams, CallOperator);
1077 bool HasExplicitResultType) {
1081 if (TrailingRequiresClause)
1082 Method->setTrailingRequiresClause(TrailingRequiresClause);
1091 if (TemplateParams) {
1093 Method->getDescribedFunctionTemplate();
1094 assert(TemplateMethod &&
1095 "AddTemplateParametersToLambdaCallOperator should have been called");
1105 Method->setLexicalDeclContext(DC);
1106 Method->setLocation(LambdaLoc);
1107 Method->setInnerLocStart(CallOperatorLoc);
1108 Method->setTypeSourceInfo(MethodTyInfo);
1110 TemplateParams, MethodTyInfo));
1111 Method->setConstexprKind(ConstexprKind);
1112 Method->setStorageClass(SC);
1113 if (!Params.empty()) {
1115 Method->setParams(Params);
1116 for (
auto P :
Method->parameters()) {
1117 assert(P &&
"null in a parameter list");
1118 P->setOwningFunction(
Method);
1126 Scope *CurrentScope) {
1129 assert(LSI &&
"LambdaScopeInfo should be on stack!");
1145 if (CurScope->getTemplateParamParent() !=
nullptr) {
1158 Scope *LookupScope = ParentScope;
1163 if (LookupScope != ParentScope &&
1165 llvm::any_of(LookupScope->
decls(), [](
Decl *D) {
1166 return isa<ParmVarDecl>(D) &&
1167 cast<ParmVarDecl>(D)->getType()->isTemplateTypeParmType();
1173 Intro.
Range,
nullptr, LambdaDependencyKind, Intro.
Default);
1184 bool ContainsUnexpandedParameterPack =
false;
1187 llvm::DenseMap<IdentifierInfo *, ValueDecl *> CaptureNames;
1193 PrevCaptureLoc =
C->Loc, ++
C) {
1197 ? diag::ext_star_this_lambda_capture_cxx17
1198 : diag::warn_cxx14_compat_star_this_lambda_capture);
1204 Diag(
C->Loc, diag::err_capture_more_than_once)
1218 ? diag::ext_equals_this_lambda_capture_cxx20
1219 : diag::warn_cxx17_compat_equals_this_lambda_capture);
1225 if (ThisCaptureType.
isNull()) {
1226 Diag(
C->Loc, diag::err_this_capture) <<
true;
1238 assert(
C->Id &&
"missing identifier for capture");
1240 if (
C->Init.isInvalid())
1244 if (
C->Init.isUsable()) {
1246 ? diag::warn_cxx11_compat_init_capture
1247 : diag::ext_init_capture);
1254 if (
C->InitCaptureType.get().isNull())
1257 if (
C->Init.get()->containsUnexpandedParameterPack() &&
1258 !
C->InitCaptureType.get()->getAs<PackExpansionType>())
1262 switch (
C->InitKind) {
1264 llvm_unreachable(
"not an init-capture?");
1276 C->EllipsisLoc,
C->Id, InitStyle,
1278 assert(Var &&
"createLambdaInitCaptureVarDecl returned a null VarDecl?");
1279 if (
auto *
V = dyn_cast<VarDecl>(Var))
1284 "init capture has valid but null init?");
1292 Diag(
C->Loc, diag::err_reference_capture_with_reference_default)
1297 Diag(
C->Loc, diag::err_copy_capture_with_copy_default)
1309 if (R.isAmbiguous())
1322 Diag(
C->Loc, diag::err_capture_class_member_does_not_name_variable)
1326 Var = R.getAsSingle<
VarDecl>();
1336 Diag(
C->Loc, diag::err_capture_does_not_name_variable) <<
C->Id;
1343 if (
auto [It, Inserted] = CaptureNames.insert(std::pair{C->Id, Var});
1347 Diag(
C->Loc, diag::err_capture_more_than_once)
1348 <<
C->Id << It->second->getBeginLoc()
1357 Diag(
C->Loc, diag::err_capture_more_than_once) <<
C->Id;
1369 Diag(
C->Loc, diag::err_capture_non_automatic_variable) <<
C->Id;
1377 if (
C->EllipsisLoc.isValid()) {
1379 EllipsisLoc =
C->EllipsisLoc;
1381 Diag(
C->EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
1382 << (
C->Init.isUsable() ?
C->Init.get()->getSourceRange()
1388 ContainsUnexpandedParameterPack =
true;
1391 if (
C->Init.isUsable()) {
1443 if (Param->getIdentifier())
1453 if (TemplateParams) {
1472 bool ExplicitResultType;
1496 Params.reserve(Params.size());
1497 for (
unsigned I = 0; I < FTI.NumParams; ++I) {
1499 Param->setScopeInfo(0, Params.size());
1500 Params.push_back(Param);
1505 bool IsLambdaStatic =
1528 if (
Context.getTargetInfo().getTriple().isAArch64())
1542 if (!
C.isVariableCapture())
1550 auto CheckRedefinition = [&](
ParmVarDecl *Param) {
1552 if (
Capture.Id == Param->getIdentifier()) {
1553 Diag(Param->getLocation(), diag::err_parameter_shadow_capture);
1554 Diag(
Capture.Loc, diag::note_var_explicitly_captured_here)
1563 if (!P->getIdentifier())
1565 if (CheckRedefinition(P))
1577 if (TemplateParams) {
1578 for (
const auto *TP : TemplateParams->
asArray()) {
1579 if (!TP->getIdentifier())
1582 if (
Capture.Id == TP->getIdentifier()) {
1616 if (!
Method->getDescribedFunctionTemplate() && !
Method->isTemplated()) {
1617 Diag(TRC.ConstraintExpr->getBeginLoc(),
1618 diag::err_constrained_non_templated_function);
1629 bool IsInstantiation) {
1637 if (!IsInstantiation)
1642 Class->setInvalidDecl();
1651template <
typename Func>
1675 DefaultFree, DefaultMember, CallOpCC};
1677 llvm::iterator_range<CallingConv *> Range(std::begin(Convs),
1678 llvm::unique(Convs));
1688 if (CallOpCC == DefaultMember && DefaultMember != DefaultFree) {
1710 if (CallOpCC == DefaultMember && DefaultMember != DefaultFree)
1723 "Lambda's call operator should not have a reference qualifier");
1736 auto HasPassObjectSizeAttr = [](
const ParmVarDecl *P) {
1737 return P->hasAttr<PassObjectSizeAttr>();
1739 if (llvm::any_of(CallOperator->
parameters(), HasPassObjectSizeAttr))
1808 for (
unsigned I = 0, N = CallOperator->
getNumParams(); I != N; ++I) {
1818 CallOpConvTL.setParam(I, From);
1819 CallOpConvNameTL.setParam(I, From);
1839 if (Class->isGenericLambda()) {
1846 Loc, ConversionName,
1852 Class->addDecl(ConversionTemplate);
1854 Class->addDecl(Conversion);
1880 for (
unsigned I = 0, N = CallOperator->
getNumParams(); I != N; ++I)
1881 InvokerParams[I]->setOwningFunction(Invoke);
1885 if (Class->isGenericLambda()) {
1890 S.
Context, Class, Loc, InvokerName,
1895 Class->addDecl(StaticInvokerTemplate);
1897 Class->addDecl(Invoke);
1952 Class->addDecl(Conversion);
1957 bool IsOpenMPMapping) {
2004 if (IsOpenMPMapping)
2007 if (
Init.isInvalid())
2016 return InitSeq.
Perform(*
this, Entity, InitKind, InitExpr);
2042 llvm_unreachable(
"block capture in lambda");
2044 llvm_unreachable(
"Unknown implicit capture style");
2061 if (
T.isVolatileQualified())
2064 const Type *BaseT =
T->getBaseElementTypeUnsafe();
2066 return !RD->isCompleteDefinition() || !RD->hasTrivialCopyConstructor() ||
2067 !RD->hasTrivialDestructor();
2098 diag << CaptureRange;
2112 if (Var && Var->isInitCapture())
2113 TSI = Var->getTypeSourceInfo();
2119 TSI =
Context.getTrivialTypeSourceInfo(FieldType, Loc);
2124 nullptr, FieldType, TSI,
nullptr,
2130 diag::err_field_incomplete_or_sizeless)) {
2132 Field->setInvalidDecl();
2138 Field->setInvalidDecl();
2142 Field->setImplicit(
true);
2155 bool CurHasPreviousCapture,
bool IsLast) {
2161 StartPoint,
false,
true);
2168 if (!CurHasPreviousCapture && !IsLast) {
2201 bool IsGenericLambda =
Class->isGenericLambda();
2204 Decl *TemplateOrNonTemplateCallOperatorDecl =
2216 ContextRAII SavedContext(*
this, CallOperator,
false);
2227 bool CurHasPreviousCapture = CaptureDefault !=
LCD_None;
2229 CurHasPreviousCapture ? CaptureDefaultLoc : IntroducerRange.
getBegin();
2231 for (
unsigned I = 0, N = LSI->
Captures.size(); I != N; ++I) {
2237 assert(!From.
isBlockCapture() &&
"Cannot capture __block variables");
2246 bool IsCaptureUsed =
true;
2250 bool NonODRUsedInitCapture =
2252 if (!NonODRUsedInitCapture) {
2255 *
this, CaptureRange, PrevCaptureLoc, CurHasPreviousCapture, IsLast);
2262 CurHasPreviousCapture |= IsCaptureUsed;
2263 PrevCaptureLoc = CaptureRange.
getEnd();
2275 Diag(CaptureDefaultLoc, diag::note_deprecated_this_capture)
2302 CaptureInits.push_back(
Init.get());
2315 if (Captures.empty() && CaptureDefault ==
LCD_None)
2333 Cleanup.mergeFrom(LambdaCleanup);
2337 CaptureDefaultLoc, ExplicitParams, ExplicitResultType,
2338 CaptureInits, EndLoc, ContainsUnexpandedParameterPack);
2346 !
Class->isDependentContext()) {
2402 Context.DeclarationNames.getCXXOperatorName(OO_Call)).
front());
2408 CurrentLocation, Src);
2409 if (!
Init.isInvalid())
2412 if (
Init.isInvalid())
2421 Block->setBlockMissingReturnType(
false);
2425 for (
unsigned I = 0, N = CallOperator->
getNumParams(); I != N; ++I) {
2433 Block->setParams(BlockParams);
2435 Block->setIsConversionFromLambda(
true);
2443 ConvLocation,
nullptr,
2460 Cleanup.setExprNeedsCleanups(
true);
2485bool Sema::addInstantiatedCapturesToScope(
2492 unsigned Instantiated = 0;
2502 LambdaScopeInfo *InstantiatingScope =
nullptr;
2503 if (LambdaPattern->capture_size() && !LambdaClass->capture_size()) {
2505 auto *LSI = dyn_cast<LambdaScopeInfo>(Scope);
2508 InstantiatingScope = LSI;
2511 assert(InstantiatingScope);
2514 auto AddSingleCapture = [&](
const ValueDecl *CapturedPattern,
2516 ValueDecl *CapturedVar =
2517 InstantiatingScope ? InstantiatingScope->
Captures[Index].getVariable()
2518 : LambdaClass->getCapture(Index)->getCapturedVar();
2523 for (
const LambdaCapture &CapturePattern : LambdaPattern->captures()) {
2524 if (!CapturePattern.capturesVariable()) {
2528 ValueDecl *CapturedPattern = CapturePattern.getCapturedVar();
2536 AddSingleCapture(CapturedPattern, Instantiated++);
2539 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
2540 SemaRef.collectUnexpandedParameterPacks(
2541 dyn_cast<VarDecl>(CapturedPattern)->getInit(), Unexpanded);
2542 auto NumArgumentsInExpansion =
2544 if (!NumArgumentsInExpansion)
2546 for (
unsigned Arg = 0; Arg < *NumArgumentsInExpansion; ++Arg)
2547 AddSingleCapture(CapturedPattern, Instantiated++);
2569 if (!ShouldAddDeclsFromParentScope)
2573 InstantiationAndPatterns;
2574 while (FDPattern && FD) {
2575 InstantiationAndPatterns.emplace_back(FDPattern, FD);
2577 FDPattern = dyn_cast<FunctionDecl>(
2579 ->getEnclosingNonExpansionStatementContext());
2580 FD = dyn_cast<FunctionDecl>(
2582 ->getEnclosingNonExpansionStatementContext());
2595 for (
auto [FDPattern, FD] : llvm::reverse(InstantiationAndPatterns)) {
2596 SemaRef.addInstantiatedParametersToScope(FD, FDPattern,
Scope, MLTAL);
2597 SemaRef.addInstantiatedLocalVarsToScope(FD, FDPattern,
Scope);
2600 SemaRef.addInstantiatedCapturesToScope(FD, FDPattern,
Scope, MLTAL);
This file provides some common utility functions for processing Lambda related AST Constructs.
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the clang::Expr interface and subclasses for C++ expressions.
Result
Implement __builtin_bit_cast and related operations.
This file declares semantic analysis functions specific to ARM.
This file declares semantic analysis for CUDA constructs.
static LambdaCaptureDefault mapImplicitCaptureStyle(CapturingScopeInfo::ImplicitCaptureStyle ICS)
static CallingConv getLambdaConversionFunctionCallConv(Sema &S, const FunctionProtoType *CallOpProto)
static EnumDecl * findEnumForBlockReturn(Expr *E)
If this expression is an enumerator-like expression of some type T, return the type T; otherwise,...
static EnumDecl * findCommonEnumForBlockReturns(ArrayRef< ReturnStmt * > returns)
Attempt to find a common type T for which all of the returned expressions in a block are enumerator-l...
static TypeSourceInfo * getLambdaType(Sema &S, LambdaIntroducer &Intro, Declarator &ParamInfo, Scope *CurScope, SourceLocation Loc, bool &ExplicitResultType)
static FunctionDecl * getPatternFunctionDecl(FunctionDecl *FD)
static LambdaScopeInfo * getCurrentLambdaScopeUnsafe(Sema &S)
static UnsignedOrNone getStackIndexOfNearestEnclosingCaptureReadyLambda(ArrayRef< const clang::sema::FunctionScopeInfo * > FunctionScopes, ValueDecl *VarToCapture)
Examines the FunctionScopeInfo stack to determine the nearest enclosing lambda (to the current lambda...
static void adjustBlockReturnsToEnum(Sema &S, ArrayRef< ReturnStmt * > returns, QualType returnType)
Adjust the given return statements so that they formally return the given type.
static TemplateParameterList * getGenericLambdaTemplateParameterList(LambdaScopeInfo *LSI, Sema &SemaRef)
static void addBlockPointerConversion(Sema &S, SourceRange IntroducerRange, CXXRecordDecl *Class, CXXMethodDecl *CallOperator)
Add a lambda's conversion to block pointer.
static void buildLambdaScopeReturnType(Sema &S, LambdaScopeInfo *LSI, CXXMethodDecl *CallOperator, bool ExplicitResultType)
static SourceRange ConstructFixItRangeForUnusedCapture(Sema &S, SourceRange CaptureRange, SourceLocation PrevCaptureLoc, bool CurHasPreviousCapture, bool IsLast)
static TypeSourceInfo * getDummyLambdaType(Sema &S, SourceLocation Loc=SourceLocation())
static QualType buildTypeForLambdaCallOperator(Sema &S, clang::CXXRecordDecl *Class, TemplateParameterList *TemplateParams, TypeSourceInfo *MethodTypeInfo)
static void addFunctionPointerConversions(Sema &S, SourceRange IntroducerRange, CXXRecordDecl *Class, CXXMethodDecl *CallOperator)
Add a lambda's conversion to function pointers, as described in C++11 [expr.prim.lambda]p6.
static void repeatForLambdaConversionFunctionCallingConvs(Sema &S, const FunctionProtoType &CallOpProto, Func F)
static void addFunctionPointerConversion(Sema &S, SourceRange IntroducerRange, CXXRecordDecl *Class, CXXMethodDecl *CallOperator, QualType InvokerFunctionTy)
Add a lambda's conversion to function pointer, as described in C++11 [expr.prim.lambda]p6.
This file provides some common utility functions for processing Lambdas.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis for SYCL constructs.
a trap message and trap category.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
QualType getBlockPointerType(QualType T) const
Return the uniqued reference to the type for a block of the specified type.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
DeclarationNameTable DeclarationNames
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
const TargetInfo & getTargetInfo() const
QualType getAutoDeductType() const
C++11 deduction pattern for 'auto' type.
CanQualType getCanonicalTagType(const TagDecl *TD) const
Attr - This represents one attribute.
A builtin binary operation expression such as "x + y" or "x <= y".
A binding in a decomposition declaration.
A class which contains all the information about a particular captured value.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
static BlockDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
bool isAmbiguous(CanQualType BaseType) const
Determine whether the path from the most-derived type to the given base type is ambiguous (i....
Represents a C++ conversion function within a class.
static CXXConversionDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, ExplicitSpecifier ES, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
QualType getConversionType() const
Returns the type that this conversion function is converting to.
Represents a static or instance method of a struct/union/class.
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
static CXXMethodDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin, bool isInline, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Represents a C++ struct/union/class.
void setLambdaTypeInfo(TypeSourceInfo *TS)
void setLambdaIsGeneric(bool IsGeneric)
static CXXRecordDecl * CreateLambda(const ASTContext &C, DeclContext *DC, TypeSourceInfo *Info, SourceLocation Loc, unsigned DependencyKind, bool IsGeneric, LambdaCaptureDefault CaptureDefault)
bool isCapturelessLambda() const
Represents a C++ nested-name-specifier or a global scope specifier.
ConditionalOperator - The ?
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
bool isRequiresExprBody() const
bool isFileContext() const
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isTranslationUnit() const
void addDecl(Decl *D)
Add the declaration D into this context.
bool isFunctionOrMethod() const
DeclContext * getEnclosingNonExpansionStatementContext()
Retrieve the innermost enclosing context that doesn't belong to an expansion statement.
Simple template class for restricting typo correction candidates to ones having a single Decl* of the...
A reference to a declared variable, function, enum, etc.
Captures information about "declaration specifiers".
SCS getStorageClassSpec() const
bool SetTypeQual(TQ T, SourceLocation Loc)
ConstexprSpecKind getConstexprSpecifier() const
Decl - This represents one declaration (or definition), e.g.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
bool isInvalidDecl() const
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
void setImplicit(bool I=true)
void setReferenced(bool R=true)
DeclContext * getDeclContext()
void setLexicalDeclContext(DeclContext *DC)
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeNamedTypeLoc(TypeSourceInfo *TInfo)
Construct location information for a constructor, destructor or conversion operator.
static DeclarationNameLoc makeCXXOperatorNameLoc(SourceLocation BeginLoc, SourceLocation EndLoc)
Construct location information for a non-literal C++ operator.
The name of a declaration.
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void setTrailingRequiresClause(const AssociatedConstraint &AC)
TypeSourceInfo * getTypeSourceInfo() const
Information about one declarator, including the parsed type information and the identifier.
bool isFunctionDeclarator(unsigned &idx) const
isFunctionDeclarator - This method returns true if the declarator is a function declarator (looking t...
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
Expr * getTrailingRequiresClause()
Sets a trailing requires clause for this declarator.
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
bool isExplicitObjectMemberFunction()
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
An instance of this object exists for each enum constant that is defined.
Store information needed for an explicit specifier.
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
This represents one expression.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
Represents difference between two FPOptions values.
bool isFPConstrained() const
Represents a member of a struct/union/class.
static FieldDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, Expr *BW, bool Mutable, InClassInitStyle InitStyle)
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
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.
void setSubExpr(Expr *E)
As with any mutator of the AST, be very careful when modifying an existing AST to preserve its invari...
const Expr * getSubExpr() const
Represents a function declaration or definition.
const ParmVarDecl * getParamDecl(unsigned i) const
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
ConstexprSpecKind getConstexprKind() const
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
bool isVariadic() const
Whether this function is variadic.
@ TK_MemberSpecialization
@ TK_DependentNonTemplate
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
FunctionDecl * getInstantiatedFromDecl() const
void setConstexprKind(ConstexprSpecKind CSK)
FunctionDecl * getInstantiatedFromMemberFunction() const
If this function is an instantiation of a member function of a class template specialization,...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
Represents a prototype with parameter type info, e.g.
bool isVariadic() const
Whether this function prototype is variadic.
ExtProtoInfo getExtProtoInfo() const
ArrayRef< QualType > getParamTypes() const
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
FunctionTemplateDecl * getInstantiatedFromMemberTemplate() const
static FunctionTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
TypeLoc getReturnLoc() const
ExtInfo withCallingConv(CallingConv cc) const
CallingConv getCallConv() const
QualType getReturnType() const
One of these records is kept for each identifier that is lexed.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateDirect(SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a direct initialization.
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
static InitializationKind CreateDirectList(SourceLocation InitLoc)
ExprResult Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType=nullptr)
Perform the actual initialization of the given entity based on the computed initialization sequence.
Describes an entity that is being initialized.
static InitializedEntity InitializeLambdaToBlock(SourceLocation BlockVarLoc, QualType Type)
static InitializedEntity InitializeLambdaCapture(IdentifierInfo *VarID, QualType FieldType, SourceLocation Loc)
Create the initialization entity for a lambda capture.
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...
static LambdaExpr * Create(const ASTContext &C, CXXRecordDecl *Class, SourceRange IntroducerRange, LambdaCaptureDefault CaptureDefault, SourceLocation CaptureDefaultLoc, bool ExplicitParams, bool ExplicitResultType, ArrayRef< Expr * > CaptureInits, SourceLocation ClosingBrace, bool ContainsUnexpandedParameterPack)
Construct a new lambda expression.
A stack-allocated class that identifies which local variable declaration instantiations are present i...
void InstantiatedLocal(const Decl *D, Decl *Inst)
void MakeInstantiatedLocalArgPack(const Decl *D)
Represents the results of name lookup.
Keeps track of the mangled names of lambda expressions and block literals within a particular context...
virtual unsigned getManglingNumber(const CXXMethodDecl *CallOperator)=0
Retrieve the mangling number of a new lambda expression with the given call operator within this cont...
unsigned getNextLambdaIndex()
virtual unsigned getDeviceManglingNumber(const CXXMethodDecl *)
Retrieve the mangling number of a new lambda expression with the given call operator within the devic...
Data structure that captures multiple levels of template argument lists for use in template instantia...
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
bool isPlaceholderVar(const LangOptions &LangOpts) const
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
unsigned getNumExprs() const
Return the number of expressions in this paren list.
Represents a parameter to a function.
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
Wrapper for source info for pointers.
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
LangAS getAddressSpace() const
Return the address space of this type.
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
The collection of all-type qualifiers we support.
void addAddressSpace(LangAS space)
Represents a struct/union/class.
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
void setRetValue(Expr *E)
SourceLocation getBeginLoc() const
Scope - A scope is a transient data structure that is used while parsing the program.
DeclContext * getEntity() const
Get the entity corresponding to this scope.
bool isFunctionDeclarationScope() const
isFunctionDeclarationScope - Return true if this scope is a function prototype scope.
const Scope * getParent() const
getParent - Return the scope that this is nested in.
void CheckSMEFunctionDefAttributes(const FunctionDecl *FD)
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
void CheckLambdaCapture(CXXMethodDecl *D, const sema::Capture &Capture)
void SetLambdaAttrs(CXXMethodDecl *Method)
Set device or host device attributes on the given lambda operator() method.
void ActOnFinishedFunctionDefinitionInOpenMPAssumeScope(Decl *D)
Act on D, a function definition inside of an omp [begin/end] assumes.
void CheckSYCLEntryPointFunctionDecl(FunctionDecl *FD)
LambdaScopeForCallOperatorInstantiationRAII(Sema &SemasRef, FunctionDecl *FD, MultiLevelTemplateArgumentList MLTAL, LocalInstantiationScope &Scope, bool ShouldAddDeclsFromParentScope=true)
Sema - This implements semantic analysis and AST building for C.
Attr * getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD, bool IsDefinition)
Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a containing class.
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
Scope * getCurScope() const
Retrieve the parser's current scope.
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath)
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
QualType deduceVarTypeFromInitializer(VarDecl *VDecl, DeclarationName Name, QualType Type, TypeSourceInfo *TSI, SourceRange Range, bool DirectInit, Expr *Init)
VarDecl * createLambdaInitCaptureVarDecl(SourceLocation Loc, QualType InitCaptureType, SourceLocation EllipsisLoc, IdentifierInfo *Id, unsigned InitStyle, Expr *Init, DeclContext *DeclCtx)
Create a dummy variable within the declcontext of the lambda's call operator, for name lookup purpose...
ExprResult ActOnLambdaExpr(SourceLocation StartLoc, Stmt *Body)
ActOnLambdaExpr - This is called when the body of a lambda expression was successfully completed.
CXXRecordDecl * createLambdaClosureType(SourceRange IntroducerRange, TypeSourceInfo *Info, unsigned LambdaDependencyKind, LambdaCaptureDefault CaptureDefault)
Create a new lambda closure type.
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
bool CheckCXXThisCapture(SourceLocation Loc, bool Explicit=false, bool BuildAndDiagnose=true, const unsigned *const FunctionScopeIndexToStopAt=nullptr, bool ByCopy=false)
Make sure the value of 'this' is actually available in the current context, if it is a potentially ev...
void ActOnLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro, Scope *CurContext)
Once the Lambdas capture are known, we can start to create the closure, call operator method,...
void AddTemplateParametersToLambdaCallOperator(CXXMethodDecl *CallOperator, CXXRecordDecl *Class, TemplateParameterList *TemplateParams)
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
void AddRangeBasedOptnone(FunctionDecl *FD)
Only called on function definitions; if there is a pragma in scope with the effect of a range-based o...
Decl * ActOnFinishFunctionBody(Decl *Decl, Stmt *Body, bool IsInstantiation=false, bool RetainFunctionScopeInfo=false)
Performs semantic analysis at the end of a function body.
void addInitCapture(sema::LambdaScopeInfo *LSI, VarDecl *Var, bool ByRef)
Add an init-capture to a lambda scope.
FieldDecl * BuildCaptureField(RecordDecl *RD, const sema::Capture &Capture)
Build a FieldDecl suitable to hold the given capture.
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
ASTContext & getASTContext() const
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
bool tryCaptureVariable(ValueDecl *Var, SourceLocation Loc, TryCaptureKind Kind, SourceLocation EllipsisLoc, bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const unsigned *const FunctionScopeIndexToStopAt)
Try to capture the given variable.
void PopExpressionEvaluationContext()
std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths)
Builds a string representing ambiguous paths from a specific derived class to different subobjects of...
void handleLambdaNumbering(CXXRecordDecl *Class, CXXMethodDecl *Method, std::optional< CXXRecordDecl::LambdaNumbering > NumberingOverride=std::nullopt)
Number lambda for linkage purposes if necessary.
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
ExprResult BuildCaptureInit(const sema::Capture &Capture, SourceLocation ImplicitCaptureLoc, bool IsOpenMPMapping=false)
Initialize the given capture with a suitable expression.
FPOptions & getCurFPFeatures()
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
@ UPPC_Initializer
An initializer.
@ UPPC_DeclarationType
The type of an arbitrary declaration.
void buildLambdaScope(sema::LambdaScopeInfo *LSI, CXXMethodDecl *CallOperator, SourceRange IntroducerRange, LambdaCaptureDefault CaptureDefault, SourceLocation CaptureDefaultLoc, bool ExplicitParams, bool Mutable)
Endow the lambda scope info with the relevant properties.
const LangOptions & getLangOpts() const
bool CaptureHasSideEffects(const sema::Capture &From)
Does copying/destroying the captured variable have side effects?
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
void ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro, Declarator &ParamInfo, const DeclSpec &DS)
ActOnStartOfLambdaDefinition - This is called just before we start parsing the body of a lambda; it a...
void ActOnLambdaClosureParameters(Scope *LambdaScope, MutableArrayRef< DeclaratorChunk::ParamInfo > ParamInfo)
bool DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs=nullptr, ArrayRef< Expr * > Args={}, DeclContext *LookupCtx=nullptr)
Diagnose an empty lookup.
bool CheckConstexprFunctionDefinition(const FunctionDecl *FD, CheckConstexprKind Kind)
AccessResult CheckBaseClassAccess(SourceLocation AccessLoc, QualType Base, QualType Derived, const CXXBasePath &Path, unsigned DiagID, bool ForceCheck=false, bool ForceUnprivileged=false)
Checks access for a hierarchy conversion.
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
const LangOptions & LangOpts
void PushExpressionEvaluationContextForFunction(ExpressionEvaluationContext NewContext, FunctionDecl *FD)
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
void CompleteLambdaCallOperator(CXXMethodDecl *Method, SourceLocation LambdaLoc, SourceLocation CallOperatorLoc, const AssociatedConstraint &TrailingRequiresClause, TypeSourceInfo *MethodTyInfo, ConstexprSpecKind ConstexprKind, StorageClass SC, ArrayRef< ParmVarDecl * > Params, bool HasExplicitResultType)
void maybeAddDeclWithEffects(FuncOrBlockDecl *D)
Inline checks from the start of maybeAddDeclWithEffects, to minimize performance impact on code not u...
void CheckCXXDefaultArguments(FunctionDecl *FD)
Helpers for dealing with blocks and functions.
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
void DiagnoseShadowingLambdaDecls(const sema::LambdaScopeInfo *LSI)
Diagnose shadowing for variables shadowed in the lambda record LambdaRD when these variables are capt...
Expr * BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit)
Build a CXXThisExpr and mark it referenced in the current context.
QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc, DeclarationName Entity)
Build a reference type.
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
void DiagPlaceholderVariableDefinition(SourceLocation Loc)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
void ActOnLambdaExplicitTemplateParameterList(LambdaIntroducer &Intro, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > TParams, SourceLocation RAngleLoc, ExprResult RequiresClause)
This is called after parsing the explicit template parameter list on a lambda (if it exists) in C++2a...
void ActOnLambdaClosureQualifiers(LambdaIntroducer &Intro, SourceLocation MutableLoc)
void ActOnLambdaError(SourceLocation StartLoc, Scope *CurScope, bool IsInstantiation=false)
ActOnLambdaError - If there is an error parsing a lambda, this callback is invoked to pop the informa...
bool CheckParmsForFunctionDef(ArrayRef< ParmVarDecl * > Parameters, bool CheckParameterNames)
CheckParmsForFunctionDef - Check that the parameters of the given function are appropriate for the de...
void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, const LookupResult &R)
Diagnose variable or built-in function shadowing.
bool DiagnoseUnusedLambdaCapture(SourceRange CaptureRange, SourceRange FixItRange, const sema::Capture &From)
Diagnose if an explicit lambda capture is unused.
QualType buildLambdaInitCaptureInitialization(SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc, UnsignedOrNone NumExpansions, IdentifierInfo *Id, bool DirectInit, Expr *&Init)
SmallVector< ExprWithCleanups::CleanupObject, 8 > ExprCleanupObjects
ExprCleanupObjects - This is the stack of objects requiring cleanup that are created by the current f...
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
@ UnevaluatedAbstract
The current expression occurs within an unevaluated operand that unconditionally permits abstract ref...
@ UnevaluatedList
The current expression occurs within a braced-init-list within an unevaluated operand.
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
@ DiscardedStatement
The current expression occurs within a discarded statement.
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
@ PotentiallyEvaluatedIfUsed
The current expression is potentially evaluated, but any declarations referenced inside that expressi...
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl, ArrayRef< Decl * > Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
void CheckExplicitObjectLambda(Declarator &D)
QualType getLambdaConversionFunctionResultType(const FunctionProtoType *CallOpType, CallingConv CC)
Get the return type to use for a lambda's conversion function(s) to function pointer type,...
void CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record)
Perform semantic checks on a class definition that has been completing, introducing implicitly-declar...
void DiscardCleanupsInEvaluationContext()
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
void makeMergedDefinitionVisible(NamedDecl *ND)
Make a merged definition of an existing hidden definition ND visible at the specified location.
CXXMethodDecl * CreateLambdaCallOperator(SourceRange IntroducerRange, CXXRecordDecl *Class)
void deduceClosureReturnType(sema::CapturingScopeInfo &CSI)
Deduce a block or lambda's return type based on the return statements present in the body.
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
friend class InitializationSequence
ExprResult BuildLambdaExpr(SourceLocation StartLoc, SourceLocation EndLoc)
Complete a lambda-expression having processed and attached the lambda body.
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
QualType SubstAutoTypeDependent(QualType TypeWithAuto)
SourceRange getRangeForNextToken(SourceLocation Loc, bool IncludeMacros, bool IncludeComments, std::optional< tok::TokenKind > ExpectedToken=std::nullopt)
Calls Lexer::findNextToken() to find the next token, and if the locations of both ends of the token c...
std::tuple< MangleNumberingContext *, Decl * > getCurrentMangleNumberContext(const DeclContext *DC)
Compute the mangling number context for a lambda expression or block literal.
void finishLambdaExplicitCaptures(sema::LambdaScopeInfo *LSI)
Note that we have finished the explicit captures for the given lambda.
@ CheckValid
Identify whether this function satisfies the formal rules for constexpr functions in the current lanu...
bool DiagnoseInvalidExplicitObjectParameterInLambda(CXXMethodDecl *Method, SourceLocation CallLoc)
Returns true if the explicit object parameter was invalid.
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
UnsignedOrNone getNumArgumentsInExpansionFromUnexpanded(llvm::ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs)
void NoteTemplateParameterLocation(const NamedDecl &Decl)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
bool hasNameForLinkage() const
Is this tag type named, either directly or via being defined in a typedef of this type?
Exposes information about the current target.
virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const
Determines whether a given calling convention is valid for the target.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Stores a list of template parameters for a TemplateDecl and its derived classes.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
bool containsUnexpandedParameterPack() const
Determine whether this template parameter list contains an unexpanded parameter pack.
ArrayRef< NamedDecl * > asArray()
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
Base wrapper for a particular "section" of type source info.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
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.
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
const T * castAs() const
Member-template castAs<specific type>.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
NullabilityKindOrNone getNullability() const
Determine the nullability of the given type.
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,...
VarDecl * getPotentiallyDecomposedVarDecl()
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Represents a variable declaration or definition.
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
void setInitStyle(InitializationStyle Style)
void setInitCapture(bool IC)
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
InitializationStyle
Initialization styles.
@ ListInit
Direct list-initialization (C++11)
@ CInit
C-style initialization with assignment.
@ CallInit
Call-style initialization (C++98)
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
ValueDecl * getVariable() const
bool isVariableCapture() const
bool isBlockCapture() const
SourceLocation getLocation() const
Retrieve the location at which this variable was captured.
bool isNonODRUsed() const
bool isInitCapture() const
Determine whether this capture is an init-capture.
bool isVLATypeCapture() const
SourceLocation getEllipsisLoc() const
Retrieve the source location of the ellipsis, whose presence indicates that the capture is a pack exp...
bool isThisCapture() const
QualType getCaptureType() const
Retrieve the capture type for this capture, which is effectively the type of the non-static data memb...
bool isCopyCapture() const
const VariableArrayType * getCapturedVLAType() const
QualType ReturnType
ReturnType - The target type of return statements in this context, or null if unknown.
bool isCaptured(ValueDecl *Var) const
Determine whether the given variable has been captured.
bool ContainsUnexpandedParameterPack
Whether this contains an unexpanded parameter pack.
SmallVector< Capture, 4 > Captures
Captures - The captures.
ImplicitCaptureStyle ImpCaptureStyle
bool HasImplicitReturnType
Capture & getCXXThisCapture()
Retrieve the capture of C++ 'this', if it has been captured.
bool isCXXThisCaptured() const
Determine whether the C++ 'this' is captured.
SmallVector< NamedDecl *, 4 > LocalPacks
Packs introduced by this, if any.
void addCapture(ValueDecl *Var, bool isBlock, bool isByref, bool isNested, SourceLocation Loc, SourceLocation EllipsisLoc, QualType CaptureType, bool Invalid)
SmallVector< ReturnStmt *, 4 > Returns
The list of return statements that occur within the function or block, if there is any chance of appl...
SourceLocation PotentialThisCaptureLocation
void finishedExplicitCaptures()
Note when all explicit captures have been added.
CleanupInfo Cleanup
Whether any of the capture expressions requires cleanups.
SourceRange IntroducerRange
Source range covering the lambda introducer [...].
bool BeforeCompoundStatement
bool ExplicitParams
Whether the (empty) parameter list is explicit.
TemplateParameterList * GLTemplateParameterList
If this is a generic lambda, and the template parameter list has been created (from the TemplateParam...
ExprResult RequiresClause
The requires-clause immediately following the explicit template parameter list, if any.
SourceRange ExplicitTemplateParamsRange
Source range covering the explicit template parameter list (if it exists).
CXXRecordDecl * Lambda
The class that describes the lambda.
unsigned NumExplicitCaptures
The number of captures in the Captures list that are explicit captures.
SourceLocation CaptureDefaultLoc
Source location of the '&' or '=' specifying the default capture type, if any.
llvm::DenseMap< unsigned, SourceRange > ExplicitCaptureRanges
A map of explicit capture indices to their introducer source ranges.
bool AfterParameterList
Indicate that we parsed the parameter list at which point the mutability of the lambda is known.
CXXMethodDecl * CallOperator
The lambda's compiler-generated operator().
bool Mutable
Whether this is a mutable lambda.
Defines the clang::TargetInfo interface.
Top level wrappers for InstallAPI frontend operations.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
DeclContext * getLambdaAwareParentOfDeclContext(DeclContext *DC)
ConstexprSpecKind
Define the kind of constexpr specifier.
@ ICIS_NoInit
No in-class initializer.
@ RQ_None
No ref-qualifier was provided.
UnsignedOrNone getStackIndexOfNearestEnclosingCaptureCapableLambda(ArrayRef< const sema::FunctionScopeInfo * > FunctionScopes, ValueDecl *VarToCapture, Sema &S)
Examines the FunctionScopeInfo stack to determine the nearest enclosing lambda (to the current lambda...
LambdaCaptureKind
The different capture forms in a lambda introducer.
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
@ LCK_ByRef
Capturing by reference.
@ LCK_VLAType
Capturing variable-length array type.
@ LCK_StarThis
Capturing the *this object by copy.
@ LCK_This
Capturing the *this object by reference.
bool isLambdaCallWithExplicitObjectParameter(const DeclContext *DC)
StorageClass
Storage classes.
bool FTIHasSingleVoidParameter(const DeclaratorChunk::FunctionTypeInfo &FTI)
MutableArrayRef< Expr * > MultiExprArg
@ CopyInit
[a = b], [a = {b}]
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
bool hasWeakerNullability(NullabilityKind L, NullabilityKind R)
Return true if L has a weaker nullability annotation than R.
LangAS
Defines the address space values used by the address space qualifier of QualType.
LambdaCaptureDefault
The default, if any, capture method for a lambda expression.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
StringRef getLambdaStaticInvokerName()
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
@ Class
The "class" keyword introduces the elaborated-type-specifier.
ActionResult< Expr * > ExprResult
@ EST_BasicNoexcept
noexcept
Information about how a lambda is numbered within its context.
unsigned DeviceManglingNumber
bool HasKnownInternalLinkage
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getTrailingReturnTypeLoc() const
Get the trailing-return-type location for this function declarator.
bool hasTrailingReturnType() const
Determine whether this function declarator had a trailing-return-type.
ParsedType getTrailingReturnType() const
Get the trailing-return-type for this function declarator.
bool hasMutableQualifier() const
Determine whether this lambda-declarator contains a 'mutable' qualifier.
DeclSpec & getOrCreateMethodQualifiers()
ParamInfo - An array of paraminfo objects is allocated whenever a function declarator is parsed.
ExceptionSpecificationType Type
The kind of exception specification this is.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
RefQualifierKind RefQualifier
unsigned HasTrailingReturn
FunctionType::ExtInfo ExtInfo
unsigned NumExplicitTemplateParams
The number of parameters in the template parameter list that were explicitly specified by the user,...
SmallVector< NamedDecl *, 4 > TemplateParams
Store the list of the template parameters for a generic lambda or an abbreviated function template.
Represents a complete lambda introducer.
SmallVector< LambdaCapture, 4 > Captures
SourceLocation DefaultLoc
LambdaCaptureDefault Default
FunctionScopeRAII(Sema &S)