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;
  #C20;
  #C21;
  #C22;
  #C23;
  #C24;
  #C24;
  #C24;
  #C25;
  #C26;
  #C27;
  #C28;
  #C29;
  #C30;
  #C30;
  #C20;
  #C31;
  #C32;
  #C33;
}

constants  {
  #C1 = 3
  #C2 = static-tearoff self::idFunction
  #C3 = instantiation #C2 <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 = false
  #C20 = self::ClassWithFunction<core::Object> {field:#C19}
  #C21 = self::Class<core::num> {field:#C19}
  #C22 = self::Class<core::int> {field:#C19}
  #C23 = self::Class<core::String> {field:#C19}
  #C24 = self::ClassWithBound<core::double> {field:#C19}
  #C25 = self::ClassWithBound<core::num> {field:#C19}
  #C26 = self::ClassWithList<dynamic> {field:#C19}
  #C27 = self::ClassWithList<core::num> {field:#C19}
  #C28 = self::ClassWithList<core::int> {field:#C19}
  #C29 = self::ClassWithList<core::String> {field:#C19}
  #C30 = self::ClassWithFunction<dynamic> {field:#C19}
  #C31 = self::ClassWithFunction<void> {field:#C19}
  #C32 = self::ClassWithFunction<core::num> {field:#C19}
  #C33 = self::ClassWithFunction<core::int> {field:#C19}
}


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)
