clang: clang::sema::LambdaScopeInfo Class Reference (original) (raw)

#include "[clang/Sema/ScopeInfo.h](ScopeInfo%5F8h%5Fsource.html)"

Classes
struct ShadowedOuterDecl
Contains all of the variables defined in this lambda that shadow variables that were defined in parent contexts. More...
Public Member Functions
LambdaScopeInfo (DiagnosticsEngine &Diag)
void finishedExplicitCaptures ()
Note when all explicit captures have been added.
bool isGenericLambda () const
Is this scope known to be for a generic lambda? (This will be false until we parse a template parameter list or the first 'auto'-typed parameter).
void addPotentialCapture (Expr *VarExpr)
Add a variable that might potentially be captured by the lambda and therefore the enclosing lambdas.
void addPotentialThisCapture (SourceLocation Loc)
bool hasPotentialThisCapture () const
void markVariableExprAsNonODRUsed (Expr *CapturingVarExpr)
Mark a variable's reference in a lambda as non-odr using.
bool isVariableExprMarkedAsNonODRUsed (Expr *CapturingVarExpr) const
void removePotentialCapture (Expr *E)
void clearPotentialCaptures ()
unsigned getNumPotentialVariableCaptures () const
bool hasPotentialCaptures () const
void visitPotentialCaptures (llvm::function_ref< void(ValueDecl *, Expr *)> Callback) const
bool lambdaCaptureShouldBeConst () const
- Public Member Functions inherited from clang::sema::CapturingScopeInfo
CapturingScopeInfo (DiagnosticsEngine &Diag, ImplicitCaptureStyle Style)
void addCapture (ValueDecl *Var, bool isBlock, bool isByref, bool isNested, SourceLocation Loc, SourceLocation EllipsisLoc, QualType CaptureType, bool Invalid)
void addVLATypeCapture (SourceLocation Loc, const VariableArrayType *VLAType, QualType CaptureType)
void addThisCapture (bool isNested, SourceLocation Loc, QualType CaptureType, bool ByCopy)
bool isCXXThisCaptured () const
Determine whether the C++ 'this' is captured.
Capture & getCXXThisCapture ()
Retrieve the capture of C++ 'this', if it has been captured.
bool isCaptured (ValueDecl *Var) const
Determine whether the given variable has been captured.
bool isVLATypeCaptured (const VariableArrayType *VAT) const
Determine whether the given variable-array type has been captured.
Capture & getCapture (ValueDecl *Var)
Retrieve the capture of the given variable, if it has been captured already.
const Capture & getCapture (ValueDecl *Var) const
- Public Member Functions inherited from clang::sema::FunctionScopeInfo
FunctionScopeInfo (DiagnosticsEngine &Diag)
virtual ~FunctionScopeInfo ()
bool hasUnrecoverableErrorOccurred () const
Determine whether an unrecoverable error has occurred within this function.
template
void recordUseOfWeak (const ExprT *E, bool IsRead=true)
Record that a weak object was accessed.
void recordUseOfWeak (const ObjCMessageExpr *Msg, const ObjCPropertyDecl *Prop)
void markSafeWeakUse (const Expr *E)
Record that a given expression is a "safe" access of a weak object (e.g.
const WeakObjectUseMap & getWeakObjectUses () const
void setHasBranchIntoScope ()
void setHasBranchProtectedScope ()
void setHasIndirectGoto ()
void setHasMustTail ()
void setHasDroppedStmt ()
void setHasOMPDeclareReductionCombiner ()
void setHasFallthroughStmt ()
void setUsesFPIntrin ()
void setHasCXXTry (SourceLocation TryLoc)
void setHasObjCTry (SourceLocation TryLoc)
void setHasSEHTry (SourceLocation TryLoc)
void setHasVLA (SourceLocation VLALoc)
bool NeedsScopeChecking () const
void addBlock (const BlockDecl *BD)
void addByrefBlockVar (VarDecl *VD)
bool isCoroutine () const
void setFirstCoroutineStmt (SourceLocation Loc, StringRef Keyword)
StringRef getFirstCoroutineStmtKeyword () const
void setNeedsCoroutineSuspends (bool value=true)
bool hasInvalidCoroutineSuspends () const
void setCoroutineSuspends (Stmt *Initial, Stmt *Final)
void Clear ()
Clear out the information in this function scope, making it suitable for reuse.
bool isPlainFunction () const
Static Public Member Functions
static bool classof (const FunctionScopeInfo *FSI)
- Static Public Member Functions inherited from clang::sema::CapturingScopeInfo
static bool classof (const FunctionScopeInfo *FSI)
Public Attributes
CXXRecordDecl * Lambda = nullptr
The class that describes the lambda.
CXXMethodDecl * CallOperator = nullptr
The lambda's compiler-generated operator().
bool AfterParameterList = true
Indicate that we parsed the parameter list at which point the mutability of the lambda is known.
ParmVarDecl * ExplicitObjectParameter = nullptr
SourceRange IntroducerRange
Source range covering the lambda introducer [...].
SourceLocation CaptureDefaultLoc
Source location of the '&' or '=' specifying the default capture type, if any.
unsigned NumExplicitCaptures = 0
The number of captures in the Captures list that are explicit captures.
bool Mutable = true
Whether this is a mutable lambda.
bool ExplicitParams = false
Whether the (empty) parameter list is explicit.
CleanupInfo Cleanup
Whether any of the capture expressions requires cleanups.
SourceRange ExplicitTemplateParamsRange
Source range covering the explicit template parameter list (if it exists).
ExprResult RequiresClause
The requires-clause immediately following the explicit template parameter list, if any.
TemplateParameterList * GLTemplateParameterList = nullptr
If this is a generic lambda, and the template parameter list has been created (from the TemplateParams) then store a reference to it (cache it to avoid reconstructing it).
llvm::SmallVector< Expr *, 4 > PotentiallyCapturingExprs
Contains all variable-referring-expressions (i.e.
llvm::SmallSet< Expr *, 8 > NonODRUsedCapturingExprs
Contains all variable-referring-expressions that refer to local variables that are usable as constant expressions and do not involve an odr-use (they may still need to be captured if the enclosing full-expression is instantiation dependent).
llvm::DenseMap< unsigned, SourceRange > ExplicitCaptureRanges
A map of explicit capture indices to their introducer source ranges.
llvm::SmallVector< ShadowedOuterDecl, 4 > ShadowingDecls
SourceLocation PotentialThisCaptureLocation
- Public Attributes inherited from clang::sema::CapturingScopeInfo
ImplicitCaptureStyle ImpCaptureStyle
llvm::DenseMap< ValueDecl *, unsigned > CaptureMap
CaptureMap - A map of captured variables to (index+1) into Captures.
unsigned CXXThisCaptureIndex = 0
CXXThisCaptureIndex - The (index+1) of the capture of 'this'; zero if 'this' is not captured.
SmallVector< Capture, 4 > Captures
Captures - The captures.
bool HasImplicitReturnType = false
bool ContainsUnexpandedParameterPack = false
Whether this contains an unexpanded parameter pack.
QualType ReturnType
ReturnType - The target type of return statements in this context, or null if unknown.
SmallVector< NamedDecl *, 4 > LocalPacks
Packs introduced by this, if any.
- Public Attributes inherited from clang::sema::FunctionScopeInfo
ScopeKind Kind: 3
What kind of scope we are describing.
bool HasBranchProtectedScope: 1
Whether this function contains a VLA, @try, try, C++ initializer, or anything else that can't be jumped past.
bool HasBranchIntoScope: 1
Whether this function contains any switches or direct gotos.
bool HasIndirectGoto: 1
Whether this function contains any indirect gotos.
bool HasMustTail: 1
Whether this function contains any statement marked with [[clang::musttail]].
bool HasDroppedStmt: 1
Whether a statement was dropped because it was invalid.
bool HasOMPDeclareReductionCombiner: 1
True if current scope is for OpenMP declare reduction combiner.
bool HasFallthroughStmt: 1
Whether there is a fallthrough statement in this function.
bool UsesFPIntrin: 1
Whether this function uses constrained floating point intrinsics.
bool HasPotentialAvailabilityViolations: 1
Whether we make reference to a declaration that could be unavailable.
bool ObjCShouldCallSuper: 1
A flag that is set when parsing a method that must call super's implementation, such as -dealloc, -finalize, or any method marked with __attribute__((objc_requires_super)).
bool ObjCIsDesignatedInit: 1
True when this is a method marked as a designated initializer.
bool ObjCWarnForNoDesignatedInitChain: 1
This starts true for a method marked as designated initializer and will be set to false if there is an invocation to a designated initializer of the super class.
bool ObjCIsSecondaryInit: 1
True when this is an initializer method not marked as a designated initializer within a class that has at least one initializer marked as a designated initializer.
bool ObjCWarnForNoInitDelegation: 1
This starts true for a secondary initializer method and will be set to false if there is an invocation of an initializer on 'self'.
bool NeedsCoroutineSuspends: 1
True only when this function has not already built, or attempted to build, the initial and final coroutine suspend points.
unsigned char FirstCoroutineStmtKind: 2
An enumeration representing the kind of the first coroutine statement in the function.
bool FoundImmediateEscalatingExpression: 1
Whether we found an immediate-escalating expression.
SourceLocation FirstCoroutineStmtLoc
First coroutine statement in the current function.
SourceLocation FirstReturnLoc
First 'return' statement in the current function.
SourceLocation FirstCXXOrObjCTryLoc
First C++ 'try' or ObjC @try statement in the current function.
enum clang::sema::FunctionScopeInfo:: { ... } FirstTryType = Unknown
SourceLocation FirstSEHTryLoc
First SEH '__try' statement in the current function.
SourceLocation FirstVLALoc
First use of a VLA within the current function.
SmallVector< SwitchInfo, 8 > SwitchStack
SwitchStack - This is the current set of active switch statements in the block.
SmallVector< ReturnStmt *, 4 > Returns
The list of return statements that occur within the function or block, if there is any chance of applying the named return value optimization, or if we need to infer a return type.
VarDecl * CoroutinePromise = nullptr
The promise object for this coroutine, if any.
llvm::SmallMapVector< ParmVarDecl *, Stmt *, 4 > CoroutineParameterMoves
A mapping between the coroutine function parameters that were moved to the coroutine frame, and their move statements.
std::pair< Stmt *, Stmt * > CoroutineSuspends
The initial and final coroutine suspend points.
SmallVector< CompoundScopeInfo, 4 > CompoundScopes
The stack of currently active compound statement scopes in the function.
llvm::SmallPtrSet< const BlockDecl *, 1 > Blocks
The set of blocks that are introduced in this function.
llvm::TinyPtrVector< VarDecl * > ByrefBlockVars
The set of __block variables that are introduced in this function.
SmallVector< PossiblyUnreachableDiag, 4 > PossiblyUnreachableDiags
A list of PartialDiagnostics created but delayed within the current function scope.
llvm::SmallPtrSet< const ParmVarDecl *, 8 > ModifiedNonNullParams
A list of parameters which have the nonnull attribute and are modified in the function.
llvm::SmallVector< AddrLabelExpr *, 4 > AddrLabels
The set of GNU address of label extension "&&label".
- Public Attributes inherited from clang::InventedTemplateParameterInfo
unsigned NumExplicitTemplateParams = 0
The number of parameters in the template parameter list that were explicitly specified by the user, as opposed to being invented by use of an auto parameter.
unsigned AutoTemplateParameterDepth = 0
If this is a generic lambda or abbreviated function template, use this as the depth of each 'auto' parameter, during initial AST construction.
SmallVector< NamedDecl *, 4 > TemplateParams
Store the list of the template parameters for a generic lambda or an abbreviated function template.
Additional Inherited Members
- Public Types inherited from clang::sema::CapturingScopeInfo
enum ImplicitCaptureStyle { ImpCap_None, ImpCap_LambdaByval, ImpCap_LambdaByref, ImpCap_Block, ImpCap_CapturedRegion }
- Public Types inherited from clang::sema::FunctionScopeInfo
enum { TryLocIsCXX, TryLocIsObjC, Unknown }
using SwitchInfo = llvm::PointerIntPair< SwitchStmt *, 1, bool >
A SwitchStmt, along with a flag indicating if its list of case statements is incomplete (because we dropped an invalid one while parsing).
using WeakUseVector = SmallVector< WeakUseTy, 4 >
Used to collect uses of a particular weak object in a function body.
using WeakObjectUseMap = llvm::SmallDenseMap< WeakObjectProfileTy, WeakUseVector, 8, WeakObjectProfileTy::DenseMapInfo >
Used to collect all uses of weak objects in a function body.
- Protected Types inherited from clang::sema::FunctionScopeInfo
enum ScopeKind { SK_Function, SK_Block, SK_Lambda, SK_CapturedRegion }
- Protected Member Functions inherited from clang::sema::CapturingScopeInfo
CapturingScopeInfo (const CapturingScopeInfo &)=default
- Protected Member Functions inherited from clang::sema::FunctionScopeInfo
FunctionScopeInfo (const FunctionScopeInfo &)=default

Definition at line 867 of file ScopeInfo.h.

addPotentialCapture()

void clang::sema::LambdaScopeInfo::addPotentialCapture ( Expr * VarExpr) inline

Add a variable that might potentially be captured by the lambda and therefore the enclosing lambdas.

This is also used by enclosing lambda's to speculatively capture variables that nested lambda's - depending on their enclosing specialization - might need to capture. Consider: void f(int, int); <– don't capture void f(const int&, double); <– capture void foo() { const int x = 10; auto L = [=](auto a) { // capture 'x' return [=](auto b) { f(x, a); // we may or may not need to capture 'x' }; }; }

Definition at line 989 of file ScopeInfo.h.

References PotentiallyCapturingExprs.

Referenced by DoMarkPotentialCapture().

addPotentialThisCapture()

void clang::sema::LambdaScopeInfo::addPotentialThisCapture ( SourceLocation Loc) inline

classof()

clearPotentialCaptures()

void clang::sema::LambdaScopeInfo::clearPotentialCaptures ( ) inline

finishedExplicitCaptures()

void clang::sema::LambdaScopeInfo::finishedExplicitCaptures ( ) inline

getNumPotentialVariableCaptures()

unsigned clang::sema::LambdaScopeInfo::getNumPotentialVariableCaptures ( ) const inline

hasPotentialCaptures()

bool clang::sema::LambdaScopeInfo::hasPotentialCaptures ( ) const inline

hasPotentialThisCapture()

bool clang::sema::LambdaScopeInfo::hasPotentialThisCapture ( ) const inline

isGenericLambda()

bool clang::sema::LambdaScopeInfo::isGenericLambda ( ) const inline

isVariableExprMarkedAsNonODRUsed()

bool clang::sema::LambdaScopeInfo::isVariableExprMarkedAsNonODRUsed ( Expr * CapturingVarExpr) const inline

lambdaCaptureShouldBeConst()

bool LambdaScopeInfo::lambdaCaptureShouldBeConst ( ) const

markVariableExprAsNonODRUsed()

void clang::sema::LambdaScopeInfo::markVariableExprAsNonODRUsed ( Expr * CapturingVarExpr) inline

Mark a variable's reference in a lambda as non-odr using.

For generic lambdas, if a variable is named in a potentially evaluated expression, where the enclosing full expression is dependent then we must capture the variable (given a default capture). This is accomplished by recording all references to variables (DeclRefExprs or MemberExprs) within said nested lambda in its array of PotentialCaptures. All such variables have to be captured by that lambda, except for as described below. If that variable is usable as a constant expression and is named in a manner that does not involve its odr-use (e.g. undergoes lvalue-to-rvalue conversion, or discarded) record that it is so. Upon the act of analyzing the enclosing full expression (ActOnFinishFullExpr) if we can determine that the full expression is not instantiation- dependent, then we can entirely avoid its capture.

const int n = 0; [&] (auto x) { (void)+n + x; }; Interestingly, this strategy would involve a capture of n, even though it's obviously not odr-used here, because the full-expression is instantiation-dependent. It could be useful to avoid capturing such variables, even when they are referred to in an instantiation-dependent expression, if we can unambiguously determine that they shall never be odr-used. This would involve removal of the variable-referring-expression from the array of PotentialCaptures during the lvalue-to-rvalue conversions. But per the working draft N3797, (post-chicago 2013) we must capture such variables. Before anyone is tempted to implement a strategy for not-capturing 'n', consider the insightful warning in: /cfe-commits/Week-of-Mon-20131104/092596.html "The problem is that the set of captures for a lambda is part of the ABI (since lambda layout can be made visible through inline functions and the like), and there are no guarantees as to which cases we'll manage to build an lvalue-to-rvalue conversion in, when parsing a template – some seemingly harmless change elsewhere in Sema could cause us to start or stop building such a node. So we need a rule that anyone can implement and get exactly the same result".

Definition at line 1042 of file ScopeInfo.h.

References NonODRUsedCapturingExprs.

removePotentialCapture()

void clang::sema::LambdaScopeInfo::removePotentialCapture ( Expr * E) inline

visitPotentialCaptures()

void LambdaScopeInfo::visitPotentialCaptures ( llvm::function_ref< void(ValueDecl *, Expr *)> Callback ) const

AfterParameterList

bool clang::sema::LambdaScopeInfo::AfterParameterList = true

CallOperator

CXXMethodDecl* clang::sema::LambdaScopeInfo::CallOperator = nullptr

The lambda's compiler-generated operator().

Definition at line 874 of file ScopeInfo.h.

Referenced by clang::Sema::ActOnCapScopeReturnStmt(), clang::Sema::ActOnLambdaClosureParameters(), clang::Sema::ActOnLambdaClosureQualifiers(), clang::Sema::ActOnLambdaExpr(), clang::Sema::ActOnLambdaExpressionAfterIntroducer(), clang::Sema::ActOnStartOfLambdaDefinition(), adjustCVQualifiersForCXXThisWithinLambda(), clang::Sema::BuildLambdaExpr(), clang::Sema::buildLambdaScope(), clang::Sema::CheckCXXThisCapture(), CheckIfAnyEnclosingLambdasMustCaptureAnyPotentialCaptures(), DoMarkPotentialCapture(), clang::TreeTransform< Derived >::RebuildLambdaExpr(), clang::Sema::RebuildLambdaScopeInfo(), and clang::Sema::tryCaptureVariable().

CaptureDefaultLoc

Cleanup

ExplicitCaptureRanges

ExplicitObjectParameter

ParmVarDecl* clang::sema::LambdaScopeInfo::ExplicitObjectParameter = nullptr

ExplicitParams

bool clang::sema::LambdaScopeInfo::ExplicitParams = false

ExplicitTemplateParamsRange

SourceRange clang::sema::LambdaScopeInfo::ExplicitTemplateParamsRange

GLTemplateParameterList

IntroducerRange

SourceRange clang::sema::LambdaScopeInfo::IntroducerRange

Lambda

The class that describes the lambda.

Definition at line 871 of file ScopeInfo.h.

Referenced by clang::Sema::ActOnLambdaClosureParameters(), clang::Sema::ActOnLambdaClosureQualifiers(), clang::Sema::ActOnLambdaError(), clang::Sema::ActOnLambdaExpressionAfterIntroducer(), clang::Sema::ActOnStartOfLambdaDefinition(), adjustCVQualifiersForCXXThisWithinLambda(), clang::Sema::BuildLambdaExpr(), clang::Sema::buildLambdaScope(), clang::Sema::CompleteLambdaCallOperator(), clang::TreeTransform< Derived >::ComputeLambdaDependency(), clang::Sema::RebuildLambdaScopeInfo(), and clang::Sema::tryCaptureVariable().

Mutable

bool clang::sema::LambdaScopeInfo::Mutable = true

NonODRUsedCapturingExprs

llvm::SmallSet<Expr *, 8> clang::sema::LambdaScopeInfo::NonODRUsedCapturingExprs

NumExplicitCaptures

unsigned clang::sema::LambdaScopeInfo::NumExplicitCaptures = 0

PotentiallyCapturingExprs

Contains all variable-referring-expressions (i.e.

DeclRefExprs or MemberExprs) that refer to local variables in a generic lambda or a lambda in a potentially-evaluated-if-used context.

Potentially capturable variables of a nested lambda that might need to be captured by the lambda are housed here. This is specifically useful for generic lambdas or lambdas within a potentially evaluated-if-used context. If an enclosing variable is named in an expression of a lambda nested within a generic lambda, we don't always know whether the variable will truly be odr-used (i.e. need to be captured) by that nested lambda, until its instantiation. But we still need to capture it in the enclosing lambda if all intervening lambdas can capture the variable.

Definition at line 930 of file ScopeInfo.h.

Referenced by addPotentialCapture(), clearPotentialCaptures(), getNumPotentialVariableCaptures(), and removePotentialCapture().

PotentialThisCaptureLocation

SourceLocation clang::sema::LambdaScopeInfo::PotentialThisCaptureLocation

RequiresClause

ExprResult clang::sema::LambdaScopeInfo::RequiresClause

ShadowingDecls


The documentation for this class was generated from the following files: