library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/instantiate_enum/main.dart:12:3: Error: Enums can't be instantiated.
//   Enum1(123, 'foo');
//   ^^^^^
//
// pkg/front_end/testcases/general/instantiate_enum/main.dart:13:3: Error: Enums can't be instantiated.
//   Enum2(123, 'foo');
//   ^^^^^
//
// pkg/front_end/testcases/general/instantiate_enum/main.dart:14:3: Error: Enums can't be instantiated.
//   Alias1(123, 'foo');
//   ^^^^^^
//
// pkg/front_end/testcases/general/instantiate_enum/main.dart:15:3: Error: Enums can't be instantiated.
//   Alias2(123, 'foo');
//   ^^^^^^
//
import self as self;
import "dart:core" as core;

import "org-dartlang-testcase:///main_lib.dart";

typedef Alias1 = self::Enum1;
class Enum1 extends core::_Enum /*isEnum*/  {
  static const field core::List<self::Enum1> values = #C10;
  static const field self::Enum1 a = #C3;
  static const field self::Enum1 b = #C6;
  static const field self::Enum1 c = #C9;
  const constructor •(core::int index, core::String name) → self::Enum1
    : super core::_Enum::•(index, name)
    ;
  method toString() → core::String
    return "Enum1.${this.{core::_Enum::_name}{core::String}}";
}
static method test() → dynamic {
  invalid-expression "pkg/front_end/testcases/general/instantiate_enum/main.dart:12:3: Error: Enums can't be instantiated.
  Enum1(123, 'foo');
  ^^^^^";
  invalid-expression "pkg/front_end/testcases/general/instantiate_enum/main.dart:13:3: Error: Enums can't be instantiated.
  Enum2(123, 'foo');
  ^^^^^";
  invalid-expression "pkg/front_end/testcases/general/instantiate_enum/main.dart:14:3: Error: Enums can't be instantiated.
  Alias1(123, 'foo');
  ^^^^^^";
  invalid-expression "pkg/front_end/testcases/general/instantiate_enum/main.dart:15:3: Error: Enums can't be instantiated.
  Alias2(123, 'foo');
  ^^^^^^";
}
static method main() → dynamic {}

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

typedef Alias2 = self2::Enum2;
class Enum2 extends core::_Enum /*isEnum*/  {
  static const field core::List<self2::Enum2> values = #C14;
  static const field self2::Enum2 a = #C11;
  static const field self2::Enum2 b = #C12;
  static const field self2::Enum2 c = #C13;
  const constructor •(core::int index, core::String name) → self2::Enum2
    : super core::_Enum::•(index, name)
    ;
  method toString() → core::String
    return "Enum2.${this.{core::_Enum::_name}{core::String}}";
}

constants  {
  #C1 = 0
  #C2 = "a"
  #C3 = self::Enum1 {index:#C1, _name:#C2}
  #C4 = 1
  #C5 = "b"
  #C6 = self::Enum1 {index:#C4, _name:#C5}
  #C7 = 2
  #C8 = "c"
  #C9 = self::Enum1 {index:#C7, _name:#C8}
  #C10 = <self::Enum1*>[#C3, #C6, #C9]
  #C11 = self2::Enum2 {index:#C1, _name:#C2}
  #C12 = self2::Enum2 {index:#C4, _name:#C5}
  #C13 = self2::Enum2 {index:#C7, _name:#C8}
  #C14 = <self2::Enum2*>[#C11, #C12, #C13]
}


Constructor coverage from constants:
org-dartlang-testcase:///main_lib.dart:
- Enum2. (from org-dartlang-testcase:///main_lib.dart:5:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

org-dartlang-testcase:///main.dart:
- Enum1. (from org-dartlang-testcase:///main.dart:7:6)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
