library #lib;
import self as self;
import "dart:core" as core;

class T1 extends core::Object {
  synthetic constructor •() → self::T1
    : super core::Object::•()
    ;
}
class T2 extends core::Object {
  synthetic constructor •() → self::T2
    : super core::Object::•()
    ;
}
class T3 extends core::Object {
  synthetic constructor •() → self::T3
    : super core::Object::•()
    ;
}
class A extends core::Object {
  synthetic constructor •() → self::A
    : super core::Object::•()
    ;
[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method foo() → dynamic
    return new self::T1::•();
[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method bar() → dynamic
    return new self::T2::•();
[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method bazz() → dynamic
    return new self::T3::•();
}
class B extends core::Object {
  synthetic constructor •() → self::B
    : super core::Object::•()
    ;
[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method foo() → dynamic
    return new self::T1::•();
[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method bar() → dynamic
    return new self::T2::•();
[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method bazz() → dynamic
    return new self::T3::•();
}
[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
static method use_foo1(dynamic x) → dynamic
  return [@vm.inferred-type.metadata=#lib::T1] x.foo();
static method use_foo2(dynamic x) → dynamic
  return [@vm.inferred-type.metadata=#lib::T1] x.foo();
static method use_bar(dynamic x) → dynamic
  return [@vm.inferred-type.metadata=#lib::T2] x.bar();
static method use_bazz(dynamic x) → dynamic
  return [@vm.inferred-type.metadata=#lib::T3] x.bazz();
static method getDynamic() → dynamic
  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call();
static method allocateA() → dynamic {
  new self::A::•();
}
static method allocateB() → dynamic {
  new self::B::•();
}
static method main(core::List<core::String> args) → dynamic {
  self::use_foo1(self::getDynamic());
  self::allocateA();
  self::use_foo2(self::getDynamic());
  self::use_bar(self::getDynamic());
  self::allocateB();
  self::use_bazz(self::getDynamic());
}
