library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/abstract_super_application.dart:26:7: Error: 'Object' doesn't implement 'Super' so it can't be used with 'Mixin'.
//  - 'Object' is from 'dart:core'.
//  - 'Super' is from 'pkg/front_end/testcases/general/abstract_super_application.dart'.
//  - 'Mixin' is from 'pkg/front_end/testcases/general/abstract_super_application.dart'.
// class Class2 with Mixin implements Super {}
//       ^
//
// pkg/front_end/testcases/general/abstract_super_application.dart:26:19: Error: The class doesn't have a concrete implementation of the super-invoked member 'method'.
// class Class2 with Mixin implements Super {}
//                   ^
// pkg/front_end/testcases/general/abstract_super_application.dart:12:11: Context: This is the super-access that doesn't have a concrete target.
//     super.method();
//           ^
//
// pkg/front_end/testcases/general/abstract_super_application.dart:26:19: Error: The class doesn't have a concrete implementation of the super-accessed member 'property'.
// class Class2 with Mixin implements Super {}
//                   ^
// pkg/front_end/testcases/general/abstract_super_application.dart:16:18: Context: This is the super-access that doesn't have a concrete target.
//     return super.property;
//                  ^
//
// pkg/front_end/testcases/general/abstract_super_application.dart:26:19: Error: The class doesn't have a concrete implementation of the super-accessed setter 'property'.
// class Class2 with Mixin implements Super {}
//                   ^
// pkg/front_end/testcases/general/abstract_super_application.dart:20:11: Context: This is the super-access that doesn't have a concrete target.
//     super.property = value;
//           ^
//
import self as self;
import "dart:core" as core;

class Super extends core::Object {
  field core::int property = 42;
  synthetic constructor •() → self::Super
    : super core::Object::•()
    ;
  method method() → void {}
}
abstract class Mixin extends self::Super /*isMixinDeclaration*/  {
  method method() → void {
    super.{self::Super::method}();
  }
  get property() → core::int {
    return super.{self::Super::property};
  }
  set property(core::int value) → void {
    super.{self::Super::property} = value;
  }
}
abstract class _Class1&Super&Mixin extends self::Super implements self::Mixin /*isAnonymousMixin,isEliminatedMixin*/  {
  synthetic constructor •() → self::_Class1&Super&Mixin
    : super self::Super::•()
    ;
  get property() → core::int {
    return super.{self::Super::property};
  }
  set property(core::int value) → void {
    super.{self::Super::property} = value;
  }
  method method() → void {
    super.{self::Super::method}();
  }
}
class Class1 extends self::_Class1&Super&Mixin {
  synthetic constructor •() → self::Class1
    : super self::_Class1&Super&Mixin::•()
    ;
}
abstract class _Class2&Object&Mixin extends core::Object implements self::Mixin /*isAnonymousMixin,isEliminatedMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_Class2&Object&Mixin
    : super core::Object::•()
    ;
  get property() → core::int {
    return super.{self::Super::property};
  }
  set property(core::int value) → void {
    super.{self::Super::property} = value;
  }
  method method() → void {
    super.{self::Super::method}();
  }
}
class Class2 extends self::_Class2&Object&Mixin implements self::Super {
  synthetic constructor •() → self::Class2
    : super self::_Class2&Object&Mixin::•()
    ;
}
