// 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 Test1 {
  int operator [](String s);
  void operator []=(String s, int v);

  void test() {
    var /*@type=int**/ v1 = this /*@target=Test1.[]=*/ ['x'] = getInt();

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

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

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

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

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

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

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

abstract class Test2 {
  int operator [](String s);
  void operator []=(String s, num v);

  void test() {
    var /*@type=int**/ v1 = this /*@target=Test2.[]=*/ ['x'] = getInt();

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

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

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

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

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

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

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

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

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

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

abstract class Test3 {
  int operator [](String s);
  void operator []=(String s, double v);

  void test() {
    var /*@type=num**/ v2 = this /*@target=Test3.[]=*/ ['x'] = getNum();

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

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

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

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

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

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

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

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

abstract class Test4 {
  num operator [](String s);
  void operator []=(String s, int v);

  void test() {
    var /*@type=int**/ v1 = this /*@target=Test4.[]=*/ ['x'] = getInt();

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

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

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

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

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

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

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

abstract class Test5 {
  num operator [](String s);
  void operator []=(String s, num v);

  void test() {
    var /*@type=int**/ v1 = this /*@target=Test5.[]=*/ ['x'] = getInt();

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

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

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

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

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

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

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

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

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

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

abstract class Test6 {
  num operator [](String s);
  void operator []=(String s, double v);

  void test() {
    var /*@type=num**/ v2 = this /*@target=Test6.[]=*/ ['x'] = getNum();

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

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

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

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

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

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

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

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

abstract class Test7 {
  double operator [](String s);
  void operator []=(String s, int v);

  void test() {
    var /*@type=int**/ v1 = this /*@target=Test7.[]=*/ ['x'] = getInt();

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

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

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

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

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

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

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

abstract class Test8 {
  double operator [](String s);
  void operator []=(String s, num v);

  void test() {
    var /*@type=int**/ v1 = this /*@target=Test8.[]=*/ ['x'] = getInt();

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

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

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

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

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

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

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

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

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

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

abstract class Test9 {
  double operator [](String s);
  void operator []=(String s, double v);

  void test() {
    var /*@type=num**/ v2 = this /*@target=Test9.[]=*/ ['x'] = getNum();

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

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

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

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

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

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

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

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

main() {}
