library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "main_lib.dart" as mai;
import "dart:_internal" as _in;

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

abstract class UnusedEnum extends core::Object {
}
class UsedEnum extends core::Object /*isEnum*/  {
  final field core::int index;
  final field core::String _name;
  method toString() → core::String
    return this.{self::UsedEnum::_name};
}
abstract class UnusedInterface extends core::Object {
  abstract get /*isLegacy*/ usedInterfaceField() → core::int?;
  abstract set /*isLegacy*/ usedInterfaceField(core::int? value) → void;
}
class UsedClass extends core::Object implements self::UnusedInterface {
  field core::int? usedField = null;
  field core::int? usedInterfaceField = null;
  synthetic constructor •() → self::UsedClass
    : super core::Object::•()
    ;
}
static method usedMethod(self::UnusedInterface c) → dynamic {
  c.{self::UnusedInterface::usedInterfaceField} = c.{self::UnusedInterface::usedInterfaceField};
}
static method main() → dynamic {
  self::usedMethod(let final self::UsedClass #t1 = new self::UsedClass::•() in block {
    #t1.{self::UsedClass::usedField};
  } =>#t1);
  #C3;
  core::List<self::UnusedEnum> list = core::_GrowableList::•<self::UnusedEnum>(0);
  if(list.{core::Iterable::isNotEmpty}) {
    let dynamic #t2 = new mai::ConstClass::•() in let dynamic #t3 = _in::unsafeCast<dynamic>(null) as{TypeError,ForDynamic,ForNonNullableByDefault} mai::ConstEnum in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
  }
}

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

abstract class ConstEnum extends core::Object {
}
class ConstClass extends core::Object {
  synthetic constructor •() → mai::ConstClass
    : super core::Object::•()
    ;
}

constants  {
  #C1 = 1
  #C2 = "UsedEnum.usedValue"
  #C3 = self::UsedEnum {index:#C1, _name:#C2}
}


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

org-dartlang-testcase:///main.dart:
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
