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

class Test1 extends core::Object {
  field core::int prop = 0;
  field core::int? prop2 = null;
  synthetic constructor •() → self::Test1
    : super core::Object::•()
    ;
  static method test(self::Test1 t) → void {
    core::int v1 = t.{self::Test1::prop} = self::getInt();
    core::int v4 = let final self::Test1 #t1 = t in let final core::int? #t2 = #t1.{self::Test1::prop2}{core::int?} in #t2 == null ?{core::int} #t1.{self::Test1::prop2} = self::getInt() : #t2{core::int};
    core::int v7 = let final self::Test1 #t3 = t in #t3.{self::Test1::prop} = #t3.{self::Test1::prop}{core::int}.{core::num::+}(self::getInt()){(core::num) → core::int};
    core::int v10 = let final self::Test1 #t4 = t in #t4.{self::Test1::prop} = #t4.{self::Test1::prop}{core::int}.{core::num::+}(1){(core::num) → core::int};
    core::int v11 = let final self::Test1 #t5 = t in let final core::int #t6 = #t5.{self::Test1::prop}{core::int} in let final core::int #t7 = #t5.{self::Test1::prop} = #t6.{core::num::+}(1){(core::num) → core::int} in #t6;
  }
}
class Test2 extends core::Object {
  field core::num prop = 0;
  field core::num? prop2 = null;
  synthetic constructor •() → self::Test2
    : super core::Object::•()
    ;
  static method test(self::Test2 t) → void {
    core::int v1 = t.{self::Test2::prop} = self::getInt();
    core::num v2 = t.{self::Test2::prop} = self::getNum();
    core::double v3 = t.{self::Test2::prop} = self::getDouble();
    core::num v4 = let final self::Test2 #t8 = t in let final core::num? #t9 = #t8.{self::Test2::prop2}{core::num?} in #t9 == null ?{core::num} #t8.{self::Test2::prop2} = self::getInt() : #t9{core::num};
    core::num v5 = let final self::Test2 #t10 = t in let final core::num? #t11 = #t10.{self::Test2::prop2}{core::num?} in #t11 == null ?{core::num} #t10.{self::Test2::prop2} = self::getNum() : #t11{core::num};
    core::num v6 = let final self::Test2 #t12 = t in let final core::num? #t13 = #t12.{self::Test2::prop2}{core::num?} in #t13 == null ?{core::num} #t12.{self::Test2::prop2} = self::getDouble() : #t13{core::num};
    core::num v7 = let final self::Test2 #t14 = t in #t14.{self::Test2::prop} = #t14.{self::Test2::prop}{core::num}.{core::num::+}(self::getInt()){(core::num) → core::num};
    core::num v8 = let final self::Test2 #t15 = t in #t15.{self::Test2::prop} = #t15.{self::Test2::prop}{core::num}.{core::num::+}(self::getNum()){(core::num) → core::num};
    core::double v9 = let final self::Test2 #t16 = t in #t16.{self::Test2::prop} = #t16.{self::Test2::prop}{core::num}.{core::num::+}(self::getDouble()){(core::num) → core::double};
    core::num v10 = let final self::Test2 #t17 = t in #t17.{self::Test2::prop} = #t17.{self::Test2::prop}{core::num}.{core::num::+}(1){(core::num) → core::num};
    core::num v11 = let final self::Test2 #t18 = t in let final core::num #t19 = #t18.{self::Test2::prop}{core::num} in let final core::num #t20 = #t18.{self::Test2::prop} = #t19.{core::num::+}(1){(core::num) → core::num} in #t19;
  }
}
class Test3 extends core::Object {
  field core::double prop = 0.0;
  field core::double? prop2 = null;
  synthetic constructor •() → self::Test3
    : super core::Object::•()
    ;
  static method test3(self::Test3 t) → void {
    core::double v3 = t.{self::Test3::prop} = self::getDouble();
    core::double v6 = let final self::Test3 #t21 = t in let final core::double? #t22 = #t21.{self::Test3::prop2}{core::double?} in #t22 == null ?{core::double} #t21.{self::Test3::prop2} = self::getDouble() : #t22{core::double};
    core::double v7 = let final self::Test3 #t23 = t in #t23.{self::Test3::prop} = #t23.{self::Test3::prop}{core::double}.{core::double::+}(self::getInt()){(core::num) → core::double};
    core::double v8 = let final self::Test3 #t24 = t in #t24.{self::Test3::prop} = #t24.{self::Test3::prop}{core::double}.{core::double::+}(self::getNum()){(core::num) → core::double};
    core::double v9 = let final self::Test3 #t25 = t in #t25.{self::Test3::prop} = #t25.{self::Test3::prop}{core::double}.{core::double::+}(self::getDouble()){(core::num) → core::double};
    core::double v10 = let final self::Test3 #t26 = t in #t26.{self::Test3::prop} = #t26.{self::Test3::prop}{core::double}.{core::double::+}(1){(core::num) → core::double};
    core::double v11 = let final self::Test3 #t27 = t in let final core::double #t28 = #t27.{self::Test3::prop}{core::double} in let final core::double #t29 = #t27.{self::Test3::prop} = #t28.{core::double::+}(1){(core::num) → core::double} in #t28;
  }
}
static method getInt() → core::int
  return 0;
static method getNum() → core::num
  return 0;
static method getDouble() → core::double
  return 0.0;
static method main() → dynamic {}
