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

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

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

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

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

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

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

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

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

class Test2 {
  num prop;

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

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

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

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

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

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

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

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

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

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

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

class Test3 {
  double prop;

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

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

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

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

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

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

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

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

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

main() {}
