|  | library; | 
|  | // | 
|  | // Problems in library: | 
|  | // | 
|  | // pkg/front_end/testcases/patterns/generic_extension_access.dart:27:34: Error: The type 'A<num>' is not exhaustively matched by the switch cases since it doesn't match 'I<num>(member: double()) && J<num>(member: int())'. | 
|  | //  - 'A' is from 'pkg/front_end/testcases/patterns/generic_extension_access.dart'. | 
|  | // Try adding a wildcard pattern or cases that match 'I<num>(member: double()) && J<num>(member: int())'. | 
|  | // num method2(A<num> i) => switch (i) { | 
|  | //                                  ^ | 
|  | // | 
|  | import self as self; | 
|  | import "dart:core" as core; | 
|  |  | 
|  | class I<T extends core::Object? = dynamic> extends core::Object { | 
|  | synthetic constructor •() → self::I<self::I::T%> | 
|  | : super core::Object::•() | 
|  | ; | 
|  | } | 
|  | class J<T extends core::Object? = dynamic> extends self::I<self::J::T%> { | 
|  | synthetic constructor •() → self::J<self::J::T%> | 
|  | : super self::I::•() | 
|  | ; | 
|  | } | 
|  | class A<T extends core::Object? = dynamic> extends self::J<self::A::T%> { | 
|  | synthetic constructor •() → self::A<self::A::T%> | 
|  | : super self::J::•() | 
|  | ; | 
|  | } | 
|  | extension /* unnamed */ _extension#0<T extends core::Object? = dynamic> on self::I<T%> { | 
|  | get member = self::_extension#0|get#member; | 
|  | } | 
|  | static field core::int counter = 0; | 
|  | static extension-member method _extension#0|get#member<T extends core::Object? = dynamic>(lowered final self::I<self::_extension#0|get#member::T%> #this) → core::num { | 
|  | self::counter = self::counter.{core::num::+}(1){(core::num) → core::int}; | 
|  | return self::_extension#0|get#member::T% =={core::Type::==}{(core::Object) → core::bool} #C1 ?{core::num} 0.5 : 1.{core::int::unary-}(){() → core::int}; | 
|  | } | 
|  | static method method1(self::I<core::num> i) → core::num | 
|  | return block { | 
|  | core::num #t1; | 
|  | final synthesized self::I<core::num> #0#0 = i; | 
|  | synthesized core::num #0#1; | 
|  | synthesized core::bool #0#1#isSet = false; | 
|  | #L1: | 
|  | { | 
|  | { | 
|  | hoisted core::num member; | 
|  | if((let final core::num #t2 = member = #0#1#isSet ?{core::num} #0#1{core::num} : let final core::bool #t3 = #0#1#isSet = true in #0#1 = self::_extension#0|get#member<core::num>(#0#0) in true) && member.{core::num::<}(0){(core::num) → core::bool}) { | 
|  | #t1 = member; | 
|  | break #L1; | 
|  | } | 
|  | } | 
|  | { | 
|  | hoisted core::num member; | 
|  | if(#0#0 is self::I<core::int> && (let final core::num #t4 = member = self::_extension#0|get#member<core::int>(#0#0{self::I<core::int>}) in true) && member.{core::num::<}(0){(core::num) → core::bool}) { | 
|  | #t1 = member; | 
|  | break #L1; | 
|  | } | 
|  | } | 
|  | { | 
|  | hoisted core::num member; | 
|  | if(true) { | 
|  | member = #0#1#isSet ?{core::num} #0#1{core::num} : let final core::bool #t5 = #0#1#isSet = true in #0#1 = self::_extension#0|get#member<core::num>(#0#0); | 
|  | #t1 = member.{core::num::unary-}(){() → core::num}; | 
|  | break #L1; | 
|  | } | 
|  | } | 
|  | } | 
|  | } =>#t1; | 
|  | static method method2(self::A<core::num> i) → core::num | 
|  | return block { | 
|  | core::num #t6; | 
|  | final synthesized self::A<core::num> #0#0 = i; | 
|  | synthesized core::num #0#1; | 
|  | synthesized core::bool #0#1#isSet = false; | 
|  | #L2: | 
|  | { | 
|  | { | 
|  | hoisted core::int member; | 
|  | if((#0#1#isSet ?{core::num} #0#1{core::num} : let final core::bool #t7 = #0#1#isSet = true in #0#1 = self::_extension#0|get#member<core::num>(#0#0)) is core::int) { | 
|  | member = (#0#1#isSet ?{core::num} #0#1{core::num} : let final core::bool #t8 = #0#1#isSet = true in #0#1 = self::_extension#0|get#member<core::num>(#0#0)) as{Unchecked} core::int; | 
|  | #t6 = member; | 
|  | break #L2; | 
|  | } | 
|  | } | 
|  | { | 
|  | hoisted core::double member; | 
|  | if((#0#1#isSet ?{core::num} #0#1{core::num} : let final core::bool #t9 = #0#1#isSet = true in #0#1 = self::_extension#0|get#member<core::num>(#0#0)) is core::double) { | 
|  | member = (#0#1#isSet ?{core::num} #0#1{core::num} : let final core::bool #t10 = #0#1#isSet = true in #0#1 = self::_extension#0|get#member<core::num>(#0#0)) as{Unchecked} core::double; | 
|  | #t6 = member; | 
|  | break #L2; | 
|  | } | 
|  | } | 
|  | } | 
|  | } =>#t6; | 
|  | static method main() → dynamic { | 
|  | self::counter = 0; | 
|  | self::expect(1.{core::int::unary-}(){() → core::int}, self::method1(new self::A::•<core::int>())); | 
|  | self::expect(2, self::counter); | 
|  | self::counter = 0; | 
|  | self::expect(0.5.{core::double::unary-}(){() → core::double}, self::method1(new self::A::•<core::num>())); | 
|  | self::expect(1, self::counter); | 
|  | self::counter = 0; | 
|  | self::expect(0.5.{core::double::unary-}(){() → core::double}, self::method1(new self::A::•<core::double>())); | 
|  | self::expect(1, self::counter); | 
|  | self::counter = 0; | 
|  | self::expect(0.5, self::method2(new self::A::•<core::int>())); | 
|  | self::expect(1, self::counter); | 
|  | } | 
|  | static method expect(dynamic expected, dynamic actual) → dynamic { | 
|  | if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual)) | 
|  | throw "Expected ${expected}, actual ${actual}"; | 
|  | } | 
|  |  | 
|  | constants  { | 
|  | #C1 = TypeLiteralConstant(core::num) | 
|  | } | 
|  |  | 
|  | Extra constant evaluation status: | 
|  | Evaluated: InstanceInvocation @ org-dartlang-testcase:///generic_extension_access.dart:16:29 -> IntConstant(-1) | 
|  | Evaluated: InstanceInvocation @ org-dartlang-testcase:///generic_extension_access.dart:34:10 -> IntConstant(-1) | 
|  | Evaluated: InstanceInvocation @ org-dartlang-testcase:///generic_extension_access.dart:38:10 -> DoubleConstant(-0.5) | 
|  | Evaluated: InstanceInvocation @ org-dartlang-testcase:///generic_extension_access.dart:42:10 -> DoubleConstant(-0.5) | 
|  | Extra constant evaluation: evaluated: 129, effectively constant: 4 |