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

abstract class I<E extends core::Object = dynamic> 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 = dynamic> 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 = dynamic> 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 {}
