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

class C extends core::_Enum /*isEnum*/  {
  static const field core::List<self::C> values = #C20;
  final field core::String log;
  static const field self::C a = #C4;
  static const field self::C b = #C7;
  static const field self::C c = #C10;
  static const field self::C d = #C13;
  static const field self::C e = #C16;
  static const field self::C f = #C19;
  const constructor •(core::int index, core::String name, core::int x, core::int y, {core::int z = #C21}) → self::C
    : self::C::log = "x=${x}, y=${y}, z=${z}", super core::_Enum::•(index, name)
    ;
  const constructor named1(core::int index, core::String name, core::int x, core::int y, core::int z) → self::C
    : this self::C::•(index, name, x, y, z: z)
    ;
  const constructor named2(core::int index, core::String name, core::int x, core::int y, core::int z) → self::C
    : final core::int #t1 = index, final core::String #t2 = name, final core::int #t3 = x, final core::int #t4 = z, this self::C::•(#t1, #t2, #t3, y, z: #t4)
    ;
  const constructor named3(core::int index, core::String name, core::int x, core::int y, core::int z) → self::C
    : final core::int #t5 = index, final core::String #t6 = name, final core::int #t7 = z, this self::C::•(#t5, #t6, x, y, z: #t7)
    ;
  method toString() → core::String
    return "C.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic {
  self::expect("x=1, y=2, z=3", #C4.{self::C::log}{core::String});
  self::expect("x=1, y=2, z=3", #C7.{self::C::log}{core::String});
  self::expect("x=1, y=2, z=3", #C10.{self::C::log}{core::String});
  self::expect("x=1, y=2, z=3", #C13.{self::C::log}{core::String});
  self::expect("x=1, y=2, z=3", #C16.{self::C::log}{core::String});
  self::expect("x=1, y=2, z=3", #C19.{self::C::log}{core::String});
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}

constants  {
  #C1 = "x=1, y=2, z=3"
  #C2 = 0
  #C3 = "a"
  #C4 = self::C {log:#C1, index:#C2, _name:#C3}
  #C5 = 1
  #C6 = "b"
  #C7 = self::C {log:#C1, index:#C5, _name:#C6}
  #C8 = 2
  #C9 = "c"
  #C10 = self::C {log:#C1, index:#C8, _name:#C9}
  #C11 = 3
  #C12 = "d"
  #C13 = self::C {log:#C1, index:#C11, _name:#C12}
  #C14 = 4
  #C15 = "e"
  #C16 = self::C {log:#C1, index:#C14, _name:#C15}
  #C17 = 5
  #C18 = "f"
  #C19 = self::C {log:#C1, index:#C17, _name:#C18}
  #C20 = <self::C>[#C4, #C7, #C10, #C13, #C16, #C19]
  #C21 = 42
}


Constructor coverage from constants:
org-dartlang-testcase:///redirecting_constructor.dart:
- C. (from org-dartlang-testcase:///redirecting_constructor.dart:16:9)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
- C.named1 (from org-dartlang-testcase:///redirecting_constructor.dart:19:9)
- C.named2 (from org-dartlang-testcase:///redirecting_constructor.dart:20:9)
- C.named3 (from org-dartlang-testcase:///redirecting_constructor.dart:21:9)
