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

class Test1 extends core::Object {
  field core::int prop = 1;
  field core::int? prop2 = null;
  synthetic constructor •() → self::Test1
    : super core::Object::•()
    ;
  static method test(self::Test1? t) → void {
    core::int? v1 = let final self::Test1? #t1 = t in #t1 == null ?{core::int?} null : #t1{self::Test1}.{self::Test1::prop} = self::getInt();
    core::int? v4 = let final self::Test1? #t2 = t in #t2 == null ?{core::int?} null : let final core::int? #t3 = #t2.{self::Test1::prop2}{core::int?} in #t3 == null ?{core::int} #t2.{self::Test1::prop2} = self::getInt() : #t3{core::int};
    core::int? v7 = let final self::Test1? #t4 = t in #t4 == null ?{core::int?} null : let final core::int #t5 = #t4.{self::Test1::prop}{core::int}.{core::num::+}(self::getInt()){(core::num) → core::int} in let final void #t6 = #t4.{self::Test1::prop} = #t5 in #t5;
    core::int? v10 = let final self::Test1? #t7 = t in #t7 == null ?{core::int?} null : let final core::int #t8 = #t7.{self::Test1::prop}{core::int}.{core::num::+}(1){(core::num) → core::int} in let final void #t9 = #t7.{self::Test1::prop} = #t8 in #t8;
    core::int? v11 = let final self::Test1? #t10 = t in #t10 == null ?{core::int?} null : let final core::int #t11 = #t10.{self::Test1::prop}{core::int} in let final void #t12 = #t10.{self::Test1::prop} = #t11.{core::num::+}(1){(core::num) → core::int} in #t11;
  }
}
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 = let final self::Test2? #t13 = t in #t13 == null ?{core::int?} null : #t13{self::Test2}.{self::Test2::prop} = self::getInt();
    core::num? v2 = let final self::Test2? #t14 = t in #t14 == null ?{core::num?} null : #t14{self::Test2}.{self::Test2::prop} = self::getNum();
    core::double? v3 = let final self::Test2? #t15 = t in #t15 == null ?{core::double?} null : #t15{self::Test2}.{self::Test2::prop} = self::getDouble();
    core::num? v4 = let final self::Test2? #t16 = t in #t16 == null ?{core::num?} null : let final core::num? #t17 = #t16.{self::Test2::prop2}{core::num?} in #t17 == null ?{core::num} #t16.{self::Test2::prop2} = self::getInt() : #t17{core::num};
    core::num? v5 = let final self::Test2? #t18 = t in #t18 == null ?{core::num?} null : let final core::num #t19 = #t18.{self::Test2::prop}{core::num} in #t19 == null ?{core::num} #t18.{self::Test2::prop} = self::getNum() : #t19;
    core::num? v6 = let final self::Test2? #t20 = t in #t20 == null ?{core::num?} null : let final core::num #t21 = #t20.{self::Test2::prop}{core::num} in #t21 == null ?{core::num} #t20.{self::Test2::prop} = self::getDouble() : #t21;
    core::num? v7 = let final self::Test2? #t22 = t in #t22 == null ?{core::num?} null : let final core::num #t23 = #t22.{self::Test2::prop}{core::num}.{core::num::+}(self::getInt()){(core::num) → core::num} in let final void #t24 = #t22.{self::Test2::prop} = #t23 in #t23;
    core::num? v8 = let final self::Test2? #t25 = t in #t25 == null ?{core::num?} null : let final core::num #t26 = #t25.{self::Test2::prop}{core::num}.{core::num::+}(self::getNum()){(core::num) → core::num} in let final void #t27 = #t25.{self::Test2::prop} = #t26 in #t26;
    core::double? v9 = let final self::Test2? #t28 = t in #t28 == null ?{core::double?} null : let final core::double #t29 = #t28.{self::Test2::prop}{core::num}.{core::num::+}(self::getDouble()){(core::num) → core::double} in let final void #t30 = #t28.{self::Test2::prop} = #t29 in #t29;
    core::num? v10 = let final self::Test2? #t31 = t in #t31 == null ?{core::num?} null : let final core::num #t32 = #t31.{self::Test2::prop}{core::num}.{core::num::+}(1){(core::num) → core::num} in let final void #t33 = #t31.{self::Test2::prop} = #t32 in #t32;
    core::num? v11 = let final self::Test2? #t34 = t in #t34 == null ?{core::num?} null : let final core::num #t35 = #t34.{self::Test2::prop}{core::num} in let final void #t36 = #t34.{self::Test2::prop} = #t35.{core::num::+}(1){(core::num) → core::num} in #t35;
  }
}
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 = let final self::Test3? #t37 = t in #t37 == null ?{core::double?} null : #t37{self::Test3}.{self::Test3::prop} = self::getDouble();
    core::double? v6 = let final self::Test3? #t38 = t in #t38 == null ?{core::double?} null : let final core::double? #t39 = #t38.{self::Test3::prop2}{core::double?} in #t39 == null ?{core::double} #t38.{self::Test3::prop2} = self::getDouble() : #t39{core::double};
    core::double? v7 = let final self::Test3? #t40 = t in #t40 == null ?{core::double?} null : let final core::double #t41 = #t40.{self::Test3::prop}{core::double}.{core::double::+}(self::getInt()){(core::num) → core::double} in let final void #t42 = #t40.{self::Test3::prop} = #t41 in #t41;
    core::double? v8 = let final self::Test3? #t43 = t in #t43 == null ?{core::double?} null : let final core::double #t44 = #t43.{self::Test3::prop}{core::double}.{core::double::+}(self::getNum()){(core::num) → core::double} in let final void #t45 = #t43.{self::Test3::prop} = #t44 in #t44;
    core::double? v9 = let final self::Test3? #t46 = t in #t46 == null ?{core::double?} null : let final core::double #t47 = #t46.{self::Test3::prop}{core::double}.{core::double::+}(self::getDouble()){(core::num) → core::double} in let final void #t48 = #t46.{self::Test3::prop} = #t47 in #t47;
    core::double? v10 = let final self::Test3? #t49 = t in #t49 == null ?{core::double?} null : let final core::double #t50 = #t49.{self::Test3::prop}{core::double}.{core::double::+}(1){(core::num) → core::double} in let final void #t51 = #t49.{self::Test3::prop} = #t50 in #t50;
    core::double? v11 = let final self::Test3? #t52 = t in #t52 == null ?{core::double?} null : let final core::double #t53 = #t52.{self::Test3::prop}{core::double} in let final void #t54 = #t52.{self::Test3::prop} = #t53.{core::double::+}(1){(core::num) → core::double} in #t53;
  }
}
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 {}
