library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:21:7: Error: The non-abstract class 'ConcreteClass' is missing implementations for these members:
//  - ConcreteClass.declareAbstractImplementMultipleField
//  - Interface1.implementMultipleField
//  - Interface2.implementMultipleField
// Try to either
//  - provide an implementation,
//  - inherit an implementation from a superclass or mixin,
//  - mark the class as abstract, or
//  - provide a 'noSuchMethod' implementation.
//
// class ConcreteClass implements Interface1, Interface2 {
//       ^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:24:22: Context: 'ConcreteClass.declareAbstractImplementMultipleField' is defined here.
//   abstract final int declareAbstractImplementMultipleField;
//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:6:13: Context: 'Interface1.implementMultipleField' is defined here.
//   final int implementMultipleField = 0;
//             ^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:14:13: Context: 'Interface2.implementMultipleField' is defined here.
//   final int implementMultipleField = 0;
//             ^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:33:7: Error: The non-abstract class 'ConcreteSub' is missing implementations for these members:
//  - AbstractClass.declareAbstractImplementMultipleField
//  - Interface1.declareAbstractImplementMultipleField
//  - Interface1.implementMultipleField
//  - Interface2.declareAbstractImplementMultipleField
//  - Interface2.implementMultipleField
// Try to either
//  - provide an implementation,
//  - inherit an implementation from a superclass or mixin,
//  - mark the class as abstract, or
//  - provide a 'noSuchMethod' implementation.
//
// class ConcreteSub extends AbstractClass {}
//       ^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:30:22: Context: 'AbstractClass.declareAbstractImplementMultipleField' is defined here.
//   abstract final int declareAbstractImplementMultipleField;
//                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:10:13: Context: 'Interface1.declareAbstractImplementMultipleField' is defined here.
//   final int declareAbstractImplementMultipleField = 0;
//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:6:13: Context: 'Interface1.implementMultipleField' is defined here.
//   final int implementMultipleField = 0;
//             ^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:18:13: Context: 'Interface2.declareAbstractImplementMultipleField' is defined here.
//   final int declareAbstractImplementMultipleField = 0;
//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/nnbd_mixed/hierarchy/implement_multiple_final_field.dart:14:13: Context: 'Interface2.implementMultipleField' is defined here.
//   final int implementMultipleField = 0;
//             ^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;

class Interface1 extends core::Object {
  final field core::int implementMultipleField = 0;
  final field core::int declareConcreteImplementMultipleField = 0;
  final field core::int declareAbstractImplementMultipleField = 0;
  synthetic constructor •() → self::Interface1
    : super core::Object::•()
    ;
}
class Interface2 extends core::Object {
  final field core::int implementMultipleField = 0;
  final field core::int declareConcreteImplementMultipleField = 0;
  final field core::int declareAbstractImplementMultipleField = 0;
  synthetic constructor •() → self::Interface2
    : super core::Object::•()
    ;
}
class ConcreteClass extends core::Object implements self::Interface1, self::Interface2 {
  final field core::int declareConcreteImplementMultipleField = 0;
  synthetic constructor •() → self::ConcreteClass
    : super core::Object::•()
    ;
  abstract get declareAbstractImplementMultipleField() → core::int;
}
abstract class AbstractClass extends core::Object implements self::Interface1, self::Interface2 {
  final field core::int declareConcreteImplementMultipleField = 0;
  synthetic constructor •() → self::AbstractClass
    : super core::Object::•()
    ;
  abstract get declareAbstractImplementMultipleField() → core::int;
}
class ConcreteSub extends self::AbstractClass {
  synthetic constructor •() → self::ConcreteSub
    : super self::AbstractClass::•()
    ;
}
static method main() → dynamic {}
