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

// VMOptions=
// VMOptions=--use_slow_path

import "package:expect/expect.dart";

@pragma("vm:never-inline")
dynamic hiddenSmi() {
  try {
    throw 42;
  } catch (e) {
    return e;
  }
  return 0;
}

@pragma("vm:never-inline")
dynamic hiddenMint() {
  try {
    throw 0x8000000000000000;
  } catch (e) {
    return e;
  }
  return 0;
}

@pragma("vm:never-inline")
dynamic hiddenDouble() {
  try {
    throw 3.0;
  } catch (e) {
    return e;
  }
  return 0;
}

@pragma("vm:never-inline")
dynamic hiddenCustom() {
  try {
    throw new Custom();
  } catch (e) {
    return e;
  }
  return 0;
}

class Custom {
  operator <(other) => "lt";
  operator >(other) => "gt";
  operator <=(other) => "le";
  operator >=(other) => "ge";
  operator ==(other) => false;
}

main() {
  Expect.equals(false, hiddenSmi() < 2);
  Expect.equals(true, hiddenSmi() > 2);
  Expect.equals(false, hiddenSmi() <= 2);
  Expect.equals(true, hiddenSmi() >= 2);
  Expect.equals(false, hiddenSmi() == 2);
  Expect.equals(true, hiddenSmi() != 2);

  Expect.equals(true, hiddenMint() < 2);
  Expect.equals(false, hiddenMint() > 2);
  Expect.equals(true, hiddenMint() <= 2);
  Expect.equals(false, hiddenMint() >= 2);
  Expect.equals(false, hiddenMint() == 2);
  Expect.equals(true, hiddenMint() != 2);

  Expect.equals(false, hiddenDouble() < 2);
  Expect.equals(true, hiddenDouble() > 2);
  Expect.equals(false, hiddenDouble() <= 2);
  Expect.equals(true, hiddenDouble() >= 2);
  Expect.equals(false, hiddenDouble() == 2);
  Expect.equals(true, hiddenDouble() != 2);

  Expect.equals("lt", hiddenCustom() < 2);
  Expect.equals("gt", hiddenCustom() > 2);
  Expect.equals("le", hiddenCustom() <= 2);
  Expect.equals("ge", hiddenCustom() >= 2);
  Expect.equals(false, hiddenCustom() == 2);
  Expect.equals(true, hiddenCustom() != 2);
}
