Home | History | Annotate | Line # | Download | only in Sema
      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-exception
      6 //===----------------------------------------------------------------------===//
      7 //
      8 //  This file defines CoroutineStmtBuilder, a class for building the implicit
      9 //  statements required for building a coroutine body.
     10 //
     11 //===----------------------------------------------------------------------===//
     12 
     13 #ifndef LLVM_CLANG_LIB_SEMA_COROUTINESTMTBUILDER_H
     14 #define LLVM_CLANG_LIB_SEMA_COROUTINESTMTBUILDER_H
     15 
     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 
     22 namespace clang {
     23 
     24 class 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 
     34 public:
     35   /// Construct a CoroutineStmtBuilder and initialize the promise
     36   /// 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 the
     41   /// "promise dependent" statements when the promise type is not dependent.
     42   bool buildStatements();
     43 
     44   /// Build the coroutine body statements that require a non-dependent
     45   /// promise type in order to construct.
     46   ///
     47   /// For example different new/delete overloads are selected depending on
     48   /// if the promise type provides `unhandled_exception()`, and therefore they
     49   /// cannot be built until the promise type is complete so that we can perform
     50   /// name lookup.
     51   bool buildDependentStatements();
     52 
     53   bool isInvalid() const { return !this->IsValid; }
     54 
     55 private:
     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 clang
     67 
     68 #endif // LLVM_CLANG_LIB_SEMA_COROUTINESTMTBUILDER_H
     69