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

class Test1 extends core::Object {
  field core::int prop = null;
  synthetic constructor •() → void
    : 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 •() → void
    : 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 •() → void
    : 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 {}
