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>
    : super mai::LegacyImplementBaseCore::•()
    ;
}
class LegacyExtendsFinal extends mai::LegacyImplementFinalCore {
  synthetic constructor •() → self::LegacyExtendsFinal
    : super mai::LegacyImplementFinalCore::•()
    ;
}
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>
    : super self::_LegacyWithBase&Object&LegacyImplementBaseCore::•()
    ;
}
class LegacyWithFinal extends self::_LegacyWithFinal&Object&LegacyImplementFinalCore {
  synthetic constructor •() → self::LegacyWithFinal
    : super self::_LegacyWithFinal&Object&LegacyImplementFinalCore::•()
    ;
}
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*/  {
}
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 _LegacyWithFinal&Object&LegacyImplementFinalCore = core::Object with mai::LegacyImplementFinalCore /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_LegacyWithFinal&Object&LegacyImplementFinalCore
    : super core::Object::•()
    ;
  synthetic mixin-super-stub get key() → core::int
    return super.{mai::LegacyImplementFinalCore::key};
  synthetic mixin-super-stub get value() → core::int
    return super.{mai::LegacyImplementFinalCore::value};
  synthetic mixin-super-stub method toString() → core::String
    return super.{mai::LegacyImplementFinalCore::toString}();
}

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>
    : super core::Object::•()
    ;
}
class LegacyImplementFinalCore extends core::Object implements core::MapEntry<core::int, core::int> {
  synthetic constructor •() → mai::LegacyImplementFinalCore
    : super core::Object::•()
    ;
  get key() → core::int
    return 0;
  get value() → core::int
    return 1;
  method toString() → core::String
    return "Bad";
}
