library;
import self as self;
import "dart:core" as core;
import "private_method_tearoff_lib.dart" as pri;

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

class Foo extends core::Object implements pri::Bar {
  synthetic constructor •() → self::Foo*
    : super core::Object::•()
    ;
  no-such-method-forwarder method /* from org-dartlang-testcase:///private_method_tearoff_lib.dart */ _f() → void
    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
}
class Baz extends self::Foo {
  synthetic constructor •() → self::Baz*
    : super self::Foo::•()
    ;
}
static method main() → dynamic {
  pri::baz(new self::Foo::•());
}

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

class Bar extends core::Object {
  synthetic constructor •() → pri::Bar*
    : super core::Object::•()
    ;
  method _f() → void {}
}
static method baz(pri::Bar* bar) → void {
  core::print("${bar.{pri::Bar::_f}.{core::Object::runtimeType}}");
}

constants  {
  #C1 = #org-dartlang-testcase:///private_method_tearoff.dart::_f
  #C2 = <core::Type*>[]
  #C3 = <dynamic>[]
  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
}
