library test;
import self as self;
import "dart:core" as core;

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