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

class A {}

class B extends A {
  A operator +(C v) => null;
  B operator -(int i) => null;
  B operator *(B v) => null;
  C operator &(A v) => null;
}

class C extends B {}

T f<T>() => null;

void test() {
  B local;
  local = /*@ typeArgs=B* */ f();

  local  ??= /*@ typeArgs=B* */ f();

  local /*@target=B.+*/ += /*@ typeArgs=C* */ f();

  local /*@target=B.**/ *= /*@ typeArgs=B* */ f();

  local /*@target=B.&*/ &= /*@ typeArgs=A* */ f();

  /*@target=B.-*/ --local;

  local /*@target=B.-*/ --;

  var /*@ type=B* */ v1 = local = /*@ typeArgs=B* */ f();

  var /*@ type=B* */ v2 =
      local  ??= /*@ typeArgs=B* */ f();

  var /*@ type=A* */ v3 = local
      /*@target=B.+*/ += /*@ typeArgs=C* */ f();

  var /*@ type=B* */ v4 = local
      /*@target=B.**/ *= /*@ typeArgs=B* */ f();

  var /*@ type=C* */ v5 = local
      /*@target=B.&*/ &= /*@ typeArgs=A* */ f();

  var /*@ type=B* */ v6 = /*@target=B.-*/ --local;

  var /*@ type=B* */ v7 = /*@ type=B* */ local
      /*@ type=B* */ /*@target=B.-*/ --;
}

main() {}
