library test.mixin_library;
//
// Problems in library:
//
// pkg/front_end/testcases/rasta/mixin_library.dart:16:18: Error: Superclass has no method named 'foo'.
//   foo() => super.foo() + f();
//                  ^^^
//
import self as self;
import "dart:core" as core;

class Mixin<T extends core::Object* = dynamic> extends core::Object {
  field dynamic x = self::f();
  field dynamic y = null;
  field dynamic z = null;
  generic-covariant-impl field self::Mixin::T* t = null;
  synthetic constructor •() → self::Mixin<self::Mixin::T*>*
    : super core::Object::•()
    ;
  method foo() → dynamic
    return super.foo().+(self::f());
  method g(generic-covariant-impl self::Mixin::T* a) → self::Mixin::T*
    return null;
  method h() → dynamic
    return self::V();
  method l() → dynamic
    return self::_private();
  method _privateMethod() → dynamic
    return 49;
  method publicMethod() → dynamic
    return this.{self::Mixin::_privateMethod}();
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static method f() → dynamic
  return 2;
static method V() → dynamic
  return 87;
static method _private() → dynamic
  return 117;
static method foo(dynamic m) → dynamic
  return m._privateMethod();
