text: //===--- UseOwnershipRequirement.h ----------------------------------------===//
  //
  // 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
  //
  //===----------------------------------------------------------------------===//
  ///
  /// \file
  ///
  /// This file contains declarations that enable clients to compute the ownership
  /// requirements that a use puts on an SSA value. This is used in coordination
  /// with the OwnershipChecker in SILOwnershipVerifier.cpp and the SILValue
  /// ValueOwnershipKind visitor in ValueOwnershipKindClassifier.cpp to perform
  /// SIL level ownership verification.
  ///
  //===----------------------------------------------------------------------===//
  
  #ifndef SWIFT_SIL_USEOWNERSHIPREQUIREMENT_H
  #define SWIFT_SIL_USEOWNERSHIPREQUIREMENT_H
  
  namespace swift {
  
  /// What constraint does the given use of an SSA value put on the lifetime of
  /// the given SSA value.
  ///
  /// There are two possible constraints: MustBeLive and
  /// MustBeInvalidated. MustBeLive means that the SSA value must be able to be
  /// used in a valid way at the given use point. MustBeInvalidated means that any
  /// use of given SSA value after this instruction on any path through this
  /// instruction.
  enum class UseLifetimeConstraint {
    /// This use requires the SSA value to be live after the given instruction's
    /// execution.
    MustBeLive,
  
    /// This use invalidates the given SSA value.
    ///
    /// This means that the given SSA value can not have any uses that are
    /// reachable from this instruction. When a value has owned semantics this
    /// means the SSA value is destroyed at this point. When a value has
    /// guaranteed (i.e. shared borrow) semantics this means that the program
    /// has left the scope of the borrowed SSA value and said value can not be
    /// used.
    MustBeInvalidated,
  };
  
  } // end namespace swift
  
  #endif
  