// Copyright (c) 2018, 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 test program to test arithmetic operations.

// @dart = 2.9

import "dart:async";
import "package:expect/expect.dart";

class B {}

class C {
  B call(B b) => b;
}

typedef B BToB(B x);

typedef Object NullToObject(Null x);

C c = new C();

void check1(BToB f) {
  Expect.isFalse(identical(c, f));
  Expect.equals(c.call, f);
  B b = new B();
  Expect.identical(f(b), b);
}

void check2(FutureOr<BToB> f) {
  Expect.isFalse(identical(c, f));
  Expect.equals(c.call, f);
  BToB f2 = f;
  Expect.identical(f, f2);
  B b = new B();
  Expect.identical(f2(b), b);
}

void check3(NullToObject f) {
  Expect.isFalse(identical(c, f));
  Expect.equals(c.call, f);
  Expect.isNull(f(null));
}

void check4(FutureOr<NullToObject> f) {
  Expect.isFalse(identical(c, f));
  Expect.equals(c.call, f);
  NullToObject f2 = f;
  Expect.identical(f, f2);
  Expect.isNull(f2(null));
}

void check5(Function f) {
  Expect.isFalse(identical(c, f));
  Expect.equals(c.call, f);
  B b = new B();
  Expect.identical(f(b), b);
}

void check6(FutureOr<Function> f) {
  Expect.isFalse(identical(c, f));
  Expect.equals(c.call, f);
  Function f2 = f;
  Expect.identical(f, f2);
  B b = new B();
  Expect.identical(f2(b), b);
}

void check7(C x) {
  Expect.identical(c, x);
}

void check8(FutureOr<C> x) {
  Expect.identical(c, x);
}

void check9(Object o) {
  Expect.identical(c, o);
}

void check10(FutureOr<Object> o) {
  Expect.identical(c, o);
}

void check11(dynamic d) {
  Expect.identical(c, d);
}

void check12(FutureOr<dynamic> d) {
  Expect.identical(c, d);
}

main() {
  // Implicitly tears off c.call
  check1(c); //# 01: ok
  check2(c); //# 02: ok
  check3(c); //# 03: ok
  check4(c); //# 04: ok
  check5(c); //# 05: ok
  check6(c); //# 06: ok
  // Does not tear off c.call
  check7(c); //# 07: ok
  check8(c); //# 08: ok
  check9(c); //# 09: ok
  check10(c); //# 10: ok
  check11(c); //# 11: ok
  check12(c); //# 12: ok
}
