blob: ba025e3a649f8e4d34bd9cae1672aceba9233d00 [file] [log] [blame]
//===--- SwitchCaseFullExpr.h -----------------------------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_SILGEN_SWITCHCASEFULLEXPR_H
#define SWIFT_SILGEN_SWITCHCASEFULLEXPR_H
#include "Scope.h"
namespace swift {
namespace Lowering {
class SILGenFunction;
/// A cleanup scope RAII object, like FullExpr, that comes with a JumpDest for a
/// continuation block. It is intended to be used to handle switch cases.
///
/// You *must* call exit() at some point.
///
/// This scope is also exposed to the debug info.
class SwitchCaseFullExpr {
SILGenFunction &SGF;
Scope scope;
CleanupLocation loc;
NullablePtr<SILBasicBlock> contBlock;
public:
SwitchCaseFullExpr(SILGenFunction &SGF, CleanupLocation loc);
SwitchCaseFullExpr(SILGenFunction &SGF, CleanupLocation loc,
SILBasicBlock *contBlock);
~SwitchCaseFullExpr() = default;
SwitchCaseFullExpr(const SwitchCaseFullExpr &) = delete;
SwitchCaseFullExpr &operator=(const SwitchCaseFullExpr &) = delete;
/// Pop the scope and branch to the cont block.
void exitAndBranch(SILLocation loc, ArrayRef<SILValue> result = {});
/// Pop the scope and do not branch to the cont block.
void exit();
};
} // namespace Lowering
} // namespace swift
#endif