Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/clang/lib/Sema/CoroutineStmtBuilder.h
35233 views
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
70