library test;
import self as self;
import "dart:core" as core;

abstract class I<E extends core::Object> extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  abstract method m(dynamic a, (dynamic, self::I::E) → core::String f) → core::String;
}
abstract class A<E extends core::Object> extends core::Object implements self::I<self::A::E> {
  const constructor •() → void
    : super core::Object::•()
    ;
  abstract method m(dynamic a, (dynamic, self::A::E) → core::String f) → core::String;
}
abstract class M extends core::Object {
  final field core::int y = 0;
  synthetic constructor •() → void
    : super core::Object::•()
    ;
}
class B<E extends core::Object> extends self::A<self::B::E> implements self::M {
  const constructor •() → void
    : super self::A::•()
    ;
  get y() → core::int
    return 0;
  method m(dynamic a, (dynamic, self::B::E) → dynamic f) → core::String {}
}
static method foo() → dynamic {
  core::int y = let final dynamic #t1 = let<BottomType> _ = null in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'dart.core::String' can't be assigned to a variable of type 'dart.core::int'.
Try changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.
      . /*@target=B::m*/ m(null, null);
                         ^" in let final core::String #t2 = new self::B::•<dynamic>().{self::B::m}(null, null) in null;
  core::String z = new self::B::•<dynamic>().{self::B::m}(null, null);
}
static method main() → dynamic {}
