// Copyright (c) 2020, 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.

// These tests verify that the kinds of constructs we expect to cause type
// promotion continue to function properly even when used inside unreachable
// code.

conditionalIs(Object o) {
  return;
  o is int ? null : throw 'bad';
  /*int*/ o;
}

conditionalIsNot(Object o) {
  return;
  o is! int ? throw 'bad' : null;
  /*int*/ o;
}

conditionalJoinFalse(Object o, bool b) {
  return;
  if (b ? o is! int : o is! int) return;
  /*int*/ o;
}

conditionalJoinTrue(Object o, bool b) {
  return;
  if (!(b ? o is int : o is int)) return;
  /*int*/ o;
}

doBreak(Object o) {
  return;
  do {
    if (o is int) break;
  } while (true);
  /*int*/ o;
}

doContinue(Object o) {
  return;
  do {
    if (o is int) continue;
    return;
  } while (false);
  /*int*/ o;
}

doCondition(Object o) {
  return;
  do {} while (o is! int);
  /*int*/ o;
}

forBreak(Object o) {
  return;
  for (;;) {
    if (o is int) break;
  }
  /*int*/ o;
}

forContinue(Object o) {
  return;
  for (;; /*int*/ o) {
    if (o is int) continue;
    return;
  }
}

ifIsNot(Object o) {
  return;
  if (o is! int) return;
  /*int*/ o;
}

ifIsNot_listElement(Object o) {
  return;
  [if (o is! int) throw 'x'];
  /*int*/ o;
}

ifIsNot_setElement(Object o) {
  return;
  ({if (o is! int) throw 'x'});
  /*int*/ o;
}

ifIsNot_mapElement(Object o) {
  return;
  ({if (o is! int) 0: throw 'x'});
  /*int*/ o;
}
