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;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
// Try changing the type of the left hand side, or casting the right hand side to 'int'.
//       . /*@target=A::value*/ value;
//                              ^
//
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 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
Try changing the type of the left hand side, or casting the right hand side to 'int'.
      . /*@target=A::value*/ value;
                             ^" in new test::B::•<core::String>().{test::B::m}(null, null).{test::A::value} as{TypeError} core::int;
  core::String z = new test::B::•<core::String>().{test::B::m}(null, null).{test::A::value};
}
static method main() → dynamic {}
