clang API Documentation

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< unsignedgetStackIndexOfNearestEnclosingCaptureReadyLambda (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. VarToCapture). If successful, returns the index into Sema's FunctionScopeInfo stack of the capture-ready lambda's LambdaScopeInfo.
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.
static EnumDeclfindEnumForBlockReturn (Expr *E)
static EnumDeclfindEnumForBlockReturn (ReturnStmt *ret)
static EnumDeclfindCommonEnumForBlockReturns (ArrayRef< ReturnStmt * > returns)
static void adjustBlockReturnsToEnum (Sema &S, ArrayRef< ReturnStmt * > returns, QualType returnType)
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.
static void addBlockPointerConversion (Sema &S, SourceRange IntroducerRange, CXXRecordDecl *Class, CXXMethodDecl *CallOperator)
 Add a lambda's conversion to block pointer.

Function Documentation

static void addBlockPointerConversion ( Sema S,
SourceRange  IntroducerRange,
CXXRecordDecl Class,
CXXMethodDecl CallOperator 
) [static]
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 1158 of file SemaLambda.cpp.

References clang::DeclContext::addDecl(), clang::AS_private, clang::AS_public, clang::Qualifiers::Const, clang::Sema::Context, clang::FunctionTemplateDecl::Create(), clang::ParmVarDecl::Create(), clang::CXXMethodDecl::Create(), clang::CXXConversionDecl::Create(), clang::ASTContext::DeclarationNames, clang::FunctionProtoType::ExtProtoInfo::ExtInfo, clang::IdentifierTable::get(), clang::TypeLoc::getAs(), clang::Type::getAs(), clang::SourceRange::getBegin(), clang::FunctionDecl::getBody(), clang::ASTContext::getCanonicalType(), clang::DeclarationNameTable::getCXXConversionFunctionName(), clang::ASTContext::getDefaultCallingConvention(), clang::FunctionDecl::getDescribedFunctionTemplate(), clang::FunctionProtoType::getExtProtoInfo(), clang::ASTContext::getFunctionType(), clang::NamedDecl::getIdentifier(), clang::getLambdaStaticInvokerName(), clang::Decl::getLocation(), clang::Stmt::getLocEnd(), clang::DeclaratorDecl::getLocStart(), clang::FunctionDecl::getNumParams(), clang::FunctionDecl::getParamDecl(), clang::FunctionProtoType::getParamTypes(), clang::ASTContext::getPointerType(), clang::FunctionTypeLoc::getReturnLoc(), clang::FunctionType::getReturnType(), clang::VarDecl::getStorageClass(), clang::TemplateDecl::getTemplateParameters(), clang::ASTContext::getTranslationUnitDecl(), clang::ASTContext::getTrivialTypeSourceInfo(), clang::ValueDecl::getType(), clang::TypeSourceInfo::getTypeLoc(), clang::DeclaratorDecl::getTypeSourceInfo(), clang::ASTContext::Idents, clang::CXXRecordDecl::isGenericLambda(), clang::FunctionProtoType::isVariadic(), clang::DeclarationNameLoc::NamedType, clang::FunctionProtoType::ExtProtoInfo::RefQualifier, clang::RQ_None, clang::SC_Static, clang::Decl::setAccess(), clang::FunctionDecl::setDescribedFunctionTemplate(), clang::Decl::setImplicit(), clang::FunctionDecl::setParams(), clang::DeclarationNameLoc::NT::TInfo, clang::FunctionProtoType::ExtProtoInfo::TypeQuals, and clang::FunctionType::ExtInfo::withCallingConv().

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

static void adjustBlockReturnsToEnum ( Sema S,
ArrayRef< ReturnStmt * >  returns,
QualType  returnType 
) [static]
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 568 of file SemaLambda.cpp.

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

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

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

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

Referenced by findCommonEnumForBlockReturns(), and findEnumForBlockReturn().

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

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

static TemplateParameterList* getGenericLambdaTemplateParameterList ( LambdaScopeInfo LSI,
Sema SemaRef 
) [inline, static]
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().

Referenced by clang::getStackIndexOfNearestEnclosingCaptureCapableLambda().

static bool isInInlineFunction ( const DeclContext DC) [static]

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

Definition at line 264 of file SemaLambda.cpp.

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

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