library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "type_parameter_nullability_lib.dart" as typ;

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

class C<T extends core::num? = core::num?, S extends core::Object? = dynamic, U extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → self::C<self::C::T%, self::C::S%, self::C::U%>
    : super core::Object::•()
    ;
  method promoteNullable(generic-covariant-impl self::C::T? t) → void {
    if(t is{ForNonNullableByDefault} core::int) {
      t{self::C::T? & core::int /* '?' & '!' = '!' */};
    }
    if(t is{ForNonNullableByDefault} core::int?) {
      t{self::C::T? & core::int? /* '?' & '?' = '?' */};
    }
  }
  method nullableAsUndetermined(generic-covariant-impl self::C::S? s) → void {
    s as{ForNonNullableByDefault} self::C::U%;
  }
}
static method main() → dynamic {
  self::C<core::num, core::num, core::num> c = new self::C::•<core::num, core::num, core::num>();
  c.{self::C::promoteNullable}(null);
  c.{self::C::promoteNullable}(0);
  c.{self::C::nullableAsUndetermined}(null);
  c.{self::C::nullableAsUndetermined}(0);
  typ::D<core::num> d = new typ::D::•<core::num>();
  d.{typ::D::promoteLegacy}(null);
  d.{typ::D::promoteLegacy}(0);
}

library;
import self as typ;
import "dart:core" as core;

class D<T extends core::num* = core::num*> extends core::Object {
  synthetic constructor •() → typ::D<typ::D::T*>*
    : super core::Object::•()
    ;
  method promoteLegacy(generic-covariant-impl typ::D::T* t) → void {
    if(t is core::int*) {
      let final typ::D::T* & core::int* /* '*' & '*' = '*' */ #t1 = t{typ::D::T* & core::int* /* '*' & '*' = '*' */} in #t1.{core::num::==}(null) ?{core::bool*} null : #t1.{core::int::isEven};
    }
  }
  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*;
}
