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