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

class A extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild]/*isLegacy*/;
  constructor •() → self::A
    : super core::Object::•()
    ;
  constructor redirecting() → self::A
    : this self::A::•()
    ;
  static factory redirectingFactory() → self::A
    let Never #redirecting_factory = self::A::• in invalid-expression;
  static factory redirectingFactoryChild() → self::A
    let Never #redirecting_factory = self::B::• in invalid-expression;
}
class B extends self::A {
  synthetic constructor •() → self::B
    : super self::A::•()
    ;
}
class C extends core::Object /*hasConstConstructor*/  {
  final field core::int x;
  const constructor •(core::int x) → self::C
    : self::C::x = x, super core::Object::•()
    ;
}
class D extends self::C {
  constructor •(core::int x) → self::D
    : super self::C::•(x.{core::num::*}(2){(core::num) → core::int})
    ;
}
static method test() → dynamic {
  new self::D::•(1);
  #C2;
  new self::C::•(1);
  () → self::A f1 = #C3;
  () → self::B f2 = #C4;
  (core::int) → self::C f3 = #C5;
  (core::int) → self::D f4 = #C6;
  f1(){() → self::A};
  f2(){() → self::B};
  f3(1){(core::int) → self::C};
  f4(1){(core::int) → self::D};
  () → self::A g1 = #C3;
  () → self::B g2 = #C4;
  (core::int) → self::C g3 = #C5;
  (core::int) → self::D g4 = #C6;
  g1(){() → self::A};
  g2(){() → self::B};
  g3(1){(core::int) → self::C};
  g4(1){(core::int) → self::D};
}
static method main() → dynamic {}

constants  {
  #C1 = 1
  #C2 = self::C {x:#C1}
  #C3 = constructor-tearoff self::A::•
  #C4 = constructor-tearoff self::B::•
  #C5 = constructor-tearoff self::C::•
  #C6 = constructor-tearoff self::D::•
}


Constructor coverage from constants:
org-dartlang-testcase:///unnamed_constructor.dart:
- C. (from org-dartlang-testcase:///unnamed_constructor.dart:16:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
