library test;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:32:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
// Try adding an explicit type.
//   var x;
//       ^
//
// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:36:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
// Try adding an explicit type.
//   var x;
//       ^
//
// pkg/front_end/testcases/inference/infer_field_override_multiple.dart:40:7: Error: Can't infer a type for 'x' as some of the inherited members have different types.
// Try adding an explicit type.
//   var x;
//       ^
//
import self as self;
import "dart:core" as core;

abstract class A extends core::Object {
  synthetic constructor •() → self::A*
    : super core::Object::•()
    ;
  abstract get x() → core::int*;
}
abstract class B extends core::Object {
  synthetic constructor •() → self::B*
    : super core::Object::•()
    ;
  abstract get x() → core::int*;
}
abstract class C extends core::Object {
  synthetic constructor •() → self::C*
    : super core::Object::•()
    ;
  abstract get x() → core::num*;
}
abstract class D extends core::Object {
  synthetic constructor •() → self::D*
    : super core::Object::•()
    ;
  abstract get x() → core::double*;
}
class E extends self::A implements self::B {
  field core::int* x = null;
  synthetic constructor •() → self::E*
    : super self::A::•()
    ;
}
class F extends self::A implements self::C {
  field invalid-type x = null;
  synthetic constructor •() → self::F*
    : super self::A::•()
    ;
}
class G extends self::A implements self::D {
  field invalid-type x = null;
  synthetic constructor •() → self::G*
    : super self::A::•()
    ;
}
class H extends self::C implements self::D {
  field invalid-type x = null;
  synthetic constructor •() → self::H*
    : super self::C::•()
    ;
}
static method main() → dynamic {}
