library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
// class Class2b extends Class2a with Mixin1 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
//     super.method1();
//           ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
// class Class2b extends Class2a with Mixin1 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
//     return super.property1;
//                  ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
// class Class2b extends Class2a with Mixin1 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
//     super.property1 = value;
//           ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
// class Class2b extends Class2a with Mixin1 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
//     return super.field1 = super.field1 + 1;
//                                 ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:43:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
// class Class2b extends Class2a with Mixin1 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
//     return super.field1 = super.field1 + 1;
//                  ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
// class Class3b extends Class3a with Mixin1 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main.dart:17:11: Context: This is the super-access that doesn't have a concrete target.
//     super.method1();
//           ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
// class Class3b extends Class3a with Mixin1 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main.dart:23:18: Context: This is the super-access that doesn't have a concrete target.
//     return super.property1;
//                  ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
// class Class3b extends Class3a with Mixin1 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
//     super.property1 = value;
//           ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
// class Class3b extends Class3a with Mixin1 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main.dart:9:33: Context: This is the super-access that doesn't have a concrete target.
//     return super.field1 = super.field1 + 1;
//                                 ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:47:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
// class Class3b extends Class3a with Mixin1 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main.dart:9:18: Context: This is the super-access that doesn't have a concrete target.
//     return super.field1 = super.field1 + 1;
//                  ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
// class Class5b extends Class5a with Mixin2 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
//     super.method1();
//           ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
// class Class5b extends Class5a with Mixin2 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
//     return super.property1;
//                  ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
// class Class5b extends Class5a with Mixin2 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
//     super.property1 = value;
//           ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
// class Class5b extends Class5a with Mixin2 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
//     return super.field1 = super.field1 + 1;
//                                 ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:55:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
// class Class5b extends Class5a with Mixin2 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
//     return super.field1 = super.field1 + 1;
//                  ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-invoked member 'method1'.
// class Class6b extends Class6a with Mixin2 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main_lib.dart:27:11: Context: This is the super-access that doesn't have a concrete target.
//     super.method1();
//           ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'property1'.
// class Class6b extends Class6a with Mixin2 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main_lib.dart:33:18: Context: This is the super-access that doesn't have a concrete target.
//     return super.property1;
//                  ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property1'.
// class Class6b extends Class6a with Mixin2 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main_lib.dart:37:11: Context: This is the super-access that doesn't have a concrete target.
//     super.property1 = value;
//           ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed member 'field1'.
// class Class6b extends Class6a with Mixin2 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main_lib.dart:19:33: Context: This is the super-access that doesn't have a concrete target.
//     return super.field1 = super.field1 + 1;
//                                 ^
//
// pkg/front_end/testcases/general/mixin_super/main.dart:59:36: Error: The class doesn't have a concrete implementation of the super-accessed setter 'field1'.
// class Class6b extends Class6a with Mixin2 /* Error */ {}
//                                    ^
// pkg/front_end/testcases/general/mixin_super/main_lib.dart:19:18: Context: This is the super-access that doesn't have a concrete target.
//     return super.field1 = super.field1 + 1;
//                  ^
//
import self as self;
import "dart:core" as core;
import "main_lib.dart" as mai;

import "org-dartlang-testcase:///main_lib.dart";

abstract class _Mixin1&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/  {
  synthetic constructor •() → self::_Mixin1&Super1&Super2
    : super core::Object::•()
    ;
}
abstract class Mixin1 extends self::_Mixin1&Super1&Super2 /*isMixinDeclaration*/  {
  late field core::int field1 = (() → core::int {
    return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
  })(){() → core::int};
  late field core::int field2 = (() → core::int {
    return 88;
  })(){() → core::int};
  method method1() → void {
    super.{mai::Super1::method1}();
  }
  method method2() → void {}
  get property1() → core::int {
    return super.{mai::Super1::property1};
  }
  set property1(core::int value) → void {
    super.{mai::Super1::property1} = value;
  }
  get property2() → core::int {
    return 42;
  }
  set property2(core::int value) → void {}
}
abstract class Class1a extends mai::Super1 implements mai::Super2 {
  synthetic constructor •() → self::Class1a
    : super mai::Super1::•()
    ;
}
abstract class _Class1b&Class1a&Mixin1 extends self::Class1a implements self::Mixin1 /*isAnonymousMixin,isEliminatedMixin*/  {
  late field core::int field1 = (() → core::int {
    return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
  })(){() → core::int};
  late field core::int field2 = (() → core::int {
    return 88;
  })(){() → core::int};
  synthetic constructor •() → self::_Class1b&Class1a&Mixin1
    : super self::Class1a::•()
    ;
  get property1() → core::int {
    return super.{mai::Super1::property1};
  }
  get property2() → core::int {
    return 42;
  }
  method method1() → void {
    super.{mai::Super1::method1}();
  }
  method method2() → void {}
  set property1(core::int value) → void {
    super.{mai::Super1::property1} = value;
  }
  set property2(core::int value) → void {}
}
class Class1b extends self::_Class1b&Class1a&Mixin1 {
  synthetic constructor •() → self::Class1b
    : super self::_Class1b&Class1a&Mixin1::•()
    ;
}
abstract class Class2a extends mai::Super2 implements mai::Super1 {
  synthetic constructor •() → self::Class2a
    : super mai::Super2::•()
    ;
}
abstract class _Class2b&Class2a&Mixin1 extends self::Class2a implements self::Mixin1 /*isAnonymousMixin,isEliminatedMixin*/  {
  late field core::int field1 = (() → core::int {
    return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
  })(){() → core::int};
  late field core::int field2 = (() → core::int {
    return 88;
  })(){() → core::int};
  synthetic constructor •() → self::_Class2b&Class2a&Mixin1
    : super self::Class2a::•()
    ;
  get property1() → core::int {
    return super.{mai::Super1::property1};
  }
  get property2() → core::int {
    return 42;
  }
  method method1() → void {
    super.{mai::Super1::method1}();
  }
  method method2() → void {}
  set property1(core::int value) → void {
    super.{mai::Super1::property1} = value;
  }
  set property2(core::int value) → void {}
}
class Class2b extends self::_Class2b&Class2a&Mixin1 {
  synthetic constructor •() → self::Class2b
    : super self::_Class2b&Class2a&Mixin1::•()
    ;
}
abstract class Class3a extends core::Object implements mai::Super1, mai::Super2 {
  synthetic constructor •() → self::Class3a
    : super core::Object::•()
    ;
}
abstract class _Class3b&Class3a&Mixin1 extends self::Class3a implements self::Mixin1 /*isAnonymousMixin,isEliminatedMixin*/  {
  late field core::int field1 = (() → core::int {
    return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
  })(){() → core::int};
  late field core::int field2 = (() → core::int {
    return 88;
  })(){() → core::int};
  synthetic constructor •() → self::_Class3b&Class3a&Mixin1
    : super self::Class3a::•()
    ;
  get property1() → core::int {
    return super.{mai::Super1::property1};
  }
  get property2() → core::int {
    return 42;
  }
  method method1() → void {
    super.{mai::Super1::method1}();
  }
  method method2() → void {}
  set property1(core::int value) → void {
    super.{mai::Super1::property1} = value;
  }
  set property2(core::int value) → void {}
}
class Class3b extends self::_Class3b&Class3a&Mixin1 {
  synthetic constructor •() → self::Class3b
    : super self::_Class3b&Class3a&Mixin1::•()
    ;
}
abstract class Class4a extends mai::Super1 implements mai::Super2 {
  synthetic constructor •() → self::Class4a
    : super mai::Super1::•()
    ;
}
abstract class _Class4b&Class4a&Mixin2 extends self::Class4a implements mai::Mixin2 /*isAnonymousMixin,isEliminatedMixin*/  {
  late field core::int field1 = (() → core::int {
    return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
  })(){() → core::int}/* from org-dartlang-testcase:///main_lib.dart */;
  late field core::int field2 = (() → core::int {
    return 88;
  })(){() → core::int}/* from org-dartlang-testcase:///main_lib.dart */;
  synthetic constructor •() → self::_Class4b&Class4a&Mixin2
    : super self::Class4a::•()
    ;
  get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
    return super.{mai::Super1::property1};
  }
  get /* from org-dartlang-testcase:///main_lib.dart */ property2() → core::int {
    return 42;
  }
  method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
    super.{mai::Super1::method1}();
  }
  method /* from org-dartlang-testcase:///main_lib.dart */ method2() → void {}
  set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
    super.{mai::Super1::property1} = value;
  }
  set /* from org-dartlang-testcase:///main_lib.dart */ property2(core::int value) → void {}
}
class Class4b extends self::_Class4b&Class4a&Mixin2 {
  synthetic constructor •() → self::Class4b
    : super self::_Class4b&Class4a&Mixin2::•()
    ;
}
abstract class Class5a extends mai::Super2 implements mai::Super1 {
  synthetic constructor •() → self::Class5a
    : super mai::Super2::•()
    ;
}
abstract class _Class5b&Class5a&Mixin2 extends self::Class5a implements mai::Mixin2 /*isAnonymousMixin,isEliminatedMixin*/  {
  late field core::int field1 = (() → core::int {
    return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
  })(){() → core::int}/* from org-dartlang-testcase:///main_lib.dart */;
  late field core::int field2 = (() → core::int {
    return 88;
  })(){() → core::int}/* from org-dartlang-testcase:///main_lib.dart */;
  synthetic constructor •() → self::_Class5b&Class5a&Mixin2
    : super self::Class5a::•()
    ;
  get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
    return super.{mai::Super1::property1};
  }
  get /* from org-dartlang-testcase:///main_lib.dart */ property2() → core::int {
    return 42;
  }
  method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
    super.{mai::Super1::method1}();
  }
  method /* from org-dartlang-testcase:///main_lib.dart */ method2() → void {}
  set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
    super.{mai::Super1::property1} = value;
  }
  set /* from org-dartlang-testcase:///main_lib.dart */ property2(core::int value) → void {}
}
class Class5b extends self::_Class5b&Class5a&Mixin2 {
  synthetic constructor •() → self::Class5b
    : super self::_Class5b&Class5a&Mixin2::•()
    ;
}
abstract class Class6a extends core::Object implements mai::Super1, mai::Super2 {
  synthetic constructor •() → self::Class6a
    : super core::Object::•()
    ;
}
abstract class _Class6b&Class6a&Mixin2 extends self::Class6a implements mai::Mixin2 /*isAnonymousMixin,isEliminatedMixin*/  {
  late field core::int field1 = (() → core::int {
    return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
  })(){() → core::int}/* from org-dartlang-testcase:///main_lib.dart */;
  late field core::int field2 = (() → core::int {
    return 88;
  })(){() → core::int}/* from org-dartlang-testcase:///main_lib.dart */;
  synthetic constructor •() → self::_Class6b&Class6a&Mixin2
    : super self::Class6a::•()
    ;
  get /* from org-dartlang-testcase:///main_lib.dart */ property1() → core::int {
    return super.{mai::Super1::property1};
  }
  get /* from org-dartlang-testcase:///main_lib.dart */ property2() → core::int {
    return 42;
  }
  method /* from org-dartlang-testcase:///main_lib.dart */ method1() → void {
    super.{mai::Super1::method1}();
  }
  method /* from org-dartlang-testcase:///main_lib.dart */ method2() → void {}
  set /* from org-dartlang-testcase:///main_lib.dart */ property1(core::int value) → void {
    super.{mai::Super1::property1} = value;
  }
  set /* from org-dartlang-testcase:///main_lib.dart */ property2(core::int value) → void {}
}
class Class6b extends self::_Class6b&Class6a&Mixin2 {
  synthetic constructor •() → self::Class6b
    : super self::_Class6b&Class6a&Mixin2::•()
    ;
}

library /*isNonNullableByDefault*/;
import self as mai;
import "dart:core" as core;

class Super1 extends core::Object {
  field core::int field1 = 42;
  field core::int property1 = 42;
  synthetic constructor •() → mai::Super1
    : super core::Object::•()
    ;
  method method1() → void {}
}
class Super2 extends core::Object {
  field core::int field2 = 87;
  field core::int property2 = 87;
  synthetic constructor •() → mai::Super2
    : super core::Object::•()
    ;
  method method2() → void {}
}
abstract class _Mixin2&Super1&Super2 extends core::Object implements mai::Super1, mai::Super2 /*isAnonymousMixin*/  {
  synthetic constructor •() → mai::_Mixin2&Super1&Super2
    : super core::Object::•()
    ;
}
abstract class Mixin2 extends mai::_Mixin2&Super1&Super2 /*isMixinDeclaration*/  {
  late field core::int field1 = (() → core::int {
    return super.{mai::Super1::field1} = super.{mai::Super1::field1}.{core::num::+}(1){(core::num) → core::int};
  })(){() → core::int};
  late field core::int field2 = (() → core::int {
    return 88;
  })(){() → core::int};
  method method1() → void {
    super.{mai::Super1::method1}();
  }
  method method2() → void {}
  get property1() → core::int {
    return super.{mai::Super1::property1};
  }
  set property1(core::int value) → void {
    super.{mai::Super1::property1} = value;
  }
  get property2() → core::int {
    return 42;
  }
  set property2(core::int value) → void {}
}
