// 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() {}
