// 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 Base {
  int intProp;
  num numProp;
  double doubleProp;
}

class Test1 extends Base {
  void test() {
    var /*@ type=int* */ v1 =
        super. /*@target=Base::intProp*/ intProp = getInt();

    var /*@ type=num* */ v2 =
        super. /*@target=Base::intProp*/ intProp = getNum();

    var /*@ type=int* */ v4 =
        super. /*@target=Base::intProp*/ /*@target=Base::intProp*/ intProp
            /*@ target=num::== */ ??= getInt();

    var /*@ type=num* */ v5 =
        super. /*@target=Base::intProp*/ /*@target=Base::intProp*/ intProp
            /*@ target=num::== */ ??= getNum();

    var /*@ type=int* */ v7 =
        super. /*@target=Base::intProp*/ /*@target=Base::intProp*/ intProp
            /*@ target=num::+ */ += getInt();

    var /*@ type=num* */ v8 =
        super. /*@target=Base::intProp*/ /*@target=Base::intProp*/ intProp
            /*@ target=num::+ */ += getNum();

    var /*@ type=int* */ v10 = /*@ target=num::+ */ ++super
        . /*@target=Base::intProp*/ /*@target=Base::intProp*/ intProp;

    var /*@ type=int* */ v11 = super
            . /*@ type=int* */ /*@target=Base::intProp*/ /*@target=Base::intProp*/
            intProp
        /*@ type=int* */ /*@ target=num::+ */ ++;
  }
}

class Test2 extends Base {
  void test() {
    var /*@ type=int* */ v1 =
        super. /*@target=Base::numProp*/ numProp = getInt();

    var /*@ type=num* */ v2 =
        super. /*@target=Base::numProp*/ numProp = getNum();

    var /*@ type=double* */ v3 =
        super. /*@target=Base::numProp*/ numProp = getDouble();

    var /*@ type=num* */ v4 =
        super. /*@target=Base::numProp*/ /*@target=Base::numProp*/ numProp
            /*@ target=num::== */ ??= getInt();

    var /*@ type=num* */ v5 =
        super. /*@target=Base::numProp*/ /*@target=Base::numProp*/ numProp
            /*@ target=num::== */ ??= getNum();

    var /*@ type=num* */ v6 =
        super. /*@target=Base::numProp*/ /*@target=Base::numProp*/ numProp
            /*@ target=num::== */ ??= getDouble();

    var /*@ type=num* */ v7 =
        super. /*@target=Base::numProp*/ /*@target=Base::numProp*/ numProp
            /*@ target=num::+ */ += getInt();

    var /*@ type=num* */ v8 =
        super. /*@target=Base::numProp*/ /*@target=Base::numProp*/ numProp
            /*@ target=num::+ */ += getNum();

    var /*@ type=num* */ v9 =
        super. /*@target=Base::numProp*/ /*@target=Base::numProp*/ numProp
            /*@ target=num::+ */ += getDouble();

    var /*@ type=num* */ v10 = /*@ target=num::+ */ ++super
        . /*@target=Base::numProp*/ /*@target=Base::numProp*/ numProp;

    var /*@ type=num* */ v11 = super
        . /*@ type=num* */ /*@target=Base::numProp*/ /*@target=Base::numProp*/
        numProp /*@ type=num* */ /*@ target=num::+ */ ++;
  }
}

class Test3 extends Base {
  void test3() {
    var /*@ type=num* */ v2 =
        super. /*@target=Base::doubleProp*/ doubleProp = getNum();

    var /*@ type=double* */ v3 =
        super. /*@target=Base::doubleProp*/ doubleProp = getDouble();

    var /*@ type=num* */ v5 = super
            . /*@target=Base::doubleProp*/ /*@target=Base::doubleProp*/ doubleProp
        /*@ target=num::== */ ??= getNum();

    var /*@ type=double* */ v6 = super
            . /*@target=Base::doubleProp*/ /*@target=Base::doubleProp*/ doubleProp
        /*@ target=num::== */ ??= getDouble();

    var /*@ type=double* */ v7 = super
        . /*@target=Base::doubleProp*/ /*@target=Base::doubleProp*/
        doubleProp /*@ target=double::+ */ += getInt();

    var /*@ type=double* */ v8 = super
        . /*@target=Base::doubleProp*/ /*@target=Base::doubleProp*/
        doubleProp /*@ target=double::+ */ += getNum();

    var /*@ type=double* */ v9 = super
        . /*@target=Base::doubleProp*/ /*@target=Base::doubleProp*/
        doubleProp /*@ target=double::+ */ += getDouble();

    var /*@ type=double* */ v10 =
        /*@ target=double::+ */ ++super
            . /*@target=Base::doubleProp*/ /*@target=Base::doubleProp*/
            doubleProp;

    var /*@ type=double* */ v11 = super
        . /*@ type=double* */ /*@target=Base::doubleProp*/ /*@target=Base::doubleProp*/
        doubleProp /*@ type=double* */ /*@ target=double::+ */ ++;
  }
}

main() {}
