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