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

main() {}
