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

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

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

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

    var /*@ type=int* */ v11 =
         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* */  t
        ?. /*@target=Test2.prop*/ prop = getInt();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

main() {}
