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

class Class<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
  final field core::bool field;
  const constructor •(dynamic value) → self::Class<self::Class::T%>
    : self::Class::field = value is{ForNonNullableByDefault} self::Class::T%, super core::Object::•()
    ;
}
class ClassWithBound<T extends core::num> extends core::Object /*hasConstConstructor*/  {
  final field core::bool field;
  const constructor •() → self::ClassWithBound<self::ClassWithBound::T>
    : self::ClassWithBound::field = (#C1) is{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
    ;
  const constructor withValue(dynamic value) → self::ClassWithBound<self::ClassWithBound::T>
    : self::ClassWithBound::field = value is{ForNonNullableByDefault} self::ClassWithBound::T, super core::Object::•()
    ;
}
class ClassWithList<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
  final field core::bool field;
  const constructor •(dynamic value) → self::ClassWithList<self::ClassWithList::T%>
    : self::ClassWithList::field = value is{ForNonNullableByDefault} core::List<self::ClassWithList::T%>, super core::Object::•()
    ;
}
class ClassWithFunction<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
  final field core::bool field;
  const constructor •(dynamic value) → self::ClassWithFunction<self::ClassWithFunction::T%>
    : self::ClassWithFunction::field = value is{ForNonNullableByDefault} (self::ClassWithFunction::T%) → self::ClassWithFunction::T%, super core::Object::•()
    ;
}
static const field core::num three = #C1;
static const field (core::int) → core::int idAsIntFunction = #C3;
static method dynamicFunction(dynamic d) → dynamic
  return d;
static method objectFunction(core::Object? o) → core::Object?
  return o;
static method intFunction(core::int i) → core::int
  return i;
static method idFunction<T extends core::Object? = dynamic>(self::idFunction::T% t) → self::idFunction::T%
  return t;
static method main() → void {
  #C5;
  #C6;
  #C7;
  #C8;
  #C9;
  #C9;
  #C9;
  #C10;
  #C11;
  #C12;
  #C13;
  #C14;
  #C15;
  #C16;
  #C15;
  #C17;
  #C18;
  #C18;
  #C19;
  #C21;
  #C22;
  #C23;
  #C24;
  #C24;
  #C24;
  #C25;
  #C26;
  #C27;
  #C28;
  #C29;
  #C30;
  #C30;
  #C31;
  #C32;
  #C33;
  #C34;
}

constants  {
  #C1 = 3
  #C2 = static-tearoff self::idFunction
  #C3 = instantiation self::idFunction <core::int*>
  #C4 = true
  #C5 = self::Class<dynamic> {field:#C4}
  #C6 = self::Class<core::num*> {field:#C4}
  #C7 = self::Class<core::int*> {field:#C4}
  #C8 = self::Class<core::String*> {field:#C4}
  #C9 = self::ClassWithBound<core::int*> {field:#C4}
  #C10 = self::ClassWithBound<core::double*> {field:#C4}
  #C11 = self::ClassWithList<dynamic> {field:#C4}
  #C12 = self::ClassWithList<core::num*> {field:#C4}
  #C13 = self::ClassWithList<core::int*> {field:#C4}
  #C14 = self::ClassWithList<core::String*> {field:#C4}
  #C15 = self::ClassWithFunction<dynamic> {field:#C4}
  #C16 = self::ClassWithFunction<core::Object?> {field:#C4}
  #C17 = self::ClassWithFunction<void> {field:#C4}
  #C18 = self::ClassWithFunction<core::int*> {field:#C4}
  #C19 = self::ClassWithFunction<core::Object*> {field:#C4}
  #C20 = false
  #C21 = self::Class<core::num*> {field:#C20}
  #C22 = self::Class<core::int*> {field:#C20}
  #C23 = self::Class<core::String*> {field:#C20}
  #C24 = self::ClassWithBound<core::double*> {field:#C20}
  #C25 = self::ClassWithBound<core::num*> {field:#C20}
  #C26 = self::ClassWithList<dynamic> {field:#C20}
  #C27 = self::ClassWithList<core::num*> {field:#C20}
  #C28 = self::ClassWithList<core::int*> {field:#C20}
  #C29 = self::ClassWithList<core::String*> {field:#C20}
  #C30 = self::ClassWithFunction<dynamic> {field:#C20}
  #C31 = self::ClassWithFunction<core::Object*> {field:#C20}
  #C32 = self::ClassWithFunction<void> {field:#C20}
  #C33 = self::ClassWithFunction<core::num*> {field:#C20}
  #C34 = self::ClassWithFunction<core::int*> {field:#C20}
}


Constructor coverage from constants:
org-dartlang-testcase:///potentially_constant_type_is.dart:
- Class. (from org-dartlang-testcase:///potentially_constant_type_is.dart:16:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
- ClassWithBound. (from org-dartlang-testcase:///potentially_constant_type_is.dart:22:9)
- ClassWithBound.withValue (from org-dartlang-testcase:///potentially_constant_type_is.dart:24:9)
- ClassWithList. (from org-dartlang-testcase:///potentially_constant_type_is.dart:30:9)
- ClassWithFunction. (from org-dartlang-testcase:///potentially_constant_type_is.dart:36:9)
