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

class A extends core::Object {
  field core::bool v1;
  field core::num v2;
  constructor •(core::bool v1, core::num v2) → self::A
    : self::A::v1 = v1, self::A::v2 = v2, super core::Object::•()
    ;
}
class M1 extends core::Object {
  field core::num v2 = 1.{core::int::unary-}(){() → core::int};
  synthetic constructor •() → self::M1
    : super core::Object::•()
    ;
}
class C = self::A with self::M1 {
  synthetic constructor •(core::bool v1, core::num v2) → self::C
    : super self::A::•(v1, v2)
    ;
  mixin-super-stub get v2() → core::num
    return super.{self::M1::v2};
  mixin-super-stub set v2(core::num value) → void
    return super.{self::M1::v2} = value;
}
static method main() → dynamic {
  self::C c = new self::C::•(true, 2);
  self::expect(true, c.{self::A::v1}{core::bool});
  self::expect(1.{core::int::unary-}(){() → core::int}, c.{self::C::v2}{core::num});
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}
