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

/*@testedFeatures=inference*/
library test;

class Foo {
  int foo(int x) => x;
}

test() {
  dynamic d = new Foo();
  var /*@type=int*/ get_hashCode = d. /*@target=Object::hashCode*/ hashCode;
  var /*@type=dynamic*/ call_hashCode =
      d. /*@target=Object::hashCode*/ hashCode();
  var /*@type=String*/ call_toString =
      d. /*@target=Object::toString*/ toString();
  var /*@type=dynamic*/ call_toStringArg = d.toString(color: "pink");
  var /*@type=dynamic*/ call_foo0 = d.foo();
  var /*@type=dynamic*/ call_foo1 = d.foo(1);
  var /*@type=dynamic*/ call_foo2 = d.foo(1, 2);
  var /*@type=dynamic*/ call_nsm0 = d.noSuchMethod();
  var /*@type=dynamic*/ call_nsm1 =
      d. /*@target=Object::noSuchMethod*/ noSuchMethod(null);
  var /*@type=dynamic*/ call_nsm2 = d.noSuchMethod(null, null);
  var /*@type=bool*/ equals_self = d /*@target=Object::==*/ == d;
  var /*@type=bool*/ equals_null = d /*@target=Object::==*/ == null;
  var /*@type=bool*/ null_equals = null /*@target=Object::==*/ == d;
  var /*@type=bool*/ not_equals_self = d /*@target=Object::==*/ != d;
  var /*@type=bool*/ not_equals_null = d /*@target=Object::==*/ != null;
  var /*@type=bool*/ null_not_equals = null /*@target=Object::==*/ != d;
}

main() {}
