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

class C extends core::Object {
  static field dynamic _redirecting# = <dynamic>[self::C::fact2];
  constructor •() → self::C*
    : super core::Object::•()
    ;
  constructor nonFact() → self::C*
    : super core::Object::•()
    ;
  constructor nonFact2() → self::C*
    : this self::C::nonFact()
    ;
  static factory fact() → self::C*
    return null;
  static factory fact2() → self::C*
    let dynamic #redirecting_factory = self::D::• in invalid-expression;
  static method staticFunction(core::int* i) → void {}
}
class D extends self::C {
  synthetic constructor •() → self::D*
    : super self::C::•()
    ;
}
static method topLevelFunction(core::int* i) → void {}
static method bad() → dynamic {
  function localFunction(core::int* i) → void {}
  core::List<core::int*>* a = <core::Object*>[];
  core::Map<core::int*, core::String*>* b = <core::Object*, core::String*>{};
  core::Map<core::int*, core::String*>* c = <core::int*, core::Object*>{};
  (core::Object*) →* core::int* d = (core::int* i) → dynamic => i;
  self::D* e = self::C::fact();
  self::D* f = new self::D::•();
  self::D* g = new self::C::nonFact();
  self::D* h = new self::C::nonFact2();
  (core::Object*) →* void i = #C1;
  (core::Object*) →* void j = #C2;
  (core::Object*) →* void k = localFunction;
}
static method ok() → dynamic {
  function localFunction(core::int* i) → void {}
  core::List<core::int*>* a = <core::int*>[];
  core::Map<core::int*, core::String*>* b = <core::int*, core::String*>{};
  core::Map<core::int*, core::String*>* c = <core::int*, core::String*>{};
  (core::int*) →* core::int* d = (core::int* i) → dynamic => i;
  self::D* e = self::C::fact();
  self::D* f = new self::D::•();
  self::C* g = new self::C::nonFact();
  self::C* h = new self::C::nonFact2();
  (core::int*) →* void i = #C1;
  (core::int*) →* void j = #C2;
  (core::int*) →* void k = localFunction;
}
static method main() → dynamic {}

constants  {
  #C1 = tearoff self::C::staticFunction
  #C2 = tearoff self::topLevelFunction
}
