library;
import self as self;
import "issue42660_lib.dart" as iss;
import "dart:core" as core;

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

static method main() → void {
  iss::E|m(iss::f());
  iss::E|m((#C1)(){() →* core::int*});
  iss::E|m(iss::p);
  iss::Class<dynamic>* c = new iss::Class::•<dynamic>();
  iss::E|m(c.{iss::Class::f}(){() →* core::int*});
  iss::E|m(c.{iss::Class::f}{() →* core::int*}(){() →* core::int*});
  iss::E|m(c.{iss::Class::p}{core::int*});
  iss::E|m(c.{iss::Class::[]}(0){(core::int*) →* core::int*});
  iss::E|m(c.{iss::Class::unary-}(){() →* core::int*});
  iss::E|m(c.{iss::Class::+}(4){(core::Object*) →* core::int*});
  let final iss::Class<dynamic>* #t1 = c in block {
    iss::E|m(#t1.{iss::Class::p}{core::int*});
    iss::E|m(#t1.{iss::Class::f}(){() →* core::int*});
    iss::E|m(#t1.{iss::Class::[]}(0){(core::int*) →* core::int*});
  } =>#t1;
  let final iss::Class<dynamic>* #t2 = new iss::Class::•<dynamic>() in block {
    iss::E|m(#t2.{iss::Class::p}{core::int*});
    iss::E|m(#t2.{iss::Class::f}(){() →* core::int*});
    iss::E|m(#t2.{iss::Class::[]}(0){(core::int*) →* core::int*});
  } =>#t2;
}

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

class Class<T extends core::Object? = dynamic> extends core::Object {
  synthetic constructor •() → iss::Class<iss::Class::T%>
    : super core::Object::•()
    ;
  method f() → core::int?
    return 4;
  get p() → core::int?
    return 4;
  operator [](core::int index) → core::int?
    return 4;
  operator unary-() → core::int?
    return 4;
  operator +(core::Object? other) → core::int?
    return 4;
}
extension E on core::int {
  method m = iss::E|m;
  tearoff m = iss::E|get#m;
}
static method E|m(lowered final core::int #this) → core::String
  return "m";
static method E|get#m(lowered final core::int #this) → () → core::String
  return () → core::String => iss::E|m(#this);
static method f() → core::int?
  return 4;
static get p() → core::int?
  return 4;

constants  {
  #C1 = tearoff iss::f
}
