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::int v4 = let final self::Test1 #t2 = t in #t2.==(null) ?{core::int} null : let final core::int #t3 = #t2.{self::Test1::prop} in #t3.{core::num::==}(null) ?{core::int} #t2.{self::Test1::prop} = self::getInt() : #t3;
    core::int v7 = let final self::Test1 #t4 = t in #t4.==(null) ?{core::int} null : #t4.{self::Test1::prop} = #t4.{self::Test1::prop}.{core::num::+}(self::getInt());
    core::int v10 = let final self::Test1 #t5 = t in #t5.==(null) ?{core::int} null : #t5.{self::Test1::prop} = #t5.{self::Test1::prop}.{core::num::+}(1);
    core::int v11 = let final self::Test1 #t6 = t in #t6.==(null) ?{core::int} null : let final core::int #t7 = #t6.{self::Test1::prop} in let final core::int #t8 = #t6.{self::Test1::prop} = #t7.{core::num::+}(1) in #t7;
  }
}
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 #t9 = t in #t9.==(null) ?{core::int} null : #t9.{self::Test2::prop} = self::getInt();
    core::num v2 = let final self::Test2 #t10 = t in #t10.==(null) ?{core::num} null : #t10.{self::Test2::prop} = self::getNum();
    core::double v3 = let final self::Test2 #t11 = t in #t11.==(null) ?{core::double} null : #t11.{self::Test2::prop} = self::getDouble();
    core::num v4 = let final self::Test2 #t12 = t in #t12.==(null) ?{core::num} null : let final core::num #t13 = #t12.{self::Test2::prop} in #t13.{core::num::==}(null) ?{core::num} #t12.{self::Test2::prop} = self::getInt() : #t13;
    core::num v5 = let final self::Test2 #t14 = t in #t14.==(null) ?{core::num} null : let final core::num #t15 = #t14.{self::Test2::prop} in #t15.{core::num::==}(null) ?{core::num} #t14.{self::Test2::prop} = self::getNum() : #t15;
    core::num v6 = 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::getDouble() : #t17;
    core::num v7 = let final self::Test2 #t18 = t in #t18.==(null) ?{core::num} null : #t18.{self::Test2::prop} = #t18.{self::Test2::prop}.{core::num::+}(self::getInt());
    core::num v8 = let final self::Test2 #t19 = t in #t19.==(null) ?{core::num} null : #t19.{self::Test2::prop} = #t19.{self::Test2::prop}.{core::num::+}(self::getNum());
    core::num v9 = let final self::Test2 #t20 = t in #t20.==(null) ?{core::num} null : #t20.{self::Test2::prop} = #t20.{self::Test2::prop}.{core::num::+}(self::getDouble());
    core::num v10 = let final self::Test2 #t21 = t in #t21.==(null) ?{core::num} null : #t21.{self::Test2::prop} = #t21.{self::Test2::prop}.{core::num::+}(1);
    core::num v11 = let final self::Test2 #t22 = t in #t22.==(null) ?{core::num} null : let final core::num #t23 = #t22.{self::Test2::prop} in let final core::num #t24 = #t22.{self::Test2::prop} = #t23.{core::num::+}(1) in #t23;
  }
}
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::double v3 = let final self::Test3 #t25 = t in #t25.==(null) ?{core::double} null : #t25.{self::Test3::prop} = self::getDouble();
    core::double v6 = let final self::Test3 #t26 = t in #t26.==(null) ?{core::double} null : let final core::double #t27 = #t26.{self::Test3::prop} in #t27.{core::num::==}(null) ?{core::double} #t26.{self::Test3::prop} = self::getDouble() : #t27;
    core::double v7 = let final self::Test3 #t28 = t in #t28.==(null) ?{core::double} null : #t28.{self::Test3::prop} = #t28.{self::Test3::prop}.{core::double::+}(self::getInt());
    core::double v8 = let final self::Test3 #t29 = t in #t29.==(null) ?{core::double} null : #t29.{self::Test3::prop} = #t29.{self::Test3::prop}.{core::double::+}(self::getNum());
    core::double v9 = let final self::Test3 #t30 = t in #t30.==(null) ?{core::double} null : #t30.{self::Test3::prop} = #t30.{self::Test3::prop}.{core::double::+}(self::getDouble());
    core::double v10 = let final self::Test3 #t31 = t in #t31.==(null) ?{core::double} null : #t31.{self::Test3::prop} = #t31.{self::Test3::prop}.{core::double::+}(1);
    core::double v11 = let final self::Test3 #t32 = t in #t32.==(null) ?{core::double} null : let final core::double #t33 = #t32.{self::Test3::prop} in let final core::double #t34 = #t32.{self::Test3::prop} = #t33.{core::double::+}(1) in #t33;
  }
}
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 {}
