|  | // 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 Index {} | 
|  |  | 
|  | 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 Test { | 
|  | B operator [](Index i) => null; | 
|  | void operator []=(Index i, B v) {} | 
|  |  | 
|  | void test() { | 
|  | Test t = /*@ typeArgs=Test* */ f(); | 
|  |  | 
|  | t /*@target=Test.[]=*/ [ | 
|  | /*@ typeArgs=Index* */ f()] = /*@ typeArgs=B* */ f(); | 
|  |  | 
|  | t /*@target=Test.[]*/ /*@target=Test.[]=*/ [/*@ typeArgs=Index* */ f()] | 
|  |  | 
|  | ??= /*@ typeArgs=B* */ f(); | 
|  |  | 
|  | t /*@target=Test.[]*/ /*@target=Test.[]=*/ [/*@ typeArgs=Index* */ f()] | 
|  | /*@target=B.+*/ += /*@ typeArgs=C* */ f(); | 
|  |  | 
|  | t /*@target=Test.[]*/ /*@target=Test.[]=*/ [/*@ typeArgs=Index* */ f()] | 
|  | /*@target=B.**/ *= /*@ typeArgs=B* */ f(); | 
|  |  | 
|  | t /*@target=Test.[]*/ /*@target=Test.[]=*/ [/*@ typeArgs=Index* */ f()] | 
|  | /*@target=B.&*/ &= /*@ typeArgs=A* */ f(); | 
|  |  | 
|  | t /*@target=Test.[]*/ [/*@ typeArgs=Index* */ f()]; | 
|  |  | 
|  | /*@target=B.-*/ --t /*@target=Test.[]*/ /*@target=Test.[]=*/ [ | 
|  | /*@ typeArgs=Index* */ f()]; | 
|  |  | 
|  | t /*@target=Test.[]*/ /*@target=Test.[]=*/ [ | 
|  | /*@ typeArgs=Index* */ f()] /*@target=B.-*/ --; | 
|  |  | 
|  | var /*@ type=B* */ v1 = t /*@target=Test.[]=*/ [ | 
|  | /*@ typeArgs=Index* */ f()] = /*@ typeArgs=B* */ f(); | 
|  |  | 
|  | var /*@ type=B* */ v2 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [ | 
|  | /*@ typeArgs=Index* */ f()] | 
|  |  | 
|  | ??= /*@ typeArgs=B* */ f(); | 
|  |  | 
|  | var /*@ type=B* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [ | 
|  | /*@ typeArgs=Index* */ f()] | 
|  | /*@target=B.**/ *= /*@ typeArgs=B* */ f(); | 
|  |  | 
|  | var /*@ type=C* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [ | 
|  | /*@ typeArgs=Index* */ f()] | 
|  | /*@target=B.&*/ &= /*@ typeArgs=A* */ f(); | 
|  |  | 
|  | var /*@ type=B* */ v6 = t /*@target=Test.[]*/ [/*@ typeArgs=Index* */ f()]; | 
|  |  | 
|  | var /*@ type=B* */ v7 = | 
|  | /*@target=B.-*/ --t /*@target=Test.[]*/ /*@target=Test.[]=*/ [ | 
|  | /*@ typeArgs=Index* */ f()]; | 
|  |  | 
|  | var /*@ type=B* */ v8 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [ | 
|  | /*@ typeArgs=Index* */ f()] /*@target=B.-*/ --; | 
|  | } | 
|  | } | 
|  |  | 
|  | main() {} |