library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:50:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
// Try adding an explicit type.
//   get getterFromGetter;
//       ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:52:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
// Try adding an explicit type.
//   set setterFromSetter(value);
//                        ^^^^^
//
// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:80:7: Error: Can't infer a return type for 'getterFromGetter' as some of the inherited members have different types.
// Try adding an explicit type.
//   get getterFromGetter;
//       ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/override_inference_for_getters_and_setters.dart:82:24: Error: Can't infer a type for 'value' as some of the inherited members have different types.
// Try adding an explicit type.
//   set setterFromSetter(value);
//                        ^^^^^
//
import self as self;
import "dart:core" as core;

abstract class A extends core::Object {
  synthetic constructor •() → self::A*
    ;
  abstract get getterFromGetter() → core::num*;
  abstract set setterFromSetter(core::num* value) → void;
  abstract set getterFromSetter(core::num* value) → void;
  abstract get setterFromGetter() → core::num*;
  abstract get getterFromGetterWithSetterConflict() → core::num*;
  abstract set getterFromGetterWithSetterConflict(dynamic num) → void;
  abstract get setterFromSetterWithGetterConflict() → core::num*;
  abstract set setterFromSetterWithGetterConflict(dynamic num) → void;
}
abstract class B extends core::Object {
  synthetic constructor •() → self::B*
    ;
  abstract get getterFromGetter() → core::int*;
  abstract set setterFromSetter(core::int* value) → void;
  abstract get setterFromGetter() → core::int*;
  abstract get setterFromSetterWithGetterConflict() → core::int*;
  abstract set getterFromGetterWithSetterConflict(core::int* value) → void;
  abstract set getterFromSetter(core::int* value) → void;
}
abstract class C extends self::A {
  synthetic constructor •() → self::C*
    ;
  abstract get getterFromGetter() → core::num*;
  abstract set setterFromSetter(core::num* value) → void;
  abstract get getterFromSetter() → core::num*;
  abstract set setterFromGetter(core::num* value) → void;
  abstract get getterFromGetterWithSetterConflict() → core::num*;
  abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
}
abstract class D extends self::A implements self::B {
  synthetic constructor •() → self::D*
    ;
  abstract get getterFromGetter() → invalid-type;
  abstract set setterFromSetter(invalid-type value) → void;
  abstract get getterFromSetter() → core::num*;
  abstract set setterFromGetter(core::num* value) → void;
  abstract get getterFromGetterWithSetterConflict() → core::num*;
  abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
  abstract forwarding-stub get setterFromGetter() → core::int*;
  abstract forwarding-stub get setterFromSetterWithGetterConflict() → core::int*;
}
abstract class E extends core::Object implements self::A {
  synthetic constructor •() → self::E*
    ;
  abstract get getterFromGetter() → core::num*;
  abstract set setterFromSetter(core::num* value) → void;
  abstract get getterFromSetter() → core::num*;
  abstract set setterFromGetter(core::num* value) → void;
  abstract get getterFromGetterWithSetterConflict() → core::num*;
  abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
}
abstract class F extends core::Object implements self::A, self::B {
  synthetic constructor •() → self::F*
    ;
  abstract get getterFromGetter() → invalid-type;
  abstract set setterFromSetter(invalid-type value) → void;
  abstract get getterFromSetter() → dynamic;
  abstract set setterFromGetter(dynamic value) → void;
  abstract get getterFromGetterWithSetterConflict() → core::num*;
  abstract set setterFromSetterWithGetterConflict(dynamic value) → void;
  abstract forwarding-stub get setterFromGetter() → core::int*;
  abstract forwarding-stub get setterFromSetterWithGetterConflict() → core::int*;
}
static method main() → dynamic
  ;
