clang  6.0.0svn
Functions
SemaLambda.cpp File Reference
#include "clang/Sema/DeclSpec.h"
#include "TypeLocBuilder.h"
#include "clang/AST/ASTLambda.h"
#include "clang/AST/ExprCXX.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Sema/Initialization.h"
#include "clang/Sema/Lookup.h"
#include "clang/Sema/Scope.h"
#include "clang/Sema/ScopeInfo.h"
#include "clang/Sema/SemaInternal.h"
#include "clang/Sema/SemaLambda.h"
Include dependency graph for SemaLambda.cpp:

Go to the source code of this file.

Functions

static Optional< unsigned > getStackIndexOfNearestEnclosingCaptureReadyLambda (ArrayRef< const clang::sema::FunctionScopeInfo *> FunctionScopes, VarDecl *VarToCapture)
 Examines the FunctionScopeInfo stack to determine the nearest enclosing lambda (to the current lambda) that is 'capture-ready' for the variable referenced in the current lambda (i.e. More...
 
static TemplateParameterListgetGenericLambdaTemplateParameterList (LambdaScopeInfo *LSI, Sema &SemaRef)
 
static bool isInInlineFunction (const DeclContext *DC)
 Determine whether the given context is or is enclosed in an inline function. More...
 
static EnumDeclfindEnumForBlockReturn (Expr *E)
 If this expression is an enumerator-like expression of some type T, return the type T; otherwise, return null. More...
 
static EnumDeclfindEnumForBlockReturn (ReturnStmt *ret)
 Attempt to find a type T for which the returned expression of the given statement is an enumerator-like expression of that type. More...
 
static EnumDeclfindCommonEnumForBlockReturns (ArrayRef< ReturnStmt *> returns)
 Attempt to find a common type T for which all of the returned expressions in a block are enumerator-like expressions of that type. More...
 
static void adjustBlockReturnsToEnum (Sema &S, ArrayRef< ReturnStmt *> returns, QualType returnType)
 Adjust the given return statements so that they formally return the given type. More...
 
static void addFunctionPointerConversion (Sema &S, SourceRange IntroducerRange, CXXRecordDecl *Class, CXXMethodDecl *CallOperator)
 Add a lambda's conversion to function pointer, as described in C++11 [expr.prim.lambda]p6. More...
 
static void addBlockPointerConversion (Sema &S, SourceRange IntroducerRange, CXXRecordDecl *Class, CXXMethodDecl *CallOperator)
 Add a lambda's conversion to block pointer. More...
 
static ExprResult performLambdaVarCaptureInitialization (Sema &S, const LambdaScopeInfo::Capture &Capture, FieldDecl *Field)
 
static LambdaCaptureDefault mapImplicitCaptureStyle (CapturingScopeInfo::ImplicitCaptureStyle ICS)
 

Function Documentation

◆ addBlockPointerConversion()

static void addBlockPointerConversion ( Sema S,
SourceRange  IntroducerRange,
CXXRecordDecl Class,
CXXMethodDecl CallOperator 
)
static

Add a lambda's conversion to block pointer.

Definition at line 1356 of file SemaLambda.cpp.

◆ addFunctionPointerConversion()

static void addFunctionPointerConversion ( Sema S,
SourceRange  IntroducerRange,
CXXRecordDecl Class,
CXXMethodDecl CallOperator 
)
static

Add a lambda's conversion to function pointer, as described in C++11 [expr.prim.lambda]p6.

Definition at line 1172 of file SemaLambda.cpp.

◆ adjustBlockReturnsToEnum()

static void adjustBlockReturnsToEnum ( Sema S,
ArrayRef< ReturnStmt *>  returns,
QualType  returnType 
)
static

Adjust the given return statements so that they formally return the given type.

It should require, at most, an IntegralCast.

Definition at line 611 of file SemaLambda.cpp.

◆ findCommonEnumForBlockReturns()

static EnumDecl* findCommonEnumForBlockReturns ( ArrayRef< ReturnStmt *>  returns)
static

Attempt to find a common type T for which all of the returned expressions in a block are enumerator-like expressions of that type.

Definition at line 590 of file SemaLambda.cpp.

References findEnumForBlockReturn(), and clang::TagDecl::hasNameForLinkage().

Referenced by clang::Sema::deduceClosureReturnType().

◆ findEnumForBlockReturn() [1/2]

static EnumDecl* findEnumForBlockReturn ( Expr E)
static

If this expression is an enumerator-like expression of some type T, return the type T; otherwise, return null.

Pointer comparisons on the result here should always work because it's derived from either the parent of an EnumConstantDecl (i.e. the definition) or the declaration returned by EnumType::getDecl() (i.e. the definition).

Definition at line 518 of file SemaLambda.cpp.

Referenced by findCommonEnumForBlockReturns(), and findEnumForBlockReturn().

◆ findEnumForBlockReturn() [2/2]

static EnumDecl* findEnumForBlockReturn ( ReturnStmt ret)
static

Attempt to find a type T for which the returned expression of the given statement is an enumerator-like expression of that type.

Definition at line 581 of file SemaLambda.cpp.

References findEnumForBlockReturn(), and clang::ReturnStmt::getRetValue().

◆ getGenericLambdaTemplateParameterList()

static TemplateParameterList* getGenericLambdaTemplateParameterList ( LambdaScopeInfo LSI,
Sema SemaRef 
)
inlinestatic

◆ getStackIndexOfNearestEnclosingCaptureReadyLambda()

static Optional<unsigned> getStackIndexOfNearestEnclosingCaptureReadyLambda ( ArrayRef< const clang::sema::FunctionScopeInfo *>  FunctionScopes,
VarDecl VarToCapture 
)
inlinestatic

Examines the FunctionScopeInfo stack to determine the nearest enclosing lambda (to the current lambda) that is 'capture-ready' for the variable referenced in the current lambda (i.e.

VarToCapture). If successful, returns the index into Sema's FunctionScopeInfo stack of the capture-ready lambda's LambdaScopeInfo.

Climbs down the stack of lambdas (deepest nested lambda - i.e. current lambda - is on top) to determine the index of the nearest enclosing/outer lambda that is ready to capture the VarToCapture being referenced in the current lambda. As we climb down the stack, we want the index of the first such lambda - that is the lambda with the highest index that is 'capture-ready'.

A lambda 'L' is capture-ready for 'V' (var or this) if:

  • its enclosing context is non-dependent
  • and if the chain of lambdas between L and the lambda in which V is potentially used (i.e. the lambda at the top of the scope info stack), can all capture or have already captured V. If VarToCapture is 'null' then we are trying to capture 'this'.

Note that a lambda that is deemed 'capture-ready' still needs to be checked for whether it is 'capture-capable' (see getStackIndexOfNearestEnclosingCaptureCapableLambda), before it can truly capture.

Parameters
FunctionScopes- Sema's stack of nested FunctionScopeInfo's (which a LambdaScopeInfo inherits from). The current/deepest/innermost lambda is at the top of the stack and has the highest index.
VarToCapture- the variable to capture. If NULL, capture 'this'.
Returns
An Optional<unsigned> Index that if evaluates to 'true' contains the index (into Sema's FunctionScopeInfo stack) of the innermost lambda which is capture-ready. If the return value evaluates to 'false' then no lambda is capture-ready for VarToCapture.

Definition at line 63 of file SemaLambda.cpp.

References clang::DeclContext::Equals(), clang::Decl::getDeclContext(), clang::getLambdaAwareParentOfDeclContext(), clang::sema::CapturingScopeInfo::ImpCap_None, clang::sema::CapturingScopeInfo::ImpCaptureStyle, clang::sema::CapturingScopeInfo::isCaptured(), clang::sema::CapturingScopeInfo::isCXXThisCaptured(), clang::DeclContext::isDependentContext(), clang::isLambdaCallOperator(), and clang::DeclContext::isTranslationUnit().

◆ isInInlineFunction()

static bool isInInlineFunction ( const DeclContext DC)
static

Determine whether the given context is or is enclosed in an inline function.

Definition at line 268 of file SemaLambda.cpp.

References clang::DeclContext::getLexicalParent(), and clang::DeclContext::isFileContext().

Referenced by clang::Sema::getCurrentMangleNumberContext().

◆ mapImplicitCaptureStyle()

static LambdaCaptureDefault mapImplicitCaptureStyle ( CapturingScopeInfo::ImplicitCaptureStyle  ICS)
static

◆ performLambdaVarCaptureInitialization()

static ExprResult performLambdaVarCaptureInitialization ( Sema S,
const LambdaScopeInfo::Capture &  Capture,
FieldDecl Field 
)
static

Definition at line 1400 of file SemaLambda.cpp.