library test /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

static field core::int topLevelInt = 0;
static field core::int? topLevelInt2;
static field core::num topLevelNum = 0;
static field core::num? topLevelNum2;
static field core::double topLevelDouble = 0.0;
static field core::double? topLevelDouble2;
static method getInt() → core::int
  return 0;
static method getNum() → core::num
  return 0;
static method getDouble() → core::double
  return 0.0;
static method test1() → void {
  core::int v1 = self::topLevelInt = self::getInt();
  core::int v4 = let final core::int? #t1 = self::topLevelInt2 in #t1 == null ?{core::int} self::topLevelInt2 = self::getInt() : #t1{core::int};
  core::int v7 = self::topLevelInt = self::topLevelInt.{core::num::+}(self::getInt()){(core::num) → core::int};
  core::int v10 = self::topLevelInt = self::topLevelInt.{core::num::+}(1){(core::num) → core::int};
  core::int v11 = let final core::int #t2 = self::topLevelInt in let final core::int #t3 = self::topLevelInt = #t2.{core::num::+}(1){(core::num) → core::int} in #t2;
}
static method test2() → void {
  core::int v1 = self::topLevelNum = self::getInt();
  core::num v2 = self::topLevelNum = self::getNum();
  core::double v3 = self::topLevelNum = self::getDouble();
  core::num v4 = let final core::num? #t4 = self::topLevelNum2 in #t4 == null ?{core::num} self::topLevelNum2 = self::getInt() : #t4{core::num};
  core::num v5 = let final core::num? #t5 = self::topLevelNum2 in #t5 == null ?{core::num} self::topLevelNum2 = self::getNum() : #t5{core::num};
  core::num v6 = let final core::num? #t6 = self::topLevelNum2 in #t6 == null ?{core::num} self::topLevelNum2 = self::getDouble() : #t6{core::num};
  core::num v7 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getInt()){(core::num) → core::num};
  core::num v8 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getNum()){(core::num) → core::num};
  core::double v9 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getDouble()){(core::num) → core::double};
  core::num v10 = self::topLevelNum = self::topLevelNum.{core::num::+}(1){(core::num) → core::num};
  core::num v11 = let final core::num #t7 = self::topLevelNum in let final core::num #t8 = self::topLevelNum = #t7.{core::num::+}(1){(core::num) → core::num} in #t7;
}
static method test3() → void {
  core::double v3 = self::topLevelDouble = self::getDouble();
  core::double v6 = let final core::double? #t9 = self::topLevelDouble2 in #t9 == null ?{core::double} self::topLevelDouble2 = self::getDouble() : #t9{core::double};
  core::double v7 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getInt()){(core::num) → core::double};
  core::double v8 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getNum()){(core::num) → core::double};
  core::double v9 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getDouble()){(core::num) → core::double};
  core::double v10 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(1){(core::num) → core::double};
  core::double v11 = let final core::double #t10 = self::topLevelDouble in let final core::double #t11 = self::topLevelDouble = #t10.{core::double::+}(1){(core::num) → core::double} in #t10;
}
static method main() → dynamic {}
