library;
import self as self;
import "dart:core" as core;
import "./mixin_library.dart" as mix;

class Super<S extends core::Object> extends core::Object {
  default constructor •() → void
    : super core::Object::•()
    ;
  method foo() → dynamic
    return 40;
  method f() → dynamic
    return 3;
}
abstract class _Super&Mixin^#T0^#T0<#T0 extends core::Object> = self::Super<self::_Super&Mixin^#T0^#T0::#T0> with mix::Mixin<self::_Super&Mixin^#T0^#T0::#T0> {
}
class C<V extends core::Object> extends self::_Super&Mixin^#T0^#T0<self::C::V> {
  default constructor •() → void
    : super self::Super::•()
    ;
}
abstract class _Super&Mixin = self::Super<dynamic> with mix::Mixin<dynamic> {
  abstract forwarding-stub method g(generic-covariant-impl dynamic a) → dynamic;
  abstract forwarding-stub set t(generic-covariant-impl dynamic _) → void;
}
class D extends self::_Super&Mixin {
  default constructor •() → void
    : super self::Super::•()
    ;
  abstract forwarding-stub set t(generic-covariant-impl dynamic _) → void;
}
class C2<V extends core::Object> = self::Super<self::C2::V> with mix::Mixin<self::C2::V> {
  constructor •() → void
    : super self::Super::•()
    ;
}
class D2 = self::Super<dynamic> with mix::Mixin<dynamic> {
  constructor •() → void
    : super self::Super::•()
    ;
  abstract forwarding-stub method g(generic-covariant-impl dynamic a) → dynamic;
  abstract forwarding-stub set t(generic-covariant-impl dynamic _) → void;
}
static method main() → dynamic {
  core::print(new self::C::•<dynamic>().{mix::Mixin::foo}());
  core::print(new self::C2::•<dynamic>().{mix::Mixin::foo}());
}
