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

class Base {
  B member;
}

class Test extends Base {
  void test() {
    super.member = /*@ typeArgs=B* */ f();

    super. /*@target=Base.member*/ member ??= /*@ typeArgs=B* */ f();

    super
        . /*@target=Base.member*/ member /*@target=B.+*/ += /*@ typeArgs=C* */ f();

    super
        . /*@target=Base.member*/ member /*@target=B.**/ *= /*@ typeArgs=B* */ f();

    super
        . /*@target=Base.member*/ member /*@target=B.&*/ &= /*@ typeArgs=A* */ f();

    /*@target=B.-*/ --super. /*@target=Base.member*/ member;

    super. /*@target=Base.member*/ member /*@target=B.-*/ --;

    var /*@ type=B* */ v1 = super.member = /*@ typeArgs=B* */ f();

    var /*@ type=B* */ v2 =
        super. /*@target=Base.member*/ member ??= /*@ typeArgs=B* */ f();

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

    var /*@ type=B* */ v4 = super
        . /*@target=Base.member*/ member /*@target=B.**/ *= /*@ typeArgs=B* */ f();

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

    var /*@ type=B* */ v6 =
        /*@target=B.-*/ --super. /*@target=Base.member*/ member;

    var /*@ type=B* */ v7 = super
        . /*@ type=B* */ /*@target=Base.member*/
        /*@ type=B* */ member /*@target=B.-*/ --;
  }
}

main() {}
