// 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.

/*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() {
  int? 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() {
  int? o = 0;
  try {} catch (e) {
    o = null;
  }
  return o;
}

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

/*member: tryFinallyAssignmentInFinally:[null]*/
tryFinallyAssignmentInFinally() {
  int? 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);
}
