// 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=int* */ v4 =
        super. /*@target=Base::intProp*/ /*@target=Base::intProp*/ intProp
            /*@ target=num::==*/ ??= getInt();

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

    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*/
        /*@ type=int* */ intProp /*@ 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*/
        /*@ type=num* */ numProp /*@ target=num::+ */ ++;
  }
}

class Test3 extends Base {
  void test3() {
    var /*@ type=double* */ v3 =
        super. /*@target=Base::doubleProp*/ doubleProp = getDouble();

    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*/
        /*@ type=double* */ doubleProp /*@ target=double::+ */ ++;
  }
}

main() {}
