library;
import self as self;
import "dart:core" as core;
import "never_opt_out_lib.dart" as nev;

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

class GenericClass<T extends core::Object* = dynamic> extends core::Object {
  synthetic constructor •() → self::GenericClass<self::GenericClass::T*>*
    : super core::Object::•()
    ;
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class B extends nev::A {
  field core::Null? neverField = null;
  field core::Null? nullField = null;
  synthetic constructor •() → self::B*
    : super nev::A::•()
    ;
  method neverMethod(core::Null? value) → core::Null?
    return value;
  get neverProperty() → core::Null?
    return null;
  set neverProperty(core::Null? value) → void {}
  method nullMethod(core::Null? value) → core::Null?
    return value;
  get nullProperty() → core::Null?
    return null;
  set nullProperty(core::Null? value) → void {}
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class C extends nev::A {
  field core::Null? neverField = null;
  field core::Null? nullField = null;
  synthetic constructor •() → self::C*
    : super nev::A::•()
    ;
  method neverMethod(core::Null? value) → core::Null?
    return value;
  get neverProperty() → core::Null?
    return null;
  set neverProperty(core::Null? value) → void {}
  method nullMethod(core::Null? value) → core::Null?
    return value;
  get nullProperty() → core::Null?
    return null;
  set nullProperty(core::Null? value) → void {}
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
static field core::Null? optOutNever;
static field dynamic inferredOptOutNever = nev::optInNever;
static method genericMethod<T extends core::Object* = dynamic>() → dynamic {}
static method main() → dynamic {
  nev::optInNever = self::optOutNever;
  core::Type* typeNever = core::Null?;
  self::genericMethod<core::Null?>();
  new self::GenericClass::•<core::Null?>();
  core::Null? localNever = null;
  core::Null? localNull = null;
  dynamic inferredLocalNever = nev::optInNever;
  localNever = localNever;
  self::optOutNever = localNever;
  nev::optInNever = localNever;
  localNull = localNever;
  self::inferredOptOutNever = localNever;
  inferredLocalNever = localNever;
  localNever = self::optOutNever;
  self::optOutNever = self::optOutNever;
  nev::optInNever = self::optOutNever;
  localNull = self::optOutNever;
  self::inferredOptOutNever = self::optOutNever;
  inferredLocalNever = self::optOutNever;
  localNever = nev::optInNever;
  self::optOutNever = nev::optInNever;
  nev::optInNever = nev::optInNever;
  localNull = nev::optInNever;
  self::inferredOptOutNever = nev::optInNever;
  inferredLocalNever = nev::optInNever;
  localNever = localNull;
  self::optOutNever = localNull;
  nev::optInNever = localNull;
  localNull = localNull;
  self::inferredOptOutNever = localNull;
  inferredLocalNever = localNull;
  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
  nev::optInNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never;
  localNull = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
  self::inferredOptOutNever = self::inferredOptOutNever;
  inferredLocalNever = self::inferredOptOutNever;
  localNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
  nev::optInNever = inferredLocalNever as{TypeError,ForDynamic} Never;
  localNull = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
  self::inferredOptOutNever = inferredLocalNever;
  inferredLocalNever = inferredLocalNever;
  self::throws(() → core::Null? => self::optOutNever = nev::throwing());
  self::throws(() → core::Null? => localNever = nev::throwing());
  self::throws(() → core::Null? => self::optOutNever = nev::throwing());
  self::throws(() → core::Null? => nev::optInNever = nev::throwing());
  self::throws(() → core::Null? => self::inferredOptOutNever = nev::throwing());
  self::throws(() → core::Null? => inferredLocalNever = nev::throwing());
  nev::BoundedGenericClass<core::Null?>* boundedGenericClass = new nev::BoundedGenericClass::•<core::Null?>();
  self::throws(() → core::Null? {
    dynamic boundedGenericMethodResult1 = nev::boundedGenericMethod1<core::Null?>();
  });
  core::List<core::Null?>* boundedGenericMethodResult2 = nev::boundedGenericMethod2<core::Null?>();
  dynamic dyn = null;
  nev::optInNever = dyn as{TypeError,ForDynamic} Never;
}
static method throws(() →* void f) → dynamic {
  try {
    f.call();
  }
  on dynamic catch(final dynamic _) {
    return;
  }
  throw "Expected exception";
}

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

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

class A extends core::Object {
  field Never neverField = throw "Should not reach here";
  field core::Null? nullField = null;
  synthetic constructor •() → nev::A
    : super core::Object::•()
    ;
  method neverMethod(Never value) → Never
    return let final Never #t1 = value in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
  get neverProperty() → Never
    return throw "Should not reach here";
  set neverProperty(Never value) → void {}
  method nullMethod(core::Null? value) → core::Null?
    return value;
  get nullProperty() → core::Null?
    return null;
  set nullProperty(core::Null? value) → void {}
}
class BoundedGenericClass<T extends Never = Never> extends core::Object {
  synthetic constructor •() → nev::BoundedGenericClass<nev::BoundedGenericClass::T>
    : super core::Object::•()
    ;
}
late static field Never optInNever;
static method throwing() → Never
  return throw "Never!";
static method boundedGenericMethod1<T extends Never = Never>() → nev::boundedGenericMethod1::T
  return throw "Should never return";
static method boundedGenericMethod2<T extends Never = Never>() → core::List<nev::boundedGenericMethod2::T>
  return <nev::boundedGenericMethod2::T>[];
