// 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.
// @dart=2.9
/*@testedFeatures=inference*/
library test;

void foo<E>(C<E> c, int cmp(E a, E b)) {}

class C<E> {
  void barA([int cmp(E a, E b)]) {
    /*@ typeArgs=C::E* */ foo(this, cmp /*@target=Object.==*/ ?? _default);
  }

  void barB([int cmp(E a, E b)]) {
    /*@ typeArgs=C::E* */ foo(
        this, cmp /*@target=Object.==*/ ?? (_default as int Function(E, E)));
  }

  void barC([int cmp(E a, E b)]) {
    int Function(E, E) v = _default;
    /*@ typeArgs=C::E* */ foo(this, cmp /*@target=Object.==*/ ?? v);
  }

  void barD([int cmp(E a, E b)]) {
    foo<E>(this, cmp /*@target=Object.==*/ ?? _default);
  }

  void barE([int cmp(E a, E b)]) {
    /*@ typeArgs=C::E* */ foo(
        this, cmp /*@target=Object.==*/ == null ? _default : cmp);
  }

  void barF([int cmp(E a, E b)]) {
    /*@ typeArgs=C::E* */ foo(
        this, cmp /*@target=Object.==*/ != null ? cmp : _default);
  }

  static int _default(a, b) {
    return /*@target=int.unary-*/ -1;
  }
}

main() {}
