library main /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:30: Error: The required named parameter 'a' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
//   int method5c({required int a, required int b}) => 0;
//                              ^
// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
//   int method5c({int a, int b}) => 0;
//       ^
//
// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:96:46: Error: The required named parameter 'b' in method 'Class2b.method5c' is not required in overridden method 'LegacyClass.method5c'.
//   int method5c({required int a, required int b}) => 0;
//                                              ^
// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:30:7: Context: This is the overridden method ('method5c').
//   int method5c({int a, int b}) => 0;
//       ^
//
// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:32: Error: The required named parameter 'a' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
//   int? method6c({required int? a, required int? b}) => 0;
//                                ^
// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
//   int method6c({int a, int b}) => 0;
//       ^
//
// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out.dart:102:49: Error: The required named parameter 'b' in method 'Class2b.method6c' is not required in overridden method 'LegacyClass.method6c'.
//   int? method6c({required int? a, required int? b}) => 0;
//                                                 ^
// pkg/front_end/testcases/nnbd/member_inheritance_from_opt_out_lib.dart:36:7: Context: This is the overridden method ('method6c').
//   int method6c({int a, int b}) => 0;
//       ^
//
import self as self;
import "dart:core" as core;
import "member_inheritance_from_opt_out_lib.dart" as opt;

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

abstract class Interface extends core::Object {
  field core::int field1;
  field core::int? field2;
  field core::int property3;
  field core::int? property4;
  synthetic constructor •() → self::Interface
    ;
  abstract method method1() → core::int;
  abstract method method2() → core::int?;
  abstract method method3a(core::int a, core::int b) → core::int;
  abstract method method3b(core::int a, [core::int b]) → core::int;
  abstract method method3c([core::int a, core::int b]) → core::int;
  abstract method method4a(core::int? a, core::int? b) → core::int?;
  abstract method method4b(core::int? a, [core::int? b]) → core::int?;
  abstract method method4c([core::int? a, core::int? b]) → core::int?;
  abstract method method5a(core::int a, {core::int b = 0}) → core::int;
  abstract method method5b({core::int a = 0, core::int b = 0}) → core::int;
  abstract method method5c({required core::int a, required core::int b}) → core::int;
  abstract method method6a(core::int? a, {core::int? b}) → core::int?;
  abstract method method6b({core::int? a, core::int? b}) → core::int?;
  abstract method method6c({required core::int? a, required core::int? b}) → core::int?;
  abstract get getter1() → core::int;
  abstract get getter2() → core::int?;
  abstract set setter1(core::int value) → void;
  abstract set setter2(core::int? value) → void;
  abstract get field3() → core::int;
  abstract set field3(core::int value) → void;
  abstract get field4() → core::int?;
  abstract set field4(core::int? value) → void;
  abstract get property1() → core::int;
  abstract set property1(core::int value) → void;
  abstract get property2() → core::int?;
  abstract set property2(core::int? value) → void;
}
class Class1 extends opt::LegacyClass {
  synthetic constructor •() → self::Class1
    ;
}
class Class2a extends opt::LegacyClass implements self::Interface {
  synthetic constructor •() → self::Class2a
    ;
  abstract member-signature method method1() → core::int;
  abstract member-signature method method2() → core::int?;
  abstract member-signature method method3a(core::int a, core::int b) → core::int;
  abstract member-signature method method3b(core::int a, [core::int b]) → core::int;
  abstract member-signature method method3c([core::int a, core::int b]) → core::int;
  abstract member-signature method method4a(core::int? a, core::int? b) → core::int?;
  abstract member-signature method method4b(core::int? a, [core::int? b]) → core::int?;
  abstract member-signature method method4c([core::int? a, core::int? b]) → core::int?;
  abstract member-signature method method5a(core::int a, {core::int b}) → core::int;
  abstract member-signature method method5b({core::int a, core::int b}) → core::int;
  abstract member-signature method method5c({core::int a, core::int b}) → core::int;
  abstract member-signature method method6a(core::int? a, {core::int? b}) → core::int?;
  abstract member-signature method method6b({core::int? a, core::int? b}) → core::int?;
  abstract member-signature method method6c({core::int? a, core::int? b}) → core::int?;
  abstract member-signature get getter1() → core::int;
  abstract member-signature get getter2() → core::int?;
  abstract member-signature get field1() → core::int;
  abstract member-signature set field1(core::int _) → void;
  abstract member-signature get field2() → core::int?;
  abstract member-signature set field2(core::int? _) → void;
  abstract member-signature get field3() → core::int;
  abstract member-signature set field3(core::int _) → void;
  abstract member-signature get field4() → core::int?;
  abstract member-signature set field4(core::int? _) → void;
  abstract member-signature get property1() → core::int;
  abstract member-signature set property1(core::int value) → void;
  abstract member-signature get property2() → core::int?;
  abstract member-signature set property2(core::int? value) → void;
  abstract member-signature get property3() → core::int;
  abstract member-signature set property3(core::int value) → void;
  abstract member-signature get property4() → core::int?;
  abstract member-signature set property4(core::int? value) → void;
  abstract member-signature get _identityHashCode() → core::int;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool;
  abstract member-signature get hashCode() → core::int;
  abstract member-signature method toString() → core::String;
  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type;
  abstract member-signature set setter1(core::int value) → void;
  abstract member-signature set setter2(core::int? value) → void;
}
class Class2b extends opt::LegacyClass implements self::Interface {
  field core::int field1;
  field core::int? field2;
  field core::int property3;
  field core::int? property4;
  synthetic constructor •() → self::Class2b
    ;
  method method1() → core::int
    ;
  method method2() → core::int?
    ;
  method method3a(core::int a, core::int b) → core::int
    ;
  method method3b(core::int a, [core::int b = 42]) → core::int
    ;
  method method3c([core::int a = 42, core::int b = 42]) → core::int
    ;
  method method4a(core::int? a, core::int? b) → core::int?
    ;
  method method4b(core::int? a, [core::int? b]) → core::int?
    ;
  method method4c([core::int? a, core::int? b]) → core::int?
    ;
  method method5a(core::int a, {core::int b = 0}) → core::int
    ;
  method method5b({core::int a = 0, core::int b = 0}) → core::int
    ;
  method method5c({required core::int a, required core::int b}) → core::int
    ;
  method method6a(core::int? a, {core::int? b}) → core::int?
    ;
  method method6b({core::int? a, core::int? b}) → core::int?
    ;
  method method6c({required core::int? a, required core::int? b}) → core::int?
    ;
  get getter1() → core::int
    ;
  get getter2() → core::int?
    ;
  set setter1(core::int value) → void
    ;
  set setter2(core::int? value) → void
    ;
  get field3() → core::int
    ;
  set field3(core::int value) → void
    ;
  get field4() → core::int?
    ;
  set field4(core::int? value) → void
    ;
  get property1() → core::int
    ;
  set property1(core::int value) → void
    ;
  get property2() → core::int?
    ;
  set property2(core::int? value) → void
    ;
  abstract member-signature get _identityHashCode() → core::int;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool;
  abstract member-signature get hashCode() → core::int;
  abstract member-signature method toString() → core::String;
  abstract member-signature method noSuchMethod(core::Invocation invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type;
}
class Class3a extends opt::GenericLegacyClass<core::int> {
  synthetic constructor •() → self::Class3a
    ;
}
class Class3b extends opt::GenericLegacyClass<core::int?> {
  synthetic constructor •() → self::Class3b
    ;
}
class Class3c<S extends core::Object? = dynamic> extends opt::GenericLegacyClass<self::Class3c::S%> {
  synthetic constructor •() → self::Class3c<self::Class3c::S%>
    ;
}
static method main() → dynamic
  ;

library opt_out;
import self as opt;
import "dart:core" as core;

class LegacyClass extends core::Object {
  field core::int* field1;
  field core::int* field2;
  field core::int* field3;
  field core::int* field4;
  synthetic constructor •() → opt::LegacyClass*
    ;
  method method1() → core::int*
    ;
  method method2() → core::int*
    ;
  method method3a(core::int* a, core::int* b) → core::int*
    ;
  method method3b(core::int* a, [core::int* b]) → core::int*
    ;
  method method3c([core::int* a, core::int* b]) → core::int*
    ;
  method method4a(core::int* a, core::int* b) → core::int*
    ;
  method method4b(core::int* a, [core::int* b]) → core::int*
    ;
  method method4c([core::int* a, core::int* b]) → core::int*
    ;
  method method5a(core::int* a, {core::int* b}) → core::int*
    ;
  method method5b({core::int* a, core::int* b}) → core::int*
    ;
  method method5c({core::int* a, core::int* b}) → core::int*
    ;
  method method6a(core::int* a, {core::int* b}) → core::int*
    ;
  method method6b({core::int* a, core::int* b}) → core::int*
    ;
  method method6c({core::int* a, core::int* b}) → core::int*
    ;
  get getter1() → core::int*
    ;
  get getter2() → core::int*
    ;
  set setter1(core::int* value) → void
    ;
  set setter2(core::int* value) → void
    ;
  get property1() → core::int*
    ;
  set property1(core::int* value) → void
    ;
  get property2() → core::int*
    ;
  set property2(core::int* value) → void
    ;
  get property3() → core::int*
    ;
  set property3(core::int* value) → void
    ;
  get property4() → core::int*
    ;
  set property4(core::int* value) → void
    ;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
class GenericLegacyClass<T extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → opt::GenericLegacyClass<opt::GenericLegacyClass::T*>*
    ;
  method method1() → opt::GenericLegacyClass::T*
    ;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
