// 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*/ intProp ??= getInt();
    var /*@ type=int* */ v7 = super. /*@target=Base::intProp*/ intProp += getInt();
    var /*@ type=int* */ v10 = ++super. /*@target=Base::intProp*/ intProp;
    var /*@ type=int* */ v11 = super. /*@target=Base::intProp*/ intProp++;
  }
}

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*/ numProp ??= getInt();
    var /*@ type=num* */ v5 =
        super. /*@target=Base::numProp*/ numProp ??= getNum();
    var /*@ type=num* */ v6 =
        super. /*@target=Base::numProp*/ numProp ??= getDouble();
    var /*@ type=num* */ v7 = super. /*@target=Base::numProp*/ numProp += getInt();
    var /*@ type=num* */ v8 = super. /*@target=Base::numProp*/ numProp += getNum();
    var /*@ type=num* */ v9 =
        super. /*@target=Base::numProp*/ numProp += getDouble();
    var /*@ type=num* */ v10 = ++super. /*@target=Base::numProp*/ numProp;
    var /*@ type=num* */ v11 = super. /*@target=Base::numProp*/ numProp++;
  }
}

class Test3 extends Base {
  void test3() {
    var /*@ type=double* */ v3 =
        super. /*@target=Base::doubleProp*/ doubleProp = getDouble();
    var /*@ type=double* */ v6 =
        super. /*@target=Base::doubleProp*/ doubleProp ??= getDouble();
    var /*@ type=double* */ v7 =
        super. /*@target=Base::doubleProp*/ doubleProp += getInt();
    var /*@ type=double* */ v8 =
        super. /*@target=Base::doubleProp*/ doubleProp += getNum();
    var /*@ type=double* */ v9 =
        super. /*@target=Base::doubleProp*/ doubleProp += getDouble();
    var /*@ type=double* */ v10 = ++super. /*@target=Base::doubleProp*/ doubleProp;
    var /*@ type=double* */ v11 = super. /*@target=Base::doubleProp*/ doubleProp++;
  }
}

main() {}
