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

static method getInt() → core::int
  return 0;
static method getNum() → core::num
  return 0;
static method getDouble() → core::double
  return 0.0;
static method test1(core::int t) → void {
  dynamic v1 = t = self::getInt();
  dynamic v4 = let final dynamic #t1 = t in #t1.==(null) ? t = self::getInt() : #t1;
  dynamic v7 = t = t.+(self::getInt());
  dynamic v8 = t = t.+(self::getNum());
  dynamic v10 = t = t.+(1);
  dynamic v11 = let final dynamic #t2 = t in let final dynamic #t3 = t = #t2.+(1) in #t2;
}
static method test2(core::num t) → void {
  dynamic v1 = t = self::getInt();
  dynamic v2 = t = self::getNum();
  dynamic v3 = t = self::getDouble();
  dynamic v4 = let final dynamic #t4 = t in #t4.==(null) ? t = self::getInt() : #t4;
  dynamic v5 = let final dynamic #t5 = t in #t5.==(null) ? t = self::getNum() : #t5;
  dynamic v6 = let final dynamic #t6 = t in #t6.==(null) ? t = self::getDouble() : #t6;
  dynamic v7 = t = t.+(self::getInt());
  dynamic v8 = t = t.+(self::getNum());
  dynamic v9 = t = t.+(self::getDouble());
  dynamic v10 = t = t.+(1);
  dynamic v11 = let final dynamic #t7 = t in let final dynamic #t8 = t = #t7.+(1) in #t7;
}
static method test3(core::double t) → void {
  dynamic v3 = t = self::getDouble();
  dynamic v6 = let final dynamic #t9 = t in #t9.==(null) ? t = self::getDouble() : #t9;
  dynamic v7 = t = t.+(self::getInt());
  dynamic v8 = t = t.+(self::getNum());
  dynamic v9 = t = t.+(self::getDouble());
  dynamic v10 = t = t.+(1);
  dynamic v11 = let final dynamic #t10 = t in let final dynamic #t11 = t = #t10.+(1) in #t10;
}
static method main() → dynamic {}
