// 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=int* */ v4 =
        /*@target=Test1.==*/ t
                ?. /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
            /*@target=num.==*/ ??= getInt();

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

    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=double* */ v3 =
        /*@ type=Test3* */ /*@target=Test3.==*/ t
            ?. /*@target=Test3.prop*/ prop = getDouble();

    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() {}
