brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 42499a3 Raw
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