// Formatted problems:
//
// pkg/front_end/testcases/abstract_members.dart:19:7: Error: The non-abstract class 'MyClass' is missing implementations for these members:
//  - A.abstractMethod
//  - A.property3=
//  - A.property1=
// 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/abstract_members.dart:7:3: Context: 'A.abstractMethod' is defined here.
//   abstractMethod();
//   ^^^^^^^^^^^^^^
// pkg/front_end/testcases/abstract_members.dart:10:12: Context: 'A.property3=' is defined here.
//   void set property3(_);
//            ^^^^^^^^^
// pkg/front_end/testcases/abstract_members.dart:8:12: Context: 'A.property1=' is defined here.
//   void set property1(_);
//            ^^^^^^^^^

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

abstract class A extends core::Object {
  synthetic constructor •() → self::A
    ;
  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;
  synthetic constructor •() → self::B
    ;
  method aMethod() → dynamic
    ;
  method bMethod() → dynamic
    ;
}
class MyClass extends self::B {
  field dynamic property2;
  synthetic constructor •() → self::MyClass
    ;
  method aaMethod() → dynamic
    ;
  method aMethod() → dynamic
    ;
  method bMethod() → dynamic
    ;
  method cMethod() → dynamic
    ;
  no-such-method-forwarder set property3(dynamic _) → void
    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
  no-such-method-forwarder set property1(dynamic _) → void
    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
}
static method main() → dynamic
  ;
