// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart = 2.7

/*member: main:[null]*/
main() {
  emptyTryCatch();
  emptyTryFinally();
  emptyTryCatchFinally();

  tryCatchAssignmentInTry();
  tryCatchAssignmentInCatch();
  tryFinallyAssignmentInFinally();
  tryCatchAssignmentInTryCatch();
  tryCatchAssignmentInTryFinally();

  tryCatchParameterAssignmentInTry();
  tryCatchParameterAssignmentInCatch();
  tryFinallyParameterAssignmentInFinally();
  tryCatchParameterAssignmentInTryCatch();
  tryFinallyParameterAssignmentInTryFinally();
}

////////////////////////////////////////////////////////////////////////////////
/// Parameter passed through an empty try-catch statement.
////////////////////////////////////////////////////////////////////////////////

/*member: _emptyTryCatch:[exact=JSUInt31]*/
_emptyTryCatch(/*[exact=JSUInt31]*/ o) {
  try {} catch (e) {}
  return o;
}

/*member: emptyTryCatch:[null]*/
emptyTryCatch() {
  _emptyTryCatch(0);
}

////////////////////////////////////////////////////////////////////////////////
/// Parameter passed through an empty try-finally statement.
////////////////////////////////////////////////////////////////////////////////

/*member: _emptyTryFinally:[exact=JSUInt31]*/
_emptyTryFinally(/*[exact=JSUInt31]*/ o) {
  try {} finally {}
  return o;
}

/*member: emptyTryFinally:[null]*/
emptyTryFinally() {
  _emptyTryFinally(0);
}

////////////////////////////////////////////////////////////////////////////////
/// Parameter passed through an empty try-catch-finally statement.
////////////////////////////////////////////////////////////////////////////////

/*member: _emptyTryCatchFinally:[exact=JSUInt31]*/
_emptyTryCatchFinally(/*[exact=JSUInt31]*/ o) {
  try {} catch (e) {
  } finally {}
  return o;
}

/*member: emptyTryCatchFinally:[null]*/
emptyTryCatchFinally() {
  _emptyTryCatchFinally(0);
}

////////////////////////////////////////////////////////////////////////////////
/// A try-catch statement with an assignment in the try block.
////////////////////////////////////////////////////////////////////////////////

/*member: tryCatchAssignmentInTry:[null|exact=JSUInt31]*/
tryCatchAssignmentInTry() {
  var o = 0;
  try {
    o = null;
  } catch (e) {}
  return o;
}

////////////////////////////////////////////////////////////////////////////////
/// A try-catch statement with an assignment in the catch block.
////////////////////////////////////////////////////////////////////////////////

/*member: tryCatchAssignmentInCatch:[null|exact=JSUInt31]*/
tryCatchAssignmentInCatch() {
  var o = 0;
  try {} catch (e) {
    o = null;
  }
  return o;
}

////////////////////////////////////////////////////////////////////////////////
/// A try-finally statement with an assignment in the finally clause.
////////////////////////////////////////////////////////////////////////////////

/*member: tryFinallyAssignmentInFinally:[null]*/
tryFinallyAssignmentInFinally() {
  var o = 0;
  try {} finally {
    o = null;
  }
  return o;
}

////////////////////////////////////////////////////////////////////////////////
/// A try-catch statement with an assignment in both the try block and the catch
/// block.
////////////////////////////////////////////////////////////////////////////////

/*member: tryCatchAssignmentInTryCatch:Union(null, [exact=JSString], [exact=JSUInt31])*/
tryCatchAssignmentInTryCatch() {
  dynamic o = 0;
  try {
    o = '';
  } catch (e) {
    o = null;
  }
  return o;
}

////////////////////////////////////////////////////////////////////////////////
/// A try-catch statement with an assignment in both the try block and the
/// finally block.
////////////////////////////////////////////////////////////////////////////////

/*member: tryCatchAssignmentInTryFinally:[null]*/
tryCatchAssignmentInTryFinally() {
  dynamic o = 0;
  try {
    o = '';
  } finally {
    o = null;
  }
  return o;
}

////////////////////////////////////////////////////////////////////////////////
/// Parameter passed through a try-catch statement with an assignment in the
/// catch clause.
////////////////////////////////////////////////////////////////////////////////

/*member: _tryCatchParameterAssignmentInTry:[null|exact=JSUInt31]*/
_tryCatchParameterAssignmentInTry(/*[exact=JSUInt31]*/ o) {
  try {
    o = null;
  } catch (e) {}
  return o;
}

/*member: tryCatchParameterAssignmentInTry:[null]*/
tryCatchParameterAssignmentInTry() {
  _tryCatchParameterAssignmentInTry(0);
}

////////////////////////////////////////////////////////////////////////////////
/// Parameter passed through a try-catch statement with an assignment in the
/// catch clause.
////////////////////////////////////////////////////////////////////////////////

/*member: _tryCatchParameterAssignmentInCatch:[null|exact=JSUInt31]*/
_tryCatchParameterAssignmentInCatch(/*[exact=JSUInt31]*/ o) {
  try {} catch (e) {
    o = null;
  }
  return o;
}

/*member: tryCatchParameterAssignmentInCatch:[null]*/
tryCatchParameterAssignmentInCatch() {
  _tryCatchParameterAssignmentInCatch(0);
}

////////////////////////////////////////////////////////////////////////////////
/// Parameter passed through a try-finally statement with an assignment in the
/// finally clause.
////////////////////////////////////////////////////////////////////////////////

/*member: _tryFinallyParameterAssignmentInFinally:[null]*/
_tryFinallyParameterAssignmentInFinally(/*[exact=JSUInt31]*/ o) {
  try {} finally {
    o = null;
  }
  return o;
}

/*member: tryFinallyParameterAssignmentInFinally:[null]*/
tryFinallyParameterAssignmentInFinally() {
  _tryFinallyParameterAssignmentInFinally(0);
}

////////////////////////////////////////////////////////////////////////////////
/// Parameter passed through a try-catch statement with an assignment in the
/// catch clause.
////////////////////////////////////////////////////////////////////////////////

/*member: _tryCatchParameterAssignmentInTryCatch:Union(null, [exact=JSString], [exact=JSUInt31])*/
_tryCatchParameterAssignmentInTryCatch(/*[exact=JSUInt31]*/ o) {
  try {
    o = '';
  } catch (e) {
    o = null;
  }
  return o;
}

/*member: tryCatchParameterAssignmentInTryCatch:[null]*/
tryCatchParameterAssignmentInTryCatch() {
  _tryCatchParameterAssignmentInTryCatch(0);
}

////////////////////////////////////////////////////////////////////////////////
/// Parameter passed through a try-finally statement with an assignment in the
/// finally clause.
////////////////////////////////////////////////////////////////////////////////

/*member: _tryFinallyParameterAssignmentInTryFinally:[null]*/
_tryFinallyParameterAssignmentInTryFinally(/*[exact=JSUInt31]*/ o) {
  try {
    o = '';
  } finally {
    o = null;
  }
  return o;
}

/*member: tryFinallyParameterAssignmentInTryFinally:[null]*/
tryFinallyParameterAssignmentInTryFinally() {
  _tryFinallyParameterAssignmentInTryFinally(0);
}
