// 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.

/*@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() {}
