library;
import self as self;
import "dart:core" as core;

class C<T extends core::Object? = dynamic> extends core::Object /*hasConstConstructor*/  {
  const constructor •() → self::C<self::C::T%>
    : super core::Object::•()
    ;
}
static method main() → void {
  hoisted has-declared-initializer core::int a1;
  {
    final synthesized core::Map<self::C<core::String>, core::int> #0#0 = <self::C<core::String>, core::int>{#C1: 1};
    synthesized core::int? #0#3;
    synthesized core::bool #0#3#isSet = false;
    if(!((!((#0#3#isSet ?{core::int?} #0#3{core::int?} : let final core::bool #t1 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::int?}) == null) || null is core::int && #0#0.{core::Map::containsKey}(#C1){(core::Object?) → core::bool}) && (let final core::int #t2 = a1 = let core::int? #t3 = #0#3#isSet ?{core::int?} #0#3{core::int?} : let final core::bool #t4 = #0#3#isSet = true in #0#3 = #0#0.{core::Map::[]}(#C1){(core::Object?) → core::int?} in #t3 == null ?{core::int} #t3 as{Unchecked} core::int : #t3{core::int} in true)))
      throw{for-error-handling} new core::StateError::•("Pattern matching error");
  }
}

constants  {
  #C1 = self::C<core::String> {}
}

Extra constant evaluation status:
Evaluated: LogicalExpression @ org-dartlang-testcase:///issue51523.dart:10:17 -> BoolConstant(false)
Extra constant evaluation: evaluated: 34, effectively constant: 1


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