69 lines · c
1//===- CoroutineStmtBuilder.h - Implicit coroutine stmt builder -*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//===----------------------------------------------------------------------===//7//8// This file defines CoroutineStmtBuilder, a class for building the implicit9// statements required for building a coroutine body.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_CLANG_LIB_SEMA_COROUTINESTMTBUILDER_H14#define LLVM_CLANG_LIB_SEMA_COROUTINESTMTBUILDER_H15 16#include "clang/AST/Decl.h"17#include "clang/AST/ExprCXX.h"18#include "clang/AST/StmtCXX.h"19#include "clang/Lex/Preprocessor.h"20#include "clang/Sema/SemaInternal.h"21 22namespace clang {23 24class CoroutineStmtBuilder : public CoroutineBodyStmt::CtorArgs {25 Sema &S;26 FunctionDecl &FD;27 sema::FunctionScopeInfo &Fn;28 bool IsValid = true;29 SourceLocation Loc;30 SmallVector<Stmt *, 4> ParamMovesVector;31 const bool IsPromiseDependentType;32 CXXRecordDecl *PromiseRecordDecl = nullptr;33 34public:35 /// Construct a CoroutineStmtBuilder and initialize the promise36 /// statement and initial/final suspends from the FunctionScopeInfo.37 CoroutineStmtBuilder(Sema &S, FunctionDecl &FD, sema::FunctionScopeInfo &Fn,38 Stmt *Body);39 40 /// Build the coroutine body statements, including the41 /// "promise dependent" statements when the promise type is not dependent.42 bool buildStatements();43 44 /// Build the coroutine body statements that require a non-dependent45 /// promise type in order to construct.46 ///47 /// For example different new/delete overloads are selected depending on48 /// if the promise type provides `unhandled_exception()`, and therefore they49 /// cannot be built until the promise type is complete so that we can perform50 /// name lookup.51 bool buildDependentStatements();52 53 bool isInvalid() const { return !this->IsValid; }54 55private:56 bool makePromiseStmt();57 bool makeInitialAndFinalSuspend();58 bool makeNewAndDeleteExpr();59 bool makeOnFallthrough();60 bool makeOnException();61 bool makeReturnObject();62 bool makeGroDeclAndReturnStmt();63 bool makeReturnOnAllocFailure();64};65 66} // end namespace clang67 68#endif // LLVM_CLANG_LIB_SEMA_COROUTINESTMTBUILDER_H69