// 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 {
  B operator +(C v) => throw '';
  B operator -(int i) => throw '';
  B operator *(B v) => throw '';
  C operator &(A v) => throw '';
}

class C extends B {}

T f<T>() => throw '';

class Base {
  B member;
  B? member2;

  Base(this.member);
}

class Test extends Base {
  Test(B member) : super(member);

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

    super. /*@target=Base.member2*/ member2 ??= /*@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.member2*/ member2 ??= /*@typeArgs=B?*/ f();

    var /*@type=B*/ 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() {}
