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

class Class<E extends core::Object? = dynamic> extends core::Object {
  final field self::Class::E% field;
  constructor •(self::Class::E% field) → self::Class<self::Class::E%>
    : self::Class::field = field, super core::Object::•()
    ;
  method returnTypeVariable() → self::Class::E% {
    lowered self::Class::E? #result;
    lowered core::bool #result#isSet = false;
    function #result#get() → self::Class::E% {
      if(!#result#isSet) {
        #result = this.{self::Class::field};
        #result#isSet = true;
      }
      return #result{self::Class::E%};
    }
    function #result#set(self::Class::E% #t1) → dynamic {
      #result#isSet = true;
      return #result = #t1;
    }
    return #result#get.call();
  }
}
static method returnNonNullable(core::int value) → core::int {
  lowered core::int? #result;
  lowered core::bool #result#isSet = false;
  function #result#get() → core::int {
    if(!#result#isSet) {
      #result = value;
      #result#isSet = true;
    }
    return #result{core::int};
  }
  function #result#set(core::int #t2) → dynamic {
    #result#isSet = true;
    return #result = #t2;
  }
  return #result#get.call();
}
static method returnNullable(core::int? value) → core::int? {
  lowered core::int? #result;
  lowered core::bool #result#isSet = false;
  function #result#get() → core::int? {
    if(!#result#isSet) {
      #result = value;
      #result#isSet = true;
    }
    return #result;
  }
  function #result#set(core::int? #t3) → dynamic {
    #result#isSet = true;
    return #result = #t3;
  }
  return #result#get.call();
}
static method main() → dynamic {
  self::expect(42, new self::Class::•<core::int>(42).{self::Class::returnTypeVariable}());
  self::expect(87, new self::Class::•<core::int?>(87).{self::Class::returnTypeVariable}());
  self::expect(null, new self::Class::•<core::int?>(null).{self::Class::returnTypeVariable}());
  self::expect(42, self::returnNonNullable(42));
  self::expect(87, self::returnNullable(87));
  self::expect(null, self::returnNullable(null));
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!expected.{core::Object::==}(actual))
    throw "Expected ${expected}, actual ${actual}";
}
