clang: lib/Sema/SemaCoroutine.cpp File Reference (original) (raw)

Go to the source code of this file.

Functions
static LookupResult lookupMember (Sema &S, const char *Name, CXXRecordDecl *RD, SourceLocation Loc, bool &Res)
static bool lookupMember (Sema &S, const char *Name, CXXRecordDecl *RD, SourceLocation Loc)
static QualType lookupPromiseType (Sema &S, const FunctionDecl *FD, SourceLocation KwLoc)
Look up the std::coroutine_traits<...>::promise_type for the given function type.
static QualType lookupCoroutineHandleType (Sema &S, QualType PromiseType, SourceLocation Loc)
Look up the std::coroutine_handle.
static bool isValidCoroutineContext (Sema &S, SourceLocation Loc, StringRef Keyword)
static ExprResult buildOperatorCoawaitCall (Sema &SemaRef, Scope *S, SourceLocation Loc, Expr *E)
static ExprResult buildCoroutineHandle (Sema &S, QualType PromiseType, SourceLocation Loc)
static ExprResult buildMemberCall (Sema &S, Expr *Base, SourceLocation Loc, StringRef Name, MultiExprArg Args)
static Expr * maybeTailCall (Sema &S, QualType RetType, Expr *E, SourceLocation Loc)
static ReadySuspendResumeResult buildCoawaitCalls (Sema &S, VarDecl *CoroPromise, SourceLocation Loc, Expr *E)
Build calls to await_ready, await_suspend, and await_resume for a co_await expression.
static ExprResult buildPromiseCall (Sema &S, VarDecl *Promise, SourceLocation Loc, StringRef Name, MultiExprArg Args)
static FunctionScopeInfo * checkCoroutineContext (Sema &S, SourceLocation Loc, StringRef Keyword, bool IsImplicit=false)
Check that this is a context in which a coroutine suspension can appear.
static void checkNoThrow (Sema &S, const Stmt *E, llvm::SmallPtrSetImpl< const Decl * > &ThrowingDecls)
Recursively check E and all its children to see if any call target (including constructor call) is declared noexcept.
static void checkReturnStmtInCoroutine (Sema &S, FunctionScopeInfo *FSI)
static bool isWithinCatchScope (Scope *S)
static bool checkSuspensionContext (Sema &S, SourceLocation Loc, StringRef Keyword)
static bool isAttributedCoroAwaitElidable (const QualType &QT)
static void applySafeElideContext (Expr *Operand)
static Expr * buildStdNoThrowDeclRef (Sema &S, SourceLocation Loc)
Look up the std::nothrow object.
static TypeSourceInfo * getTypeSourceInfoForStdAlignValT (Sema &S, SourceLocation Loc)
static bool findDeleteForPromise (Sema &S, SourceLocation Loc, QualType PromiseType, FunctionDecl *&OperatorDelete)
static CompoundStmt * buildCoroutineBody (Stmt *Body, ASTContext &Context)
static bool diagReturnOnAllocFailure (Sema &S, Expr *E, CXXRecordDecl *PromiseRecordDecl, FunctionScopeInfo &Fn)
static bool collectPlacementArgs (Sema &S, FunctionDecl &FD, SourceLocation Loc, SmallVectorImpl< Expr * > &PlacementArgs)
static void noteMemberDeclaredHere (Sema &S, Expr *E, FunctionScopeInfo &Fn)
static Expr * castForMoving (Sema &S, Expr *E, QualType T=QualType())
static VarDecl * buildVarDecl (Sema &S, SourceLocation Loc, QualType Type, IdentifierInfo *II)
Build a variable declaration for move parameter.

applySafeElideContext()

static void applySafeElideContext ( Expr * Operand) static

buildCoawaitCalls()

Build calls to await_ready, await_suspend, and await_resume for a co_await expression.

The generated AST tries to clean up temporary objects as early as possible so that they don't live across suspension points if possible. Having temporary objects living across suspension points unnecessarily can lead to large frame size, and also lead to memory corruptions if the coroutine frame is destroyed after coming back from suspension. This is done by wrapping both the await_ready call and the await_suspend call with ExprWithCleanups. In the end of this function, we also need to explicitly set cleanup state so that the CoawaitExpr is also wrapped with an ExprWithCleanups to clean up the awaiter associated with the co_await expression.

Definition at line 371 of file SemaCoroutine.cpp.

References buildCoroutineHandle(), buildMemberCall(), clang::Sema::Cleanup, clang::Sema::Context, clang::SemaBase::Diag(), E, clang::Func, clang::ActionResult< PtrTy, Compress >::get(), clang::DeclaratorDecl::getBeginLoc(), clang::CallExpr::getCalleeDecl(), clang::CallExpr::getCallReturnType(), clang::CallExpr::getDirectCallee(), clang::Decl::getLocation(), clang::Expr::getObjectKind(), clang::Stmt::getSourceRange(), clang::ValueDecl::getType(), clang::Expr::getType(), clang::Type::isBooleanType(), clang::Type::isDependentType(), clang::ActionResult< PtrTy, Compress >::isInvalid(), ReadySuspendResumeResult::IsInvalid, clang::Type::isReferenceType(), clang::Type::isVoidType(), Loc, clang::Sema::MaybeCreateExprWithCleanups(), maybeTailCall(), clang::Sema::PerformContextuallyConvertToBool(), clang::Result, ReadySuspendResumeResult::Results, clang::CleanupInfo::setExprNeedsCleanups(), and clang::VK_LValue.

Referenced by clang::Sema::BuildCoyieldExpr(), and clang::Sema::BuildResolvedCoawaitExpr().

buildCoroutineBody()

buildCoroutineHandle()

Definition at line 266 of file SemaCoroutine.cpp.

References clang::Sema::BuildBuiltinCallExpr(), clang::Sema::BuildCallExpr(), clang::Sema::BuildDeclarationNameExpr(), clang::Sema::computeDeclContext(), clang::SemaBase::Diag(), clang::ExprError(), clang::Found, clang::ActionResult< PtrTy, Compress >::get(), clang::IdentifierTable::get(), clang::Preprocessor::getIdentifierTable(), clang::ActionResult< PtrTy, Compress >::isInvalid(), clang::QualType::isNull(), Loc, lookupCoroutineHandleType(), clang::Sema::LookupOrdinaryName, clang::Sema::LookupQualifiedName(), and clang::Sema::PP.

Referenced by buildCoawaitCalls().

buildMemberCall()

Definition at line 300 of file SemaCoroutine.cpp.

References clang::Sema::BuildCallExpr(), clang::Sema::BuildMemberReferenceExpr(), clang::Sema::clearDelayedTypo(), clang::SemaBase::Diag(), clang::ExprError(), clang::IdentifierTable::get(), clang::Preprocessor::getIdentifierTable(), clang::DeclarationNameInfo::getName(), Loc, clang::Sema::PP, and clang::Result.

Referenced by buildCoawaitCalls(), buildPromiseCall(), and maybeTailCall().

buildOperatorCoawaitCall()

buildPromiseCall()

Definition at line 463 of file SemaCoroutine.cpp.

References clang::Sema::BuildDeclRefExpr(), buildMemberCall(), clang::ExprError(), clang::ActionResult< PtrTy, Compress >::get(), clang::QualType::getNonReferenceType(), clang::ValueDecl::getType(), clang::ActionResult< PtrTy, Compress >::isInvalid(), Loc, and clang::VK_LValue.

Referenced by clang::Sema::ActOnCoroutineBodyStart(), clang::Sema::ActOnCoyieldExpr(), clang::Sema::BuildCoreturnStmt(), and clang::Sema::BuildUnresolvedCoawaitExpr().

buildStdNoThrowDeclRef()

Look up the std::nothrow object.

Definition at line 1062 of file SemaCoroutine.cpp.

References clang::Sema::BuildDeclRefExpr(), clang::SemaBase::Diag(), clang::Found, clang::ActionResult< PtrTy, Compress >::get(), clang::IdentifierTable::get(), clang::Preprocessor::getIdentifierTable(), clang::Sema::getStdNamespace(), clang::ActionResult< PtrTy, Compress >::isInvalid(), Loc, clang::Sema::LookupOrdinaryName, clang::Sema::LookupQualifiedName(), clang::Sema::PP, clang::Result, Std, and clang::VK_LValue.

buildVarDecl()

Build a variable declaration for move parameter.

Definition at line 1896 of file SemaCoroutine.cpp.

References clang::Sema::Context, clang::VarDecl::Create(), clang::Sema::CurContext, clang::ASTContext::getTrivialTypeSourceInfo(), Loc, clang::SC_None, and clang::Decl::setImplicit().

Referenced by actOnOMPReductionKindClause(), clang::SemaOpenMP::ActOnOpenMPCopyinClause(), clang::SemaOpenMP::ActOnOpenMPCopyprivateClause(), clang::SemaOpenMP::ActOnOpenMPDeclareReductionCombinerStart(), clang::SemaOpenMP::ActOnOpenMPDeclareReductionInitializerStart(), clang::SemaOpenMP::ActOnOpenMPFirstprivateClause(), clang::SemaOpenMP::ActOnOpenMPLastprivateClause(), clang::SemaOpenMP::ActOnOpenMPLinearClause(), clang::SemaOpenMP::ActOnOpenMPPrivateClause(), clang::SemaOpenMP::ActOnOpenMPReverseDirective(), clang::SemaOpenMP::ActOnOpenMPTileDirective(), clang::SemaOpenMP::ActOnOpenMPUnrollDirective(), clang::SemaOpenMP::ActOnOpenMPUseDevicePtrClause(), clang::Sema::buildCoroutineParameterMoves(), buildImplicitMap(), checkOpenMPLoop(), clang::SemaOpenMP::EndOpenMPDSABlock(), and precomputeExpr().

castForMoving()

Definition at line 1880 of file SemaCoroutine.cpp.

References clang::Sema::BuildCXXNamedCast(), clang::Sema::BuildReferenceType(), clang::Sema::Context, E, clang::ActionResult< PtrTy, Compress >::get(), clang::Stmt::getBeginLoc(), clang::Stmt::getSourceRange(), clang::ASTContext::getTrivialTypeSourceInfo(), clang::Expr::getType(), and clang::T.

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

checkCoroutineContext()

checkNoThrow()

static void checkNoThrow ( Sema & S, const Stmt * E, llvm::SmallPtrSetImpl< const Decl * > & ThrowingDecls ) static

Recursively check E and all its children to see if any call target (including constructor call) is declared noexcept.

Also any value returned from the call has a noexcept destructor.

Definition at line 610 of file SemaCoroutine.cpp.

References clang::Sema::canCalleeThrow(), checkNoThrow(), clang::Stmt::children(), clang::Sema::CurContext, D, clang::SemaBase::Diag(), clang::QualType::DK_cxx_destructor, E, clang::Sema::getASTContext(), clang::QualType::getCanonicalType(), clang::CXXRecordDecl::getDestructor(), clang::CXXMethodDecl::getParent(), clang::QualType::getTypePtr(), clang::QualType::isDestructedType(), and clang::T.

Referenced by clang::Sema::checkFinalSuspendNoThrow(), and checkNoThrow().

checkReturnStmtInCoroutine()

checkSuspensionContext()

collectPlacementArgs()

Definition at line 1330 of file SemaCoroutine.cpp.

References clang::Sema::ActOnCXXThis(), clang::Sema::BuildDeclRefExpr(), clang::Sema::CreateBuiltinUnaryOp(), clang::ActionResult< PtrTy, Compress >::get(), clang::ActionResult< PtrTy, Compress >::isInvalid(), clang::isLambdaCallOperator(), Loc, clang::FunctionDecl::parameters(), and clang::VK_LValue.

diagReturnOnAllocFailure()

findDeleteForPromise()

getTypeSourceInfoForStdAlignValT()

isAttributedCoroAwaitElidable()

static bool isAttributedCoroAwaitElidable ( const QualType & QT) static

isValidCoroutineContext()

isWithinCatchScope()

static bool isWithinCatchScope ( Scope * S) static

lookupCoroutineHandleType()

Look up the std::coroutine_handle.

Definition at line 139 of file SemaCoroutine.cpp.

References clang::TemplateArgumentListInfo::addArgument(), clang::Sema::CheckTemplateIdType(), clang::Sema::Context, clang::SemaBase::Diag(), clang::Found, clang::IdentifierTable::get(), clang::Preprocessor::getIdentifierTable(), clang::Sema::getStdNamespace(), clang::ASTContext::getTrivialTypeSourceInfo(), clang::QualType::isNull(), Loc, clang::Sema::LookupOrdinaryName, clang::Sema::LookupQualifiedName(), clang::Sema::PP, and clang::Sema::RequireCompleteType().

Referenced by buildCoroutineHandle().

lookupMember() [1/2]

lookupMember() [2/2]

lookupPromiseType()

Look up the std::coroutine_traits<...>::promise_type for the given function type.

Definition at line 52 of file SemaCoroutine.cpp.

References clang::TemplateArgumentListInfo::addArgument(), clang::Type::castAs(), clang::Sema::CheckTemplateIdType(), clang::Sema::Context, clang::NestedNameSpecifier::Create(), clang::SemaBase::Diag(), clang::IdentifierTable::get(), clang::Type::getAsCXXRecordDecl(), clang::LookupResult::getAsSingle(), clang::ASTContext::getElaboratedType(), clang::Preprocessor::getIdentifierTable(), clang::Decl::getLocation(), clang::ASTContext::getLValueReferenceType(), clang::FunctionProtoType::getParamTypes(), clang::FunctionProtoType::getRefQualifier(), clang::FunctionType::getReturnType(), clang::ASTContext::getRValueReferenceType(), clang::Sema::getStdNamespace(), clang::ASTContext::getTrivialTypeSourceInfo(), clang::ValueDecl::getType(), clang::ASTContext::getTypeDeclType(), clang::QualType::getTypePtr(), clang::QualType::isNull(), clang::Sema::lookupCoroutineTraits(), clang::Sema::LookupOrdinaryName, clang::Sema::LookupQualifiedName(), clang::Sema::PP, clang::Sema::RequireCompleteType(), clang::RQ_RValue, and clang::T.

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

maybeTailCall()

Definition at line 330 of file SemaCoroutine.cpp.

References buildMemberCall(), clang::SemaBase::Diag(), E, clang::ActionResult< PtrTy, Compress >::get(), clang::Expr::getType(), clang::QualType::getTypePtr(), clang::Type::isClassType(), clang::ActionResult< PtrTy, Compress >::isInvalid(), clang::Type::isReferenceType(), clang::Type::isStructureType(), clang::Type::isVoidPointerType(), Loc, clang::Sema::MaybeCreateExprWithCleanups(), and clang::T.

Referenced by buildCoawaitCalls().

noteMemberDeclaredHere()