library;
//
// Problems in library:
//
// pkg/front_end/testcases/class_modifiers/issue52316/main.dart:9:16: Error: The type 'LegacyExtendsBase' must be 'base', 'final' or 'sealed' because the supertype 'LinkedList' is 'base'.
// Try adding 'base', 'final', or 'sealed' to the type.
// abstract class LegacyExtendsBase<E extends LinkedListEntry<E>>
//                ^
//
// pkg/front_end/testcases/class_modifiers/issue52316/main.dart:13:7: Error: The type 'LegacyExtendsFinal' must be 'base', 'final' or 'sealed' because the supertype 'MapEntry' is 'final'.
// Try adding 'base', 'final', or 'sealed' to the type.
// class LegacyExtendsFinal extends LegacyImplementFinalCore {}
//       ^
//
// pkg/front_end/testcases/class_modifiers/issue52316/main.dart:16:16: Error: The type 'LegacyWithBase' must be 'base', 'final' or 'sealed' because the supertype 'LinkedList' is 'base'.
// Try adding 'base', 'final', or 'sealed' to the type.
// abstract class LegacyWithBase<E extends LinkedListEntry<E>>
//                ^
//
// pkg/front_end/testcases/class_modifiers/issue52316/main.dart:20:7: Error: The type 'LegacyWithFinal' must be 'base', 'final' or 'sealed' because the supertype 'MapEntry' is 'final'.
// Try adding 'base', 'final', or 'sealed' to the type.
// class LegacyWithFinal with LegacyImplementFinalCore {}
//       ^
//
// pkg/front_end/testcases/class_modifiers/issue52316/main.dart:24:7: Error: The mixin 'LegacyOnBase' must be 'base' because the supertype 'LinkedList' is 'base'.
// Try adding 'base' to the mixin.
// mixin LegacyOnBase<E extends LinkedListEntry<E>>
//       ^
//
// pkg/front_end/testcases/class_modifiers/issue52316/main.dart:29:7: Error: The mixin 'LegacyOnFinal' must be 'base' because the supertype 'MapEntry' is 'final'.
// Try adding 'base' to the mixin.
// mixin LegacyOnFinal on LegacyImplementFinalCore {}
//       ^
//
import self as self;
import "dart:collection" as col;
import "main_lib.dart" as mai;
import "dart:core" as core;

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

abstract class LegacyExtendsBase<E extends col::LinkedListEntry<self::LegacyExtendsBase::E> = col::LinkedListEntry<dynamic>> extends mai::LegacyImplementBaseCore<self::LegacyExtendsBase::E> {
  synthetic constructor •() → self::LegacyExtendsBase<self::LegacyExtendsBase::E>
    ;
}
class LegacyExtendsFinal extends mai::LegacyImplementFinalCore {
  synthetic constructor •() → self::LegacyExtendsFinal
    ;
}
abstract class _LegacyWithBase&Object&LegacyImplementBaseCore<E extends col::LinkedListEntry<self::_LegacyWithBase&Object&LegacyImplementBaseCore::E> = col::LinkedListEntry<dynamic>> = core::Object with mai::LegacyImplementBaseCore<self::_LegacyWithBase&Object&LegacyImplementBaseCore::E> /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_LegacyWithBase&Object&LegacyImplementBaseCore<self::_LegacyWithBase&Object&LegacyImplementBaseCore::E>
    : super core::Object::•()
    ;
}
abstract class LegacyWithBase<E extends col::LinkedListEntry<self::LegacyWithBase::E> = col::LinkedListEntry<dynamic>> extends self::_LegacyWithBase&Object&LegacyImplementBaseCore<self::LegacyWithBase::E> {
  synthetic constructor •() → self::LegacyWithBase<self::LegacyWithBase::E>
    ;
}
abstract class _LegacyWithFinal&Object&LegacyImplementFinalCore = core::Object with mai::LegacyImplementFinalCore /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_LegacyWithFinal&Object&LegacyImplementFinalCore
    : super core::Object::•()
    ;
  mixin-super-stub get key() → core::int
    return super.{mai::LegacyImplementFinalCore::key};
  mixin-super-stub get value() → core::int
    return super.{mai::LegacyImplementFinalCore::value};
  mixin-super-stub method toString() → core::String
    return super.{mai::LegacyImplementFinalCore::toString}();
}
class LegacyWithFinal extends self::_LegacyWithFinal&Object&LegacyImplementFinalCore {
  synthetic constructor •() → self::LegacyWithFinal
    ;
}
abstract class LegacyOnBase<E extends col::LinkedListEntry<self::LegacyOnBase::E> = col::LinkedListEntry<dynamic>> extends mai::LegacyImplementBaseCore<self::LegacyOnBase::E> /*isMixinDeclaration*/  {
}
abstract class LegacyOnFinal extends mai::LegacyImplementFinalCore /*isMixinDeclaration*/  {
}

library;
import self as mai;
import "dart:collection" as col;
import "dart:core" as core;

import "dart:collection";

abstract class LegacyImplementBaseCore<E extends col::LinkedListEntry<mai::LegacyImplementBaseCore::E> = col::LinkedListEntry<dynamic>> extends core::Object implements col::LinkedList<mai::LegacyImplementBaseCore::E> {
  synthetic constructor •() → mai::LegacyImplementBaseCore<mai::LegacyImplementBaseCore::E>
    ;
}
class LegacyImplementFinalCore extends core::Object implements core::MapEntry<core::int, core::int> {
  synthetic constructor •() → mai::LegacyImplementFinalCore
    ;
  get key() → core::int
    ;
  get value() → core::int
    ;
  method toString() → core::String
    ;
}
