library;
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 = 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*;
  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 C extends nev::A {
  field Never* neverField = null;
  field Never* nullField = null;
  synthetic constructor •() → self::C*
    : super nev::A::•()
    ;
  method neverMethod(Never* value) → Never*
    return value;
  get neverProperty() → Never*
    return null;
  set neverProperty(Never* value) → void {}
  method nullMethod(Never* value) → Never*
    return value;
  get nullProperty() → Never*
    return null;
  set nullProperty(Never* 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*;
}
static field Never* optOutNever;
static field dynamic inferredOptOutNever = nev::optInNever;
static method main() → dynamic {
  Never* 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 as{TypeError} Never;
  localNull = self::optOutNever;
  self::inferredOptOutNever = self::optOutNever;
  inferredLocalNever = self::optOutNever;
  localNever = nev::optInNever;
  self::optOutNever = nev::optInNever;
  nev::optInNever = nev::optInNever as{TypeError} Never;
  localNull = nev::optInNever;
  self::inferredOptOutNever = nev::optInNever;
  inferredLocalNever = nev::optInNever;
  localNever = localNull;
  self::optOutNever = localNull;
  nev::optInNever = localNull as{TypeError} Never;
  localNull = localNull;
  self::inferredOptOutNever = localNull;
  inferredLocalNever = localNull;
  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never*;
  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never*;
  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} Never*;
  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} Never*;
  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() as{TypeError} Never);
  self::throws(() → core::Null? => self::inferredOptOutNever = nev::throwing());
  self::throws(() → core::Null? => inferredLocalNever = nev::throwing());
}
static method throws(() →* void f) → dynamic {
  try {
    f.call();
  }
  on dynamic catch(final dynamic _) {
    return;
  }
  throw "Expected exception";
}

library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart:19:28: Error: A value of type 'Type' can't be returned from a function with return type 'Null'.
//  - 'Type' is from 'dart:core'.
//   Null get nullProperty => Null;
//                            ^
//
import self as nev;
import "dart:core" as core;
import "never_opt_out.dart" as self;

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 value;
  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 let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/never_opt_out_lib.dart:19:28: Error: A value of type 'Type' can't be returned from a function with return type 'Null'.
 - 'Type' is from 'dart:core'.
  Null get nullProperty => Null;
                           ^" in core::Null? as{TypeError,ForNonNullableByDefault} core::Null?;
  set nullProperty(core::Null? value) → void {}
}
static field Never optInNever = self::optOutNever;
static method throwing() → Never
  return throw "Never!";
