var BUGNUMBER = 819125;
var summary = "try block should return try value if finally returned normally";

print(BUGNUMBER + ": " + summary);

function expectTryValue(code, isUndefined) {
  assertEq(eval(code), isUndefined ? undefined : 'try');
}

function expectCatchValue(code, isUndefined) {
  assertEq(eval(code), isUndefined ? undefined : 'catch');
}

function expectFinallyValue(code, isUndefined) {
  assertEq(eval(code), isUndefined ? undefined : 'finally');
}

// ==== finally: normal ====

// try: normal
// finally: normal
expectTryValue(`
try {
  'try';
} finally {
  'finally';
}
`);

// try: normal without value
// finally: normal
expectTryValue(`
try {
} finally {
  'finally';
}
`, true);

// try: break
// finally: normal
expectTryValue(`
while (true) {
  try {
    'try';
    break;
  } finally {
    'finally';
  }
}
`);

// try: break without value
// finally: normal
expectTryValue(`
while (true) {
  try {
    break;
  } finally {
    'finally';
  }
}
`, true);

// try: continue
// finally: normal
expectTryValue(`
do {
  try {
    'try';
    continue;
  } finally {
    'finally';
  }
} while (false);
`);

// try: continue without value
// finally: normal
expectTryValue(`
do {
  try {
    continue;
  } finally {
    'finally';
  }
} while (false);
`, true);

// try: throw
// catch: normal
// finally: normal
expectCatchValue(`
try {
  'try';
  throw 'exception';
} catch (e) {
  'catch';
} finally {
  'finally';
}
`);

// try: throw
// catch: normal
// finally: normal
expectCatchValue(`
try {
  'try';
  throw 'exception';
} catch (e) {
  'catch';
} finally {
  'finally';
}
`);

// try: throw
// catch: normal without value
// finally: normal
expectCatchValue(`
try {
  'try';
  throw 'exception';
} catch (e) {
} finally {
  'finally';
}
`, true);

// try: throw
// catch: normal without value
// finally: normal
expectCatchValue(`
try {
  'try';
  throw 'exception';
} catch (e) {
} finally {
  'finally';
}
`, true);

// try: throw
// catch: break
// finally: normal
expectCatchValue(`
while (true) {
  try {
    'try';
    throw 'exception';
  } catch (e) {
    'catch';
    break;
  } finally {
    'finally';
  }
}
`);

// try: throw
// catch: break without value
// finally: normal
expectCatchValue(`
while (true) {
  try {
    'try';
    throw 'exception';
  } catch (e) {
    break;
  } finally {
    'finally';
  }
}
`, true);

// try: throw
// catch: continue
// finally: normal
expectCatchValue(`
do {
  try {
    'try';
    throw 'exception';
  } catch (e) {
    'catch';
    continue;
  } finally {
    'finally';
  }
} while (false);
`);

// try: throw
// catch: continue without value
// finally: normal
expectCatchValue(`
do {
  try {
    'try';
    throw 'exception';
  } catch (e) {
    continue;
  } finally {
    'finally';
  }
} while (false);
`, true);

// ==== finally: break ====

// try: normal
// finally: break
expectFinallyValue(`
while (true) {
  try {
    'try';
  } finally {
    'finally';
    break;
  }
}
`);

// try: normal
// finally: break without value
expectFinallyValue(`
while (true) {
  try {
    'try';
  } finally {
    break;
  }
}
`, true);

// try: break
// finally: break
expectFinallyValue(`
while (true) {
  try {
    'try';
    break;
  } finally {
    'finally';
    break;
  }
}
`);

// try: break
// finally: break without value
expectFinallyValue(`
while (true) {
  try {
    'try';
    break;
  } finally {
    break;
  }
}
`, true);

// try: continue
// finally: break
expectFinallyValue(`
do {
  try {
    'try';
    continue;
  } finally {
    'finally';
    break;
  }
} while (false);
`);

// try: continue
// finally: break without value
expectFinallyValue(`
do {
  try {
    'try';
    continue;
  } finally {
    break;
  }
} while (false);
`, true);

// try: throw
// catch: normal
// finally: break
expectFinallyValue(`
while (true) {
  try {
    'try';
    throw 'exception';
  } catch (e) {
    'catch';
  } finally {
    'finally';
    break;
  }
}
`, false);

// try: throw
// catch: normal
// finally: break without value
expectFinallyValue(`
while (true) {
  try {
    'try';
    throw 'exception';
  } catch (e) {
    'catch';
  } finally {
    break;
  }
}
`, true);

// ==== finally: continue ====

// try: normal
// finally: continue
expectFinallyValue(`
do {
  try {
    'try';
  } finally {
    'finally';
    continue;
  }
} while (false);
`);

// try: normal
// finally: continue without value
expectFinallyValue(`
do {
  try {
    'try';
  } finally {
    continue;
  }
} while (false);
`, true);

// try: break
// finally: continue
expectFinallyValue(`
do {
  try {
    'try';
    break;
  } finally {
    'finally';
    continue;
  }
} while (false);
`);

// try: break
// finally: continue without value
expectFinallyValue(`
do {
  try {
    'try';
    break;
  } finally {
    continue;
  }
} while (false);
`, true);

// try: continue
// finally: continue
expectFinallyValue(`
do {
  try {
    'try';
    continue;
  } finally {
    'finally';
    continue;
  }
} while (false);
`);

// try: continue
// finally: continue without value
expectFinallyValue(`
do {
  try {
    'try';
    continue;
  } finally {
    continue;
  }
} while (false);
`, true);

// ==== without finally ====

// try: throw
// catch: normal
expectCatchValue(`
try {
  'try';
  throw 'exception';
} catch (e) {
  'catch';
}
`);

// try: throw
// catch: normal without value
expectCatchValue(`
try {
  'try';
  throw 'exception';
} catch (e) {
}
`, true);

// try: throw
// catch: break
expectCatchValue(`
while (true) {
  try {
    'try';
    throw 'exception';
  } catch (e) {
    'catch';
    break;
  }
}
`);

// try: throw
// catch: break without value
expectCatchValue(`
while (true) {
  try {
    'try';
    throw 'exception';
  } catch (e) {
    break;
  }
}
`, true);

// try: throw
// catch: continue
expectCatchValue(`
do {
  try {
    'try';
    throw 'exception';
  } catch (e) {
    'catch';
    continue;
  }
} while (false);
`);

// try: throw
// catch: continue without value
expectCatchValue(`
do {
  try {
    'try';
    throw 'exception';
  } catch (e) {
    continue;
  }
} while (false);
`, true);

if (typeof reportCompare === "function")
  reportCompare(true, true);
