clang API Documentation
#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"
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. VarToCapture ). If successful, returns the index into Sema's FunctionScopeInfo stack of the capture-ready lambda's LambdaScopeInfo. | |
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. | |
static EnumDecl * | findEnumForBlockReturn (Expr *E) |
static EnumDecl * | findEnumForBlockReturn (ReturnStmt *ret) |
static EnumDecl * | findCommonEnumForBlockReturns (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. |
static void addBlockPointerConversion | ( | Sema & | S, |
SourceRange | IntroducerRange, | ||
CXXRecordDecl * | Class, | ||
CXXMethodDecl * | CallOperator | ||
) | [static] |
Add a lambda's conversion to block pointer.
Definition at line 1334 of file SemaLambda.cpp.
References clang::DeclContext::addDecl(), clang::AS_public, clang::Qualifiers::Const, clang::Sema::Context, clang::CXXConversionDecl::Create(), clang::ASTContext::DeclarationNames, clang::Type::getAs(), clang::SourceRange::getBegin(), clang::ASTContext::getBlockPointerType(), clang::FunctionDecl::getBody(), clang::ASTContext::getCanonicalType(), clang::DeclarationNameTable::getCXXConversionFunctionName(), clang::ASTContext::getDefaultCallingConvention(), clang::FunctionProtoType::getExtProtoInfo(), clang::ASTContext::getFunctionType(), clang::Stmt::getLocEnd(), clang::FunctionProtoType::getParamTypes(), clang::FunctionType::getReturnType(), clang::ASTContext::getTrivialTypeSourceInfo(), clang::ValueDecl::getType(), clang::DeclarationNameLoc::NamedType, clang::Decl::setAccess(), clang::Decl::setImplicit(), clang::DeclarationNameLoc::NT::TInfo, and clang::FunctionProtoType::ExtProtoInfo::TypeQuals.
Referenced by clang::Sema::ActOnLambdaExpr().
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] |
Adjust the given return statements so that they formally return the given type. It should require, at most, an IntegralCast.
Definition at line 589 of file SemaLambda.cpp.
References clang::CK_IntegralCast, clang::Sema::Context, clang::ImplicitCastExpr::Create(), clang::ReturnStmt::getRetValue(), clang::Expr::getType(), clang::ASTContext::hasSameType(), clang::Type::isIntegralOrUnscopedEnumerationType(), clang::ReturnStmt::setRetValue(), and clang::VK_RValue.
Referenced by clang::Sema::deduceClosureReturnType().
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] |
Definition at line 225 of file SemaLambda.cpp.
References clang::sema::LambdaScopeInfo::AutoTemplateParams, clang::Sema::Context, clang::TemplateParameterList::Create(), clang::SourceRange::getBegin(), clang::SourceRange::getEnd(), clang::sema::LambdaScopeInfo::GLTemplateParameterList, and clang::sema::LambdaScopeInfo::IntroducerRange.
Referenced by clang::Sema::ActOnStartOfLambdaDefinition(), clang::Sema::createLambdaClosureType(), and clang::Sema::startLambdaDefinition().
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:
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.
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'. |
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().