Coverage Report

Created: 2019-07-24 05:18

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/tools/clang/lib/Sema/CoroutineStmtBuilder.h
Line
Count
Source
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
240
  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