// 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 = 0;
  int? intProp2;
  num numProp = 0;
  num? numProp2;
  double doubleProp = 0;
  double? doubleProp2;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

main() {}
