library;
//
// Problems in library:
//
// pkg/front_end/testcases/class_modifiers/ffi_exception.dart:11:7: Error: Can't use 'Double' as a mixin because it has constructors.
// class WithFinal with Double {} /* Error */
//       ^
// sdk/lib/ffi/native_type.dart:*: Context: This constructor prevents using 'Double' as a mixin.
//   const Double();
//         ^
//
// pkg/front_end/testcases/class_modifiers/ffi_exception.dart:11:22: Error: The class 'Double' can't be used as a mixin because it isn't a mixin class nor a mixin.
// class WithFinal with Double {} /* Error */
//                      ^
//
// pkg/front_end/testcases/class_modifiers/ffi_exception.dart:13:34: Error: The class 'Double' can't be implemented outside of its library because it's a final class.
// class ImplementsFinal implements Double {} /* Error */
//                                  ^
//
// pkg/front_end/testcases/class_modifiers/ffi_exception.dart:15:28: Error: The class 'Double' can't be extended outside of its library because it's a final class.
// class ExtendsFinal extends Double {} /* Error */
//                            ^
//
// pkg/front_end/testcases/class_modifiers/ffi_exception.dart:22:33: Error: The class 'Opaque' can't be implemented outside of its library because it's a base class.
// class ImplementsBase implements Opaque {} /* Error */
//                                 ^
//
// pkg/front_end/testcases/class_modifiers/ffi_exception.dart:26:32: Error: The class 'Finalizable' can't be extended outside of its library because it's an interface class.
// class ExtendsInterface extends Finalizable {} /* Error */
//                                ^
//
// pkg/front_end/testcases/class_modifiers/ffi_exception.dart:26:7: Error: The superclass, 'Finalizable', has no unnamed constructor that takes no arguments.
// class ExtendsInterface extends Finalizable {} /* Error */
//       ^
//
import self as self;
import "dart:core" as core;
import "dart:ffi" as ffi;

import "dart:ffi";

abstract final class _WithFinal&Object&Double = core::Object with ffi::Double /*isAnonymousMixin,hasConstConstructor*/  {
  const synthetic constructor •() → self::_WithFinal&Object&Double
    : super core::Object::•()
    ;
}
class WithFinal extends self::_WithFinal&Object&Double {
  synthetic constructor •() → self::WithFinal
    : super self::_WithFinal&Object&Double::•()
    ;
}
class ImplementsFinal extends core::Object implements ffi::Double {
  synthetic constructor •() → self::ImplementsFinal
    : super core::Object::•()
    ;
}
class ExtendsFinal extends ffi::Double {
  synthetic constructor •() → self::ExtendsFinal
    : super ffi::Double::•()
    ;
}
class ExtendsBase extends ffi::Opaque {
  synthetic constructor •() → self::ExtendsBase
    : super ffi::Opaque::•()
    ;
}
class ImplementsBase extends core::Object implements ffi::Opaque {
  synthetic constructor •() → self::ImplementsBase
    : super core::Object::•()
    ;
}
class ExtendsInterface extends ffi::Finalizable {
  synthetic constructor •() → self::ExtendsInterface
    : invalid-initializer
    ;
}
