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'.
//       . /*@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'.
      . /*@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 {}
