// 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;

int topLevelInt;
num topLevelNum;
double topLevelDouble;

void test1() {
  var /*@ type=int* */ v1 = topLevelInt = getInt();

  var /*@ type=int* */ v4 = topLevelInt /*@ target=num::== */ ??= getInt();

  var /*@ type=int* */ v7 = topLevelInt /*@ target=num::+ */ += getInt();

  var /*@ type=int* */ v10 = /*@ target=num::+ */ ++topLevelInt;

  var /*@ type=int* */ v11 = /*@ type=int* */ topLevelInt
      /*@ type=int* */ /*@ target=num::+ */ ++;
}

void test2() {
  var /*@ type=int* */ v1 = topLevelNum = getInt();

  var /*@ type=num* */ v2 = topLevelNum = getNum();

  var /*@ type=double* */ v3 = topLevelNum = getDouble();

  var /*@ type=num* */ v4 = topLevelNum /*@ target=num::== */ ??= getInt();

  var /*@ type=num* */ v5 = topLevelNum /*@ target=num::== */ ??= getNum();

  var /*@ type=num* */ v6 = topLevelNum /*@ target=num::== */ ??= getDouble();

  var /*@ type=num* */ v7 = topLevelNum /*@ target=num::+ */ += getInt();

  var /*@ type=num* */ v8 = topLevelNum /*@ target=num::+ */ += getNum();

  var /*@ type=num* */ v9 = topLevelNum /*@ target=num::+ */ += getDouble();

  var /*@ type=num* */ v10 = /*@ target=num::+ */ ++topLevelNum;

  var /*@ type=num* */ v11 = /*@ type=num* */ topLevelNum
      /*@ type=num* */ /*@ target=num::+ */ ++;
}

void test3() {
  var /*@ type=double* */ v3 = topLevelDouble = getDouble();

  var /*@ type=double* */ v6 =
      topLevelDouble /*@ target=num::== */ ??= getDouble();

  var /*@ type=double* */ v7 =
      topLevelDouble /*@ target=double::+ */ += getInt();

  var /*@ type=double* */ v8 =
      topLevelDouble /*@ target=double::+ */ += getNum();

  var /*@ type=double* */ v9 =
      topLevelDouble /*@ target=double::+ */ += getDouble();

  var /*@ type=double* */ v10 = /*@ target=double::+ */ ++topLevelDouble;

  var /*@ type=double* */ v11 = /*@ type=double* */ topLevelDouble
      /*@ type=double* */ /*@ target=double::+ */ ++;
}

main() {}
