library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/issue48402.dart:19:17: Error: Can't declare a member that conflicts with an inherited one.
//   static String member1 = "member1"; // Error.
//                 ^^^^^^^
// pkg/front_end/testcases/general/issue48402.dart:6:14: Context: This is the inherited member.
//   String get member1;
//              ^^^^^^^
//
// pkg/front_end/testcases/general/issue48402.dart:22:15: Error: Can't declare a member that conflicts with an inherited one.
//   static void procedure() {} // Error.
//               ^^^^^^^^^
// pkg/front_end/testcases/general/issue48402.dart:7:14: Context: This is the inherited member.
//   String get procedure;
//              ^^^^^^^^^
//
// pkg/front_end/testcases/general/issue48402.dart:24:19: Error: Can't declare a member that conflicts with an inherited one.
//   static void set setter(String value) {} // Error.
//                   ^^^^^^
// pkg/front_end/testcases/general/issue48402.dart:8:12: Context: This is the inherited member.
//   void set setter(String value);
//            ^^^^^^
//
// pkg/front_end/testcases/general/issue48402.dart:26:17: Error: Can't declare a member that conflicts with an inherited one.
//   static String fieldSetter = "fieldSetter"; // Error.
//                 ^^^^^^^^^^^
// pkg/front_end/testcases/general/issue48402.dart:9:12: Context: This is the inherited member.
//   void set fieldSetter(String value);
//            ^^^^^^^^^^^
//
// pkg/front_end/testcases/general/issue48402.dart:28:18: Error: Can't declare a member that conflicts with an inherited one.
//   static num get setterVsGetter => 0; // Error.
//                  ^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/issue48402.dart:10:12: Context: This is the inherited member.
//   void set setterVsGetter(num value);
//            ^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/issue48402.dart:30:19: Error: Can't declare a member that conflicts with an inherited one.
//   static void set getterVsSetter(double value) {} // Error.
//                   ^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/issue48402.dart:11:14: Context: This is the inherited member.
//   double get getterVsSetter;
//              ^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;

abstract class I extends core::Object {
  synthetic constructor •() → self::I
    : super core::Object::•()
    ;
  abstract get member1() → core::String;
  abstract get procedure() → core::String;
  abstract set setter(core::String value) → void;
  abstract set fieldSetter(core::String value) → void;
  abstract set setterVsGetter(core::num value) → void;
  abstract get getterVsSetter() → core::double;
}
class A extends core::Object implements self::I {
  static field core::String member5 = "member5";
  static field core::String member4 = "member4";
  static field core::String member3 = "member3";
  static field core::String member1 = "member1";
  static field core::String member2 = "member2";
  static field core::String fieldSetter = "fieldSetter";
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
  static method procedure() → void {}
  static set setter(core::String value) → void {}
  static get setterVsGetter() → core::num
    return 0;
  static set getterVsSetter(core::double value) → void {}
  method noSuchMethod(core::Invocation i) → dynamic
    return "foo";
  synthetic no-such-method-forwarder set setterVsGetter(core::num value) → void
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(#C3))){(core::Invocation) → dynamic};
  synthetic no-such-method-forwarder get getterVsSetter() → core::double
    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C4, 1, #C2, #C5, core::Map::unmodifiable<core::Symbol, dynamic>(#C3))){(core::Invocation) → dynamic} as{TypeError,ForDynamic} core::double;
}
static method main() → dynamic {}

constants  {
  #C1 = #setterVsGetter=
  #C2 = <core::Type>[]
  #C3 = <core::Symbol, dynamic>{}
  #C4 = #getterVsSetter
  #C5 = <dynamic>[]
}
