library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/abstract_members.dart:19:16: Error: Can't inherit members that conflict with each other.
// abstract class A implements Interface1, Interface2, Interface3 {
//                ^
// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
//   void interfaceMethod1() {}
//        ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
//   var interfaceMethod1;
//       ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/abstract_members.dart:27:16: Error: Can't inherit members that conflict with each other.
// abstract class B extends A {
//                ^
// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
//   void interfaceMethod1() {}
//        ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
//   var interfaceMethod1;
//       ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/abstract_members.dart:33:7: Error: Can't inherit members that conflict with each other.
// class MyClass extends B {
//       ^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
//   void interfaceMethod1() {}
//        ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
//   var interfaceMethod1;
//       ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/abstract_members.dart:33:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
//  - A.abstractMethod
//  - A.property1=
//  - A.property3=
//  - Interface1.interfaceMethod1
//  - Interface2.interfaceMethod1
//  - Interface2.interfaceMethod2
//  - Interface3.interfaceMethod3
// 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 MyClass extends B {
//       ^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:21:3: Context: 'A.abstractMethod' is defined here.
//   abstractMethod();
//   ^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
//   void set property1(_);
//            ^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
//   void set property3(_);
//            ^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
//   void interfaceMethod1() {}
//        ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
//   var interfaceMethod1;
//       ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
//   void interfaceMethod2() {}
//        ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
//   void interfaceMethod3() {}
//        ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/abstract_members.dart:42:7: Error: Can't inherit members that conflict with each other.
// class MyMock1 extends B {
//       ^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
//   void interfaceMethod1() {}
//        ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
//   var interfaceMethod1;
//       ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/abstract_members.dart:48:7: Error: Can't inherit members that conflict with each other.
// class MyMock2 extends MyMock1 {
//       ^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
//   void interfaceMethod1() {}
//        ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
//   var interfaceMethod1;
//       ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/abstract_members.dart:54:7: Error: Can't inherit members that conflict with each other.
// class MyMock3 extends B {
//       ^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
//   void interfaceMethod1() {}
//        ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
//   var interfaceMethod1;
//       ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/abstract_members.dart:54:7: Error: The non-abstract class 'MyMock3' is missing implementations for these members:
//  - A.abstractMethod
//  - A.property1=
//  - A.property2=
//  - A.property3=
//  - Interface1.interfaceMethod1
//  - Interface2.interfaceMethod1
//  - Interface2.interfaceMethod2
//  - Interface3.interfaceMethod3
// 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 MyMock3 extends B {
//       ^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:21:3: Context: 'A.abstractMethod' is defined here.
//   abstractMethod();
//   ^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
//   void set property1(_);
//            ^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:23:12: Context: 'A.property2=' is defined here.
//   void set property2(_);
//            ^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
//   void set property3(_);
//            ^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
//   void interfaceMethod1() {}
//        ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
//   var interfaceMethod1;
//       ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
//   void interfaceMethod2() {}
//        ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
//   void interfaceMethod3() {}
//        ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/abstract_members.dart:64:16: Error: Can't inherit members that conflict with each other.
// abstract class D extends C implements Interface2 {}
//                ^
// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is one inherited member.
//   var interfaceMethod1;
//       ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:59:8: Context: This is the other inherited member.
//   void interfaceMethod1(_) {}
//        ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/abstract_members.dart:72:16: Error: Can't inherit members that conflict with each other.
// abstract class F extends E implements Interface1 {}
//                ^
// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: This is one inherited member.
//   void interfaceMethod1() {}
//        ^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/abstract_members.dart:67:12: Context: This is the other inherited member.
//   void set interfaceMethod1(_) {}
//            ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/abstract_members.dart:84:16: Error: Can't inherit members that conflict with each other.
// abstract class H extends G implements Foo {}
//                ^
// pkg/front_end/testcases/general/abstract_members.dart:75:8: Context: This is one inherited member.
//   void foo() {}
//        ^^^
// pkg/front_end/testcases/general/abstract_members.dart:79:14: Context: This is the other inherited member.
//   Object get foo => null;
//              ^^^
//
// pkg/front_end/testcases/general/abstract_members.dart:96:16: Error: Can't inherit members that conflict with each other.
// abstract class J extends I implements Bar {}
//                ^
// pkg/front_end/testcases/general/abstract_members.dart:87:14: Context: This is one inherited member.
//   Object get foo => null;
//              ^^^
// pkg/front_end/testcases/general/abstract_members.dart:91:10: Context: This is the other inherited member.
//   Object foo() {}
//          ^^^
//
// pkg/front_end/testcases/general/abstract_members.dart:79:21: Error: The value 'null' can't be returned from a function with return type 'Object' because 'Object' is not nullable.
//  - 'Object' is from 'dart:core'.
//   Object get foo => null;
//                     ^
//
// pkg/front_end/testcases/general/abstract_members.dart:87:21: Error: The value 'null' can't be returned from a function with return type 'Object' because 'Object' is not nullable.
//  - 'Object' is from 'dart:core'.
//   Object get foo => null;
//                     ^
//
// pkg/front_end/testcases/general/abstract_members.dart:91:10: Error: A non-null value must be returned since the return type 'Object' doesn't allow null.
//  - 'Object' is from 'dart:core'.
//   Object foo() {}
//          ^
//
import self as self;
import "dart:core" as core;

class Interface1 extends core::Object {
  synthetic constructor •() → self::Interface1
    : super core::Object::•()
    ;
  method interfaceMethod1() → void {}
}
class Interface2 extends core::Object {
  field dynamic interfaceMethod1 = null;
  synthetic constructor •() → self::Interface2
    : super core::Object::•()
    ;
  method interfaceMethod2() → void {}
}
class Interface3 extends core::Object {
  synthetic constructor •() → self::Interface3
    : super core::Object::•()
    ;
  method interfaceMethod3() → void {}
}
abstract class A extends core::Object implements self::Interface1, self::Interface2, self::Interface3 {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  method aMethod() → dynamic {}
  abstract method abstractMethod() → dynamic;
  abstract set property1(dynamic _) → void;
  abstract set property2(dynamic _) → void;
  abstract set property3(dynamic _) → void;
}
abstract class B extends self::A {
  final field dynamic property1 = null;
  synthetic constructor •() → self::B
    : super self::A::•()
    ;
  method aMethod() → dynamic {}
  method bMethod() → dynamic {}
}
class MyClass extends self::B {
  field dynamic property2 = null;
  synthetic constructor •() → self::MyClass
    : super self::B::•()
    ;
  method aaMethod() → dynamic {}
  method aMethod() → dynamic {}
  method bMethod() → dynamic {}
  method cMethod() → dynamic {}
}
class MyMock1 extends self::B {
  synthetic constructor •() → self::MyMock1
    : super self::B::•()
    ;
  method noSuchMethod(core::Invocation _) → dynamic
    return null;
  no-such-method-forwarder method interfaceMethod2() → void
    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic};
  no-such-method-forwarder method abstractMethod() → dynamic
    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic} as{TypeError,ForDynamic,ForNonNullableByDefault} dynamic;
  no-such-method-forwarder method interfaceMethod1() → void
    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic};
  no-such-method-forwarder method interfaceMethod3() → void
    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic};
  no-such-method-forwarder set property3(dynamic _) → void
    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic};
  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic};
  no-such-method-forwarder set property1(dynamic _) → void
    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic};
  no-such-method-forwarder set property2(dynamic _) → void
    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C11, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic};
}
class MyMock2 extends self::MyMock1 {
  synthetic constructor •() → self::MyMock2
    : super self::MyMock1::•()
    ;
  abstract method noSuchMethod(core::Invocation _) → dynamic;
}
class MyMock3 extends self::B {
  synthetic constructor •() → self::MyMock3
    : super self::B::•()
    ;
  abstract method noSuchMethod(core::Invocation _) → dynamic;
}
class C extends core::Object {
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  method interfaceMethod1(dynamic _) → void {}
}
abstract class D extends self::C implements self::Interface2 {
  synthetic constructor •() → self::D
    : super self::C::•()
    ;
}
class E extends core::Object {
  synthetic constructor •() → self::E
    : super core::Object::•()
    ;
  set interfaceMethod1(dynamic _) → void {}
}
abstract class F extends self::E implements self::Interface1 {
  synthetic constructor •() → self::F
    : super self::E::•()
    ;
}
class Foo extends core::Object {
  synthetic constructor •() → self::Foo
    : super core::Object::•()
    ;
  method foo() → void {}
}
class G extends core::Object {
  synthetic constructor •() → self::G
    : super core::Object::•()
    ;
  get foo() → core::Object
    return invalid-expression "pkg/front_end/testcases/general/abstract_members.dart:79:21: Error: The value 'null' can't be returned from a function with return type 'Object' because 'Object' is not nullable.
 - 'Object' is from 'dart:core'.
  Object get foo => null;
                    ^" in null as{TypeError,ForNonNullableByDefault} core::Object;
}
abstract class H extends self::G implements self::Foo {
  synthetic constructor •() → self::H
    : super self::G::•()
    ;
}
class Bar extends core::Object {
  synthetic constructor •() → self::Bar
    : super core::Object::•()
    ;
  get foo() → core::Object
    return invalid-expression "pkg/front_end/testcases/general/abstract_members.dart:87:21: Error: The value 'null' can't be returned from a function with return type 'Object' because 'Object' is not nullable.
 - 'Object' is from 'dart:core'.
  Object get foo => null;
                    ^" in null as{TypeError,ForNonNullableByDefault} core::Object;
}
class I extends core::Object {
  synthetic constructor •() → self::I
    : super core::Object::•()
    ;
  method foo() → core::Object {
    return invalid-expression "pkg/front_end/testcases/general/abstract_members.dart:91:10: Error: A non-null value must be returned since the return type 'Object' doesn't allow null.
 - 'Object' is from 'dart:core'.
  Object foo() {}
         ^" in null;
  }
}
abstract class J extends self::I implements self::Bar {
  synthetic constructor •() → self::J
    : super self::I::•()
    ;
}
static method main() → dynamic {}

constants  {
  #C1 = #interfaceMethod2
  #C2 = <core::Type*>[]
  #C3 = <dynamic>[]
  #C4 = <core::Symbol*, dynamic>{)
  #C5 = #abstractMethod
  #C6 = #interfaceMethod1
  #C7 = #interfaceMethod3
  #C8 = #property3=
  #C9 = #interfaceMethod1=
  #C10 = #property1=
  #C11 = #property2=
}
