clang
7.0.0
|
#include "clang/Sema/ScopeInfo.h"
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. More... | |
bool | isGenericLambda () const |
Is this scope known to be for a generic lambda? (This will be false until we parse the first 'auto'-typed parameter. More... | |
void | addPotentialCapture (Expr *VarExpr) |
Add a variable that might potentially be captured by the lambda and therefore the enclosing lambdas. More... | |
void | addPotentialThisCapture (SourceLocation Loc) |
bool | hasPotentialThisCapture () const |
void | markVariableExprAsNonODRUsed (Expr *CapturingVarExpr) |
Mark a variable's reference in a lambda as non-odr using. More... | |
bool | isVariableExprMarkedAsNonODRUsed (Expr *CapturingVarExpr) const |
void | removePotentialCapture (Expr *E) |
void | clearPotentialCaptures () |
unsigned | getNumPotentialVariableCaptures () const |
bool | hasPotentialCaptures () const |
void | getPotentialVariableCapture (unsigned Idx, VarDecl *&VD, Expr *&E) const |
![]() | |
CapturingScopeInfo (DiagnosticsEngine &Diag, ImplicitCaptureStyle Style) | |
void | addCapture (VarDecl *Var, bool isBlock, bool isByref, bool isNested, SourceLocation Loc, SourceLocation EllipsisLoc, QualType CaptureType, Expr *Cpy) |
void | addVLATypeCapture (SourceLocation Loc, QualType CaptureType) |
void | addThisCapture (bool isNested, SourceLocation Loc, Expr *Cpy, bool ByCopy) |
bool | isCXXThisCaptured () const |
Determine whether the C++ 'this' is captured. More... | |
Capture & | getCXXThisCapture () |
Retrieve the capture of C++ 'this', if it has been captured. More... | |
bool | isCaptured (VarDecl *Var) const |
Determine whether the given variable has been captured. More... | |
bool | isVLATypeCaptured (const VariableArrayType *VAT) const |
Determine whether the given variable-array type has been captured. More... | |
Capture & | getCapture (VarDecl *Var) |
Retrieve the capture of the given variable, if it has been captured already. More... | |
const Capture & | getCapture (VarDecl *Var) const |
![]() | |
FunctionScopeInfo (DiagnosticsEngine &Diag) | |
virtual | ~FunctionScopeInfo () |
template<typename ExprT > | |
void | recordUseOfWeak (const ExprT *E, bool IsRead=true) |
Record that a weak object was accessed. More... | |
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. More... | |
const WeakObjectUseMap & | getWeakObjectUses () const |
void | setHasBranchIntoScope () |
void | setHasBranchProtectedScope () |
void | setHasIndirectGoto () |
void | setHasDroppedStmt () |
void | setHasOMPDeclareReductionCombiner () |
void | setHasFallthroughStmt () |
void | setHasCXXTry (SourceLocation TryLoc) |
void | setHasSEHTry (SourceLocation TryLoc) |
bool | NeedsScopeChecking () const |
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. More... | |
Static Public Member Functions | |
static bool | classof (const FunctionScopeInfo *FSI) |
![]() | |
static bool | classof (const FunctionScopeInfo *FSI) |
Public Attributes | |
CXXRecordDecl * | Lambda = nullptr |
The class that describes the lambda. More... | |
CXXMethodDecl * | CallOperator = nullptr |
The lambda's compiler-generated operator() . More... | |
SourceRange | IntroducerRange |
Source range covering the lambda introducer [...]. More... | |
SourceLocation | CaptureDefaultLoc |
Source location of the '&' or '=' specifying the default capture type, if any. More... | |
unsigned | NumExplicitCaptures = 0 |
The number of captures in the Captures list that are explicit captures. More... | |
bool | Mutable = false |
Whether this is a mutable lambda. More... | |
bool | ExplicitParams = false |
Whether the (empty) parameter list is explicit. More... | |
CleanupInfo | Cleanup |
Whether any of the capture expressions requires cleanups. More... | |
bool | ContainsUnexpandedParameterPack = false |
Whether the lambda contains an unexpanded parameter pack. More... | |
unsigned | AutoTemplateParameterDepth = 0 |
If this is a generic lambda, use this as the depth of each 'auto' parameter, during initial AST construction. More... | |
SmallVector< TemplateTypeParmDecl *, 4 > | AutoTemplateParams |
Store the list of the auto parameters for a generic lambda. More... | |
TemplateParameterList * | GLTemplateParameterList = nullptr |
If this is a generic lambda, and the template parameter list has been created (from the AutoTemplateParams) then store a reference to it (cache it to avoid reconstructing it). More... | |
llvm::SmallVector< Expr *, 4 > | PotentiallyCapturingExprs |
Contains all variable-referring-expressions (i.e. More... | |
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). More... | |
llvm::DenseMap< unsigned, SourceRange > | ExplicitCaptureRanges |
A map of explicit capture indices to their introducer source ranges. More... | |
llvm::SmallVector< ShadowedOuterDecl, 4 > | ShadowingDecls |
SourceLocation | PotentialThisCaptureLocation |
![]() | |
ImplicitCaptureStyle | ImpCaptureStyle |
llvm::DenseMap< VarDecl *, unsigned > | CaptureMap |
CaptureMap - A map of captured variables to (index+1) into Captures. More... | |
unsigned | CXXThisCaptureIndex = 0 |
CXXThisCaptureIndex - The (index+1) of the capture of 'this'; zero if 'this' is not captured. More... | |
SmallVector< Capture, 4 > | Captures |
Captures - The captures. More... | |
bool | HasImplicitReturnType = false |
QualType | ReturnType |
ReturnType - The target type of return statements in this context, or null if unknown. More... | |
![]() | |
ScopeKind | Kind: 3 |
What kind of scope we are describing. More... | |
bool | HasBranchProtectedScope: 1 |
Whether this function contains a VLA, @try, try, C++ initializer, or anything else that can't be jumped past. More... | |
bool | HasBranchIntoScope: 1 |
Whether this function contains any switches or direct gotos. More... | |
bool | HasIndirectGoto: 1 |
Whether this function contains any indirect gotos. More... | |
bool | HasDroppedStmt: 1 |
Whether a statement was dropped because it was invalid. More... | |
bool | HasOMPDeclareReductionCombiner: 1 |
True if current scope is for OpenMP declare reduction combiner. More... | |
bool | HasFallthroughStmt: 1 |
Whether there is a fallthrough statement in this function. More... | |
bool | HasPotentialAvailabilityViolations: 1 |
Whether we make reference to a declaration that could be unavailable. More... | |
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)). More... | |
bool | ObjCIsDesignatedInit: 1 |
True when this is a method marked as a designated initializer. More... | |
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. More... | |
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. More... | |
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'. More... | |
bool | NeedsCoroutineSuspends: 1 |
True only when this function has not already built, or attempted to build, the initial and final coroutine suspend points. More... | |
unsigned char | FirstCoroutineStmtKind: 2 |
An enumeration represeting the kind of the first coroutine statement in the function. More... | |
SourceLocation | FirstCoroutineStmtLoc |
First coroutine statement in the current function. More... | |
SourceLocation | FirstReturnLoc |
First 'return' statement in the current function. More... | |
SourceLocation | FirstCXXTryLoc |
First C++ 'try' statement in the current function. More... | |
SourceLocation | FirstSEHTryLoc |
First SEH '__try' statement in the current function. More... | |
DiagnosticErrorTrap | ErrorTrap |
Used to determine if errors occurred in this function or block. More... | |
SmallVector< SwitchInfo, 8 > | SwitchStack |
SwitchStack - This is the current set of active switch statements in the block. More... | |
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. More... | |
VarDecl * | CoroutinePromise = nullptr |
The promise object for this coroutine, if any. More... | |
llvm::SmallMapVector< ParmVarDecl *, Stmt *, 4 > | CoroutineParameterMoves |
A mapping between the coroutine function parameters that were moved to the coroutine frame, and their move statements. More... | |
std::pair< Stmt *, Stmt * > | CoroutineSuspends |
The initial and final coroutine suspend points. More... | |
SmallVector< CompoundScopeInfo, 4 > | CompoundScopes |
The stack of currently active compound stamement scopes in the function. More... | |
SmallVector< PossiblyUnreachableDiag, 4 > | PossiblyUnreachableDiags |
A list of PartialDiagnostics created but delayed within the current function scope. More... | |
llvm::SmallPtrSet< const ParmVarDecl *, 8 > | ModifiedNonNullParams |
A list of parameters which have the nonnull attribute and are modified in the function. More... | |
Additional Inherited Members | |
![]() | |
enum | ImplicitCaptureStyle { ImpCap_None, ImpCap_LambdaByval, ImpCap_LambdaByref, ImpCap_Block, ImpCap_CapturedRegion } |
![]() | |
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). More... | |
using | WeakUseVector = SmallVector< WeakUseTy, 4 > |
Used to collect uses of a particular weak object in a function body. More... | |
using | WeakObjectUseMap = llvm::SmallDenseMap< WeakObjectProfileTy, WeakUseVector, 8, WeakObjectProfileTy::DenseMapInfo > |
Used to collect all uses of weak objects in a function body. More... | |
![]() | |
enum | ScopeKind { SK_Function, SK_Block, SK_Lambda, SK_CapturedRegion } |
![]() | |
CapturingScopeInfo (const CapturingScopeInfo &)=default | |
![]() | |
FunctionScopeInfo (const FunctionScopeInfo &)=default | |
Definition at line 768 of file ScopeInfo.h.
|
inline |
Definition at line 850 of file ScopeInfo.h.
|
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 887 of file ScopeInfo.h.
|
inline |
Definition at line 892 of file ScopeInfo.h.
Referenced by tryImplicitlyCaptureThisIfImplicitMemberFunctionAccessWithDependentArgs().
|
inlinestatic |
Definition at line 860 of file ScopeInfo.h.
References clang::sema::FunctionScopeInfo::Kind.
|
inline |
Definition at line 955 of file ScopeInfo.h.
|
inline |
Note when all explicit captures have been added.
Definition at line 856 of file ScopeInfo.h.
Referenced by clang::Sema::finishLambdaExplicitCaptures().
|
inline |
Definition at line 959 of file ScopeInfo.h.
Referenced by CheckIfAnyEnclosingLambdasMustCaptureAnyPotentialCaptures().
Definition at line 233 of file ScopeInfo.cpp.
|
inline |
Definition at line 963 of file ScopeInfo.h.
References clang::SourceLocation::isValid().
|
inline |
Definition at line 896 of file ScopeInfo.h.
References clang::SourceLocation::isValid().
|
inline |
Is this scope known to be for a generic lambda? (This will be false until we parse the first 'auto'-typed parameter.
Definition at line 866 of file ScopeInfo.h.
|
inline |
Definition at line 944 of file ScopeInfo.h.
|
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 939 of file ScopeInfo.h.
|
inline |
Definition at line 949 of file ScopeInfo.h.
unsigned clang::sema::LambdaScopeInfo::AutoTemplateParameterDepth = 0 |
If this is a generic lambda, use this as the depth of each 'auto' parameter, during initial AST construction.
Definition at line 801 of file ScopeInfo.h.
Referenced by GetDeclSpecTypeForDeclarator().
SmallVector<TemplateTypeParmDecl*, 4> clang::sema::LambdaScopeInfo::AutoTemplateParams |
Store the list of the auto parameters for a generic lambda.
If this is a generic lambda, store the list of the auto parameters converted into TemplateTypeParmDecls into a vector that can be used to construct the generic lambda's template parameter list, during initial AST construction.
Definition at line 808 of file ScopeInfo.h.
Referenced by GetDeclSpecTypeForDeclarator(), and getGenericLambdaTemplateParameterList().
CXXMethodDecl* clang::sema::LambdaScopeInfo::CallOperator = nullptr |
The lambda's compiler-generated operator()
.
Definition at line 774 of file ScopeInfo.h.
Referenced by clang::Sema::ActOnCapScopeReturnStmt(), clang::Sema::ActOnLambdaExpr(), clang::Sema::BuildLambdaExpr(), clang::Sema::buildLambdaScope(), clang::Sema::CheckCXXThisCapture(), and CheckIfAnyEnclosingLambdasMustCaptureAnyPotentialCaptures().
SourceLocation clang::sema::LambdaScopeInfo::CaptureDefaultLoc |
Source location of the '&' or '=' specifying the default capture type, if any.
Definition at line 781 of file ScopeInfo.h.
Referenced by clang::Sema::BuildLambdaExpr(), and clang::Sema::buildLambdaScope().
CleanupInfo clang::sema::LambdaScopeInfo::Cleanup |
Whether any of the capture expressions requires cleanups.
Definition at line 794 of file ScopeInfo.h.
Referenced by clang::Sema::BuildLambdaExpr().
Whether the lambda contains an unexpanded parameter pack.
Definition at line 797 of file ScopeInfo.h.
Referenced by clang::Sema::BuildLambdaExpr().
llvm::DenseMap<unsigned, SourceRange> clang::sema::LambdaScopeInfo::ExplicitCaptureRanges |
A map of explicit capture indices to their introducer source ranges.
Definition at line 837 of file ScopeInfo.h.
Whether the (empty) parameter list is explicit.
Definition at line 791 of file ScopeInfo.h.
Referenced by clang::Sema::BuildLambdaExpr(), and clang::Sema::buildLambdaScope().
TemplateParameterList* clang::sema::LambdaScopeInfo::GLTemplateParameterList = nullptr |
If this is a generic lambda, and the template parameter list has been created (from the AutoTemplateParams) then store a reference to it (cache it to avoid reconstructing it).
Definition at line 813 of file ScopeInfo.h.
Referenced by getGenericLambdaTemplateParameterList().
SourceRange clang::sema::LambdaScopeInfo::IntroducerRange |
Source range covering the lambda introducer [...].
Definition at line 777 of file ScopeInfo.h.
Referenced by clang::Sema::BuildLambdaExpr(), clang::Sema::buildLambdaScope(), and getGenericLambdaTemplateParameterList().
CXXRecordDecl* clang::sema::LambdaScopeInfo::Lambda = nullptr |
The class that describes the lambda.
Definition at line 771 of file ScopeInfo.h.
Referenced by clang::Sema::ActOnLambdaError(), clang::Sema::BuildLambdaExpr(), clang::Sema::buildLambdaScope(), and clang::Sema::tryCaptureVariable().
Whether this is a mutable lambda.
Definition at line 788 of file ScopeInfo.h.
Referenced by clang::Sema::buildLambdaScope().
llvm::SmallSet<Expr *, 8> clang::sema::LambdaScopeInfo::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).
Definition at line 834 of file ScopeInfo.h.
unsigned clang::sema::LambdaScopeInfo::NumExplicitCaptures = 0 |
The number of captures in the Captures
list that are explicit captures.
Definition at line 785 of file ScopeInfo.h.
llvm::SmallVector<Expr*, 4> clang::sema::LambdaScopeInfo::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 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 828 of file ScopeInfo.h.
SourceLocation clang::sema::LambdaScopeInfo::PotentialThisCaptureLocation |
Definition at line 848 of file ScopeInfo.h.
llvm::SmallVector<ShadowedOuterDecl, 4> clang::sema::LambdaScopeInfo::ShadowingDecls |
Definition at line 846 of file ScopeInfo.h.
Referenced by clang::Sema::DiagnoseShadowingLambdaDecls().