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

int getInt() => 0;
num getNum() => 0;
double getDouble() => 0.0;

abstract class Test<T, U> {
  T operator [](String s);
  void operator []=(String s, U v);
}

void test1(Test<int, int> t) {
  var /*@ type=int* */ v1 = t /*@target=Test.[]=*/ ['x'] = getInt();

  var /*@ type=num* */ v2 = t /*@target=Test.[]=*/ ['x'] = getNum();

  var /*@ type=int* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getInt();

  var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getNum();

  var /*@ type=int* */ v7 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getInt();

  var /*@ type=num* */ v8 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getNum();

  var /*@ type=int* */ v10 =
      /*@target=num.+*/ ++t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'];

  var /*@ type=int* */ v11 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ ++;
}

void test2(Test<int, num> t) {
  var /*@ type=int* */ v1 = t /*@target=Test.[]=*/ ['x'] = getInt();

  var /*@ type=num* */ v2 = t /*@target=Test.[]=*/ ['x'] = getNum();

  var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();

  var /*@ type=int* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getInt();

  var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getNum();

  var /*@ type=num* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getDouble();

  var /*@ type=int* */ v7 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getInt();

  var /*@ type=num* */ v8 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getNum();

  var /*@ type=double* */ v9 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getDouble();

  var /*@ type=int* */ v10 =
      /*@target=num.+*/ ++t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'];

  var /*@ type=int* */ v11 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ ++;
}

void test3(Test<int, double> t) {
  var /*@ type=num* */ v2 = t /*@target=Test.[]=*/ ['x'] = getNum();

  var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();

  var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getNum();

  var /*@ type=num* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getDouble();

  var /*@ type=int* */ v7 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getInt();

  var /*@ type=num* */ v8 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getNum();

  var /*@ type=double* */ v9 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getDouble();

  var /*@ type=int* */ v10 =
      /*@target=num.+*/ ++t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'];

  var /*@ type=int* */ v11 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ ++;
}

void test4(Test<num, int> t) {
  var /*@ type=int* */ v1 = t /*@target=Test.[]=*/ ['x'] = getInt();

  var /*@ type=num* */ v2 = t /*@target=Test.[]=*/ ['x'] = getNum();

  var /*@ type=num* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getInt();

  var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getNum();

  var /*@ type=num* */ v7 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getInt();

  var /*@ type=num* */ v8 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getNum();

  var /*@ type=num* */ v10 =
      /*@target=num.+*/ ++t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'];

  var /*@ type=num* */ v11 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ ++;
}

void test5(Test<num, num> t) {
  var /*@ type=int* */ v1 = t /*@target=Test.[]=*/ ['x'] = getInt();

  var /*@ type=num* */ v2 = t /*@target=Test.[]=*/ ['x'] = getNum();

  var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();

  var /*@ type=num* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getInt();

  var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getNum();

  var /*@ type=num* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getDouble();

  var /*@ type=num* */ v7 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getInt();

  var /*@ type=num* */ v8 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getNum();

  var /*@ type=num* */ v9 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getDouble();

  var /*@ type=num* */ v10 =
      /*@target=num.+*/ ++t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'];

  var /*@ type=num* */ v11 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ ++;
}

void test6(Test<num, double> t) {
  var /*@ type=num* */ v2 = t /*@target=Test.[]=*/ ['x'] = getNum();

  var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();

  var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getNum();

  var /*@ type=num* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getDouble();

  var /*@ type=num* */ v7 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getInt();

  var /*@ type=num* */ v8 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getNum();

  var /*@ type=num* */ v9 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
          getDouble();

  var /*@ type=num* */ v10 =
      /*@target=num.+*/ ++t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'];

  var /*@ type=num* */ v11 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ ++;
}

void test7(Test<double, int> t) {
  var /*@ type=int* */ v1 = t /*@target=Test.[]=*/ ['x'] = getInt();

  var /*@ type=num* */ v2 = t /*@target=Test.[]=*/ ['x'] = getNum();

  var /*@ type=num* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getInt();

  var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getNum();

  var /*@ type=double* */ v7 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
          getInt();

  var /*@ type=double* */ v8 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
          getNum();

  var /*@ type=double* */ v10 =
      /*@target=double.+*/ ++t
          /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'];

  var /*@ type=double* */ v11 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ ++;
}

void test8(Test<double, num> t) {
  var /*@ type=int* */ v1 = t /*@target=Test.[]=*/ ['x'] = getInt();

  var /*@ type=num* */ v2 = t /*@target=Test.[]=*/ ['x'] = getNum();

  var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();

  var /*@ type=num* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getInt();

  var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getNum();

  var /*@ type=double* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getDouble();

  var /*@ type=double* */ v7 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
          getInt();

  var /*@ type=double* */ v8 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
          getNum();

  var /*@ type=double* */ v9 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
          getDouble();

  var /*@ type=double* */ v10 =
      /*@target=double.+*/ ++t
          /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'];

  var /*@ type=double* */ v11 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ ++;
}

void test9(Test<double, double> t) {
  var /*@ type=num* */ v2 = t /*@target=Test.[]=*/ ['x'] = getNum();

  var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();

  var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getNum();

  var /*@ type=double* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
       ??= getDouble();

  var /*@ type=double* */ v7 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
          getInt();

  var /*@ type=double* */ v8 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
          getNum();

  var /*@ type=double* */ v9 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
          getDouble();

  var /*@ type=double* */ v10 =
      /*@target=double.+*/ ++t
          /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'];

  var /*@ type=double* */ v11 =
      t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ ++;
}

main() {}
