library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd/issue42362.dart:45:16: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   method3([int i]) {} // error
//                ^
//
// pkg/front_end/testcases/nnbd/issue42362.dart:47:16: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   method4({int i}) {} // error
//                ^
//
// pkg/front_end/testcases/nnbd/issue42362.dart:8:24: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   A.constructor1([this.i]); // error
//                        ^
//
// pkg/front_end/testcases/nnbd/issue42362.dart:10:24: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   A.constructor2({this.i}); // error
//                        ^
//
// pkg/front_end/testcases/nnbd/issue42362.dart:12:23: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   A.constructor3([int i]) // error
//                       ^
//
// pkg/front_end/testcases/nnbd/issue42362.dart:15:23: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   A.constructor4({int i}) // error
//                       ^
//
// pkg/front_end/testcases/nnbd/issue42362.dart:41:27: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   factory A.factory8([int i]) => new A.constructor3(); // error
//                           ^
//
// pkg/front_end/testcases/nnbd/issue42362.dart:43:27: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   factory A.factory9({int i}) => new A.constructor4(); // error
//                           ^
//
// pkg/front_end/testcases/nnbd/issue42362.dart:106:12: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   method3([i]) {} // error
//            ^
//
// pkg/front_end/testcases/nnbd/issue42362.dart:108:12: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   method4({i}) {} // error
//            ^
//
// pkg/front_end/testcases/nnbd/issue42362.dart:77:24: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   C.constructor1([this.i]); // error
//                        ^
//
// pkg/front_end/testcases/nnbd/issue42362.dart:79:24: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   C.constructor2({this.i}); // error
//                        ^
//
// pkg/front_end/testcases/nnbd/issue42362.dart:81:23: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   C.constructor3([int i]) : this.i = i; // error
//                       ^
//
// pkg/front_end/testcases/nnbd/issue42362.dart:83:23: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   C.constructor4({int i}) : this.i = i; // error
//                       ^
//
// pkg/front_end/testcases/nnbd/issue42362.dart:102:27: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   factory C.factory8([int i]) => new C.constructor3(); // error
//                           ^
//
// pkg/front_end/testcases/nnbd/issue42362.dart:104:27: Error: Optional parameter 'i' should have a default value because its type 'int' doesn't allow null.
//   factory C.factory9({int i}) => new C.constructor4(); // error
//                           ^
//
import self as self;
import "dart:core" as core;

class A extends core::Object {
  final field core::int i;
  static field dynamic _redirecting# = <dynamic>[self::A::factory3, self::A::factory4, self::A::factory5, self::A::factory6, self::A::factory7]/*isLegacy*/;
  constructor constructor1([core::int i]) → self::A
    ;
  constructor constructor2({core::int i}) → self::A
    ;
  constructor constructor3([core::int i]) → self::A
    ;
  constructor constructor4({core::int i}) → self::A
    ;
  constructor constructor5([core::int? i]) → self::A
    ;
  constructor constructor6({core::int? i}) → self::A
    ;
  constructor constructor7({required core::int i}) → self::A
    ;
  external constructor constructor8([core::int i]) → self::A
    ;
  external constructor constructor9({core::int i}) → self::A
    ;
  static factory factory3([core::int i]) → self::A
    let dynamic #redirecting_factory = self::A::constructor3 in invalid-expression;
  static factory factory4({core::int i}) → self::A
    let dynamic #redirecting_factory = self::A::constructor4 in invalid-expression;
  static factory factory5([core::int? i]) → self::A
    let dynamic #redirecting_factory = self::A::constructor5 in invalid-expression;
  static factory factory6({core::int? i}) → self::A
    let dynamic #redirecting_factory = self::A::constructor6 in invalid-expression;
  static factory factory7({required core::int i}) → self::A
    let dynamic #redirecting_factory = self::A::constructor7 in invalid-expression;
  static factory factory8([core::int i]) → self::A
    ;
  static factory factory9({core::int i}) → self::A
    ;
  method method3([core::int i]) → dynamic
    ;
  method method4({core::int i}) → dynamic
    ;
  method method5([core::int? i]) → dynamic
    ;
  method method6({core::int? i}) → dynamic
    ;
  method method7({required core::int i}) → dynamic
    ;
  external method method8([core::int i]) → dynamic;
  external method method9({core::int i}) → dynamic;
}
abstract class B extends core::Object {
  field core::int i;
  synthetic constructor •() → self::B
    ;
  abstract method method3([core::int i]) → dynamic;
  abstract method method4({core::int i}) → dynamic;
  abstract method method5([core::int? i]) → dynamic;
  abstract method method6({core::int? i}) → dynamic;
  abstract method method7({required core::int i}) → dynamic;
}
class C extends core::Object implements self::B {
  field core::int i;
  static field dynamic _redirecting# = <dynamic>[self::C::factory3, self::C::factory4, self::C::factory5, self::C::factory6, self::C::factory7]/*isLegacy*/;
  constructor constructor1([core::int i]) → self::C
    ;
  constructor constructor2({core::int i}) → self::C
    ;
  constructor constructor3([core::int i]) → self::C
    ;
  constructor constructor4({core::int i}) → self::C
    ;
  constructor constructor5([core::int? i]) → self::C
    ;
  constructor constructor6({core::int? i}) → self::C
    ;
  constructor constructor7({required core::int i}) → self::C
    ;
  static factory factory3([core::int i]) → self::C
    let dynamic #redirecting_factory = self::C::constructor3 in invalid-expression;
  static factory factory4({core::int i}) → self::C
    let dynamic #redirecting_factory = self::C::constructor4 in invalid-expression;
  static factory factory5([core::int? i]) → self::C
    let dynamic #redirecting_factory = self::C::constructor5 in invalid-expression;
  static factory factory6({core::int? i}) → self::C
    let dynamic #redirecting_factory = self::C::constructor6 in invalid-expression;
  static factory factory7({required core::int i}) → self::C
    let dynamic #redirecting_factory = self::C::constructor7 in invalid-expression;
  static factory factory8([core::int i]) → self::C
    ;
  static factory factory9({core::int i}) → self::C
    ;
  method method3([core::int i]) → dynamic
    ;
  method method4({core::int i}) → dynamic
    ;
  method method5([core::int? i]) → dynamic
    ;
  method method6({core::int? i}) → dynamic
    ;
  method method7({required core::int i}) → dynamic
    ;
}
static method main() → void
  ;
