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 self;
import "dart:core" as core;
import "./infer_types_on_generic_instantiations_in_library_cycle_a.dart" as inf;

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

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

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 •() → inf::I<inf::I::E>
    : super core::Object::•()
    ;
  abstract method m(dynamic a, (dynamic, core::int) → core::String f) → self::A<inf::I::E>;
}
static method main() → dynamic {}
