| 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; |
| import "dart:_internal" as _in; |
| |
| 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; |
| } |
| } |
| throw{for-error-handling} new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable type."); |
| } |
| } =>#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; |
| } |
| } |
| throw{for-error-handling} new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable type."); |
| } |
| } =>#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: 133, effectively constant: 4 |