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

/*@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 = t. /*@target=Test1::prop*/ prop = getInt();
    var /*@ type=int* */ v4 = /*@ type=Test1* */ t
            . /*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
        /*@target=num::==*/ ??= getInt();
    var /*@ type=int* */ v7 =
        /*@ type=Test1* */ t
                . /*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
            /*@ target=num::+ */ += getInt();
    var /*@ type=int* */ v10 = /*@ target=num::+ */ ++ /*@ type=Test1* */ t
        . /*@target=Test1::prop*/ /*@target=Test1::prop*/ prop;
    var /*@ type=int* */ v11 = /*@ type=Test1* */ t
        . /*@ type=int* */ /*@target=Test1::prop*/ /*@target=Test1::prop*/
        prop /*@ type=int* */ /*@ target=num::+ */ ++;
  }
}

class Test2 {
  num prop;

  static void test(Test2 t) {
    var /*@ type=int* */ v1 = t. /*@target=Test2::prop*/ prop = getInt();
    var /*@ type=num* */ v2 = t. /*@target=Test2::prop*/ prop = getNum();
    var /*@ type=double* */ v3 = t. /*@target=Test2::prop*/ prop = getDouble();
    var /*@ type=num* */ v4 = /*@ type=Test2* */ t
            . /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
        /*@target=num::==*/ ??= getInt();
    var /*@ type=num* */ v5 = /*@ type=Test2* */ t
            . /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
        /*@target=num::==*/ ??= getNum();
    var /*@ type=num* */ v6 = /*@ type=Test2* */ t
            . /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
        /*@target=num::==*/ ??= getDouble();
    var /*@ type=num* */ v7 =
        /*@ type=Test2* */ t
                . /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
            /*@ target=num::+ */ += getInt();
    var /*@ type=num* */ v8 =
        /*@ type=Test2* */ t
                . /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
            /*@ target=num::+ */ += getNum();
    var /*@ type=num* */ v9 =
        /*@ type=Test2* */ t
                . /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
            /*@ target=num::+ */ += getDouble();
    var /*@ type=num* */ v10 = /*@ target=num::+ */ ++ /*@ type=Test2* */ t
        . /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop;
    var /*@ type=num* */ v11 = /*@ type=Test2* */ t
        . /*@ type=num* */ /*@target=Test2::prop*/ /*@target=Test2::prop*/
        prop /*@ type=num* */ /*@ target=num::+ */ ++;
  }
}

class Test3 {
  double prop;

  static void test3(Test3 t) {
    var /*@ type=double* */ v3 = t. /*@target=Test3::prop*/ prop = getDouble();
    var /*@ type=double* */ v6 =
        /*@ type=Test3* */ t. /*@target=Test3::prop*/ /*@target=Test3::prop*/
            prop /*@target=num::==*/ ??= getDouble();
    var /*@ type=double* */ v7 =
        /*@ type=Test3* */ t
                . /*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
            /*@ target=double::+ */ += getInt();
    var /*@ type=double* */ v8 =
        /*@ type=Test3* */ t
                . /*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
            /*@ target=double::+ */ += getNum();
    var /*@ type=double* */ v9 =
        /*@ type=Test3* */ t
                . /*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
            /*@ target=double::+ */ += getDouble();
    var /*@ type=double* */ v10 = /*@ target=double::+ */ ++ /*@ type=Test3* */ t
        .
        /*@target=Test3::prop*/ /*@target=Test3::prop*/
        prop;
    var /*@ type=double* */ v11 = /*@ type=Test3* */ t.
        /*@ type=double* */ /*@target=Test3::prop*/ /*@target=Test3::prop*/
        prop /*@ type=double* */ /*@ target=double::+ */ ++;
  }
}

main() {}
