library;
import self as self;
import "dart:core" as core;
import "./infer_types_on_generic_instantiations_in_library_cycle.dart" as test;

import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle.dart";

abstract class I<E extends core::Object = dynamic> extends core::Object {
  synthetic constructor •() → self::I<self::I::E>
    : super core::Object::•()
    ;
  abstract method m(dynamic a, (dynamic, core::int) → core::String f) → test::A<self::I::E>;
}
static method main() → dynamic {}

library test;
import self as test;
import "dart:core" as core;
import "./infer_types_on_generic_instantiations_in_library_cycle_a.dart" as self;

import "org-dartlang-testcase:///infer_types_on_generic_instantiations_in_library_cycle_a.dart";

abstract class A<E extends core::Object = dynamic> extends core::Object implements self::I<test::A::E> {
  final field test::A::E value = null;
  const constructor •() → test::A<test::A::E>
    : super core::Object::•()
    ;
}
abstract class M extends core::Object {
  final field core::int y = 0;
  synthetic constructor •() → test::M
    : super core::Object::•()
    ;
}
class B<E extends core::Object = dynamic> extends test::A<test::B::E> implements test::M {
  const constructor •() → test::B<test::B::E>
    : super test::A::•()
    ;
  get y() → core::int
    return 0;
  method m(dynamic a, (dynamic, core::int) → dynamic f) → test::A<test::B::E> {}
}
static method foo() → dynamic {
  core::int y = new test::B::•<core::String>().m(null, null).value;
  core::String z = new test::B::•<core::String>().m(null, null).value;
}
static method main() → dynamic {}
