library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart:5:1: Error: A library can't opt out of non-nullable by default, when in nnbd-strong mode.
// // @dart=2.6
// ^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart:9:7: Error: Field 'optOutNever' should be initialized because its type 'Never' doesn't allow null.
// Never optOutNever;
//       ^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart:68:8: Error: The return type of the method 'B.neverField' is 'Null', which does not match the return type, 'Never', of the overridden method, 'A.neverField'.
// Change to a subtype of 'Never'.
//   Null neverField;
//        ^
// pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart:12:9: Context: This is the overridden method ('neverField').
//   Never neverField = throw "Should not reach here";
//         ^
//
// pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart:69:8: Error: The return type of the method 'B.neverMethod' is 'Null', which does not match the return type, 'Never', of the overridden method, 'A.neverMethod'.
// Change to a subtype of 'Never'.
//   Null neverMethod(Null value) => value;
//        ^
// pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart:13:9: Context: This is the overridden method ('neverMethod').
//   Never neverMethod(Never value) => value;
//         ^
//
// pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart:70:12: Error: The return type of the method 'B.neverProperty' is 'Null', which does not match the return type, 'Never', of the overridden method, 'A.neverProperty'.
// Change to a subtype of 'Never'.
//   Null get neverProperty => null;
//            ^
// pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart:14:13: Context: This is the overridden method ('neverProperty').
//   Never get neverProperty => throw "Should not reach here";
//             ^
//
// pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart:85:9: Error: The field 'C.nullField' has type 'Never', which does not match the corresponding type, 'Null', in the overridden setter, 'A.nullField'.
//   Never nullField;
//         ^
// pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart:17:8: Context: This is the overridden method ('nullField').
//   Null nullField = null;
//        ^
//
// pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart:86:26: Error: The parameter 'value' of the method 'C.nullMethod' has type 'Never', which does not match the corresponding type, 'Null', in the overridden method, 'A.nullMethod'.
// Change to a supertype of 'Null', or, for a covariant parameter, a subtype.
//   Never nullMethod(Never value) => value;
//                          ^
// pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart:18:8: Context: This is the overridden method ('nullMethod').
//   Null nullMethod(Null value) => value;
//        ^
//
// pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart:88:31: Error: The parameter 'value' of the method 'C.nullProperty' has type 'Never', which does not match the corresponding type, 'Null', in the overridden method, 'A.nullProperty'.
// Change to a supertype of 'Null', or, for a covariant parameter, a subtype.
//   void set nullProperty(Never value) {}
//                               ^
// pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart:20:12: Context: This is the overridden method ('nullProperty').
//   void set nullProperty(Null value) {}
//            ^
//
import self as self;
import "never_opt_out_lib.dart" as nev;
import "dart:core" as core;

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

class B extends nev::A {
  field core::Null? neverField;
  field core::Null? nullField;
  synthetic constructor •() → self::B
    ;
  method neverMethod(core::Null? value) → core::Null?
    ;
  get neverProperty() → core::Null?
    ;
  set neverProperty(core::Null? value) → void
    ;
  method nullMethod(core::Null? value) → core::Null?
    ;
  get nullProperty() → core::Null?
    ;
  set nullProperty(core::Null? value) → void
    ;
}
class C extends nev::A {
  field Never neverField;
  field Never nullField;
  synthetic constructor •() → self::C
    ;
  method neverMethod(Never value) → Never
    ;
  get neverProperty() → Never
    ;
  set neverProperty(Never value) → void
    ;
  method nullMethod(Never value) → Never
    ;
  get nullProperty() → Never
    ;
  set nullProperty(Never value) → void
    ;
}
static field Never optOutNever;
static field Never inferredOptOutNever;
static method main() → dynamic
  ;
static method throws(() → void f) → dynamic
  ;

library /*isNonNullableByDefault*/;
import self as nev;
import "dart:core" as core;

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

class A extends core::Object {
  field Never neverField;
  field core::Null? nullField;
  synthetic constructor •() → nev::A
    ;
  method neverMethod(Never value) → Never
    ;
  get neverProperty() → Never
    ;
  set neverProperty(Never value) → void
    ;
  method nullMethod(core::Null? value) → core::Null?
    ;
  get nullProperty() → core::Null?
    ;
  set nullProperty(core::Null? value) → void
    ;
}
static field Never optInNever;
static method throwing() → Never
  ;
