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

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
        /*@target=A.==*/ ??= /*@ 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
        /*@target=A.==*/ ??= /*@ 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() {}
