clang 10.0.0git

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 "llvm/ADT/STLExtras.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 TemplateParameterList * | getGenericLambdaTemplateParameterList (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 EnumDecl * | findEnumForBlockReturn (Expr *E)
| If this expression is an enumerator-like expression of some type T, return the type T; otherwise, return null. More...
static EnumDecl * | findEnumForBlockReturn (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 EnumDecl * | findCommonEnumForBlockReturns (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 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 1443 of file SemaLambda.cpp.

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

## ◆ 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 1283 of file SemaLambda.cpp.

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

## ◆ 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 667 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 646 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 574 of file SemaLambda.cpp.

References clang::Type::getAs(), clang::Expr::getType(), and clang::Expr::IgnoreParens().

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 637 of file SemaLambda.cpp.

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

## ◆ getGenericLambdaTemplateParameterList()

static TemplateParameterList* getGenericLambdaTemplateParameterList | ( | LambdaScopeInfo * | LSI,
|  | Sema & | SemaRef
| ) |  |
| inline static

Definition at line 228 of file SemaLambda.cpp.

References clang::Sema::Context, clang::TemplateParameterList::Create(), clang::sema::LambdaScopeInfo::ExplicitTemplateParamsRange, clang::SourceRange::getBegin(), clang::SourceRange::getEnd(), clang::sema::LambdaScopeInfo::GLTemplateParameterList, and clang::InventedTemplateParameterInfo::TemplateParams.

Referenced by clang::Sema::createLambdaClosureType(), clang::CXXRecordDecl::isLambda(), and clang::Sema::startLambdaDefinition().

## ◆ getStackIndexOfNearestEnclosingCaptureReadyLambda()

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

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 263 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

Definition at line 1546 of file SemaLambda.cpp.

References clang::sema::CapturingScopeInfo::ImpCap_Block, clang::sema::CapturingScopeInfo::ImpCap_CapturedRegion, clang::sema::CapturingScopeInfo::ImpCap_LambdaByref, clang::sema::CapturingScopeInfo::ImpCap_LambdaByval, clang::sema::CapturingScopeInfo::ImpCap_None, clang::LCD_ByCopy, clang::LCD_ByRef, and clang::LCD_None.

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