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

class Test1 {
  int t;

  void test() {
    var /*@type=int**/ v1 = /*@target=Test1.t*/ t = getInt();

    var /*@type=num**/ v2 = /*@target=Test1.t*/ t = getNum();

    var /*@type=int**/ v4 = /*@target=Test1.t*/ /*@target=Test1.t*/ t
         ??= getInt();

    var /*@type=num**/ v5 = /*@target=Test1.t*/ /*@target=Test1.t*/ t
         ??= getNum();

    var /*@type=int**/ v7 = /*@target=Test1.t*/ /*@target=Test1.t*/ t
        /*@target=num.+*/ += getInt();

    var /*@type=num**/ v8 = /*@target=Test1.t*/ /*@target=Test1.t*/ t
        /*@target=num.+*/ += getNum();

    var /*@type=int**/ v10 = /*@target=num.+*/ ++
        /*@target=Test1.t*/ /*@target=Test1.t*/ t;

    var /*@type=int**/ v11 =
        /*@type=int**/ /*@target=Test1.t*/ /*@target=Test1.t*/
        /*@type=int**/ t /*@target=num.+*/ ++;
  }
}

class Test2 {
  num t;

  void test() {
    var /*@type=int**/ v1 = /*@target=Test2.t*/ t = getInt();

    var /*@type=num**/ v2 = /*@target=Test2.t*/ t = getNum();

    var /*@type=double**/ v3 = /*@target=Test2.t*/ t = getDouble();

    var /*@type=num**/ v4 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
         ??= getInt();

    var /*@type=num**/ v5 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
         ??= getNum();

    var /*@type=num**/ v6 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
         ??= getDouble();

    var /*@type=num**/ v7 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
        /*@target=num.+*/ += getInt();

    var /*@type=num**/ v8 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
        /*@target=num.+*/ += getNum();

    var /*@type=num**/ v9 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
        /*@target=num.+*/ += getDouble();

    var /*@type=num**/ v10 = /*@target=num.+*/ ++
        /*@target=Test2.t*/ /*@target=Test2.t*/ t;

    var /*@type=num**/ v11 =
        /*@type=num**/ /*@target=Test2.t*/ /*@target=Test2.t*/
        /*@type=num**/ t /*@target=num.+*/ ++;
  }
}

class Test3 {
  double t;

  void test3() {
    var /*@type=num**/ v2 = /*@target=Test3.t*/ t = getNum();

    var /*@type=double**/ v3 = /*@target=Test3.t*/ t = getDouble();

    var /*@type=num**/ v5 = /*@target=Test3.t*/ /*@target=Test3.t*/ t
         ??= getNum();

    var /*@type=double**/ v6 = /*@target=Test3.t*/ /*@target=Test3.t*/ t
         ??= getDouble();

    var /*@type=double**/ v7 = /*@target=Test3.t*/ /*@target=Test3.t*/ t
        /*@target=double.+*/ += getInt();

    var /*@type=double**/ v8 = /*@target=Test3.t*/ /*@target=Test3.t*/ t
        /*@target=double.+*/ += getNum();

    var /*@type=double**/ v9 = /*@target=Test3.t*/ /*@target=Test3.t*/ t
        /*@target=double.+*/ += getDouble();

    var /*@type=double**/ v10 =
        /*@target=double.+*/ ++ /*@target=Test3.t*/ /*@target=Test3.t*/ t;

    var /*@type=double**/ v11 =
        /*@type=double**/ /*@target=Test3.t*/ /*@target=Test3.t*/
        /*@type=double**/ t /*@target=double.+*/ ++;
  }
}

main() {}
