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=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2]  method foo() → dynamic
    return new self::T1::•();
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:3,getterSelectorId:4]  method bar() → dynamic
    return new self::T2::•();
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:5,getterSelectorId:6]  method bazz() → dynamic
    return new self::T3::•();
}
class B extends core::Object {
  synthetic constructor •() → self::B*
    : super core::Object::•()
    ;
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:7,getterSelectorId:8]  method foo() → dynamic
    return new self::T1::•();
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:9,getterSelectorId:10]  method bar() → dynamic
    return new self::T2::•();
[@vm.procedure-attributes.metadata=getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:11,getterSelectorId:12]  method bazz() → dynamic
    return new self::T3::•();
}
[@vm.inferred-type.metadata=dart.core::Null? (value: null)]static field core::Function* unknown;
static method use_foo1(dynamic x) → dynamic
  return [@vm.inferred-type.metadata=#lib::T1] x{dynamic}.foo();
static method use_foo2(dynamic x) → dynamic
  return [@vm.inferred-type.metadata=#lib::T1] x{dynamic}.foo();
static method use_bar(dynamic x) → dynamic
  return [@vm.inferred-type.metadata=#lib::T2] x{dynamic}.bar();
static method use_bazz(dynamic x) → dynamic
  return [@vm.inferred-type.metadata=#lib::T3] x{dynamic}.bazz();
static method getDynamic() → dynamic
  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown();
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());
}
