| library; |
| // |
| // Problems in library: |
| // |
| // pkg/front_end/testcases/patterns/exhaustiveness/generic_extension_members.dart:49:42: Error: The type 'I<num>' is not exhaustively matched by the switch cases since it doesn't match 'I<num>(member: double())'. |
| // - 'I' is from 'pkg/front_end/testcases/patterns/exhaustiveness/generic_extension_members.dart'. |
| // Try adding a wildcard pattern or cases that match 'I<num>(member: double())'. |
| // num exhaustiveMixed(I<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; |
| } |
| extension /* unnamed */ _extension#1<T extends core::Object? = dynamic> on self::A<T%> { |
| method member = self::_extension#1|member; |
| method tearoff member = self::_extension#1|get#member; |
| } |
| 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 { |
| return self::_extension#0|get#member::T% =={core::Type::==}{(core::Object) → core::bool} #C1 ?{core::num} 0.5 : 1; |
| } |
| static extension-member method _extension#1|member<T extends core::Object? = dynamic>(lowered final self::A<self::_extension#1|member::T%> #this, self::_extension#1|member::T% t) → void {} |
| static extension-member method _extension#1|get#member<T extends core::Object? = dynamic>(lowered final self::A<self::_extension#1|get#member::T%> #this) → (self::_extension#1|get#member::T%) → void |
| return (self::_extension#1|get#member::T% t) → void => self::_extension#1|member<self::_extension#1|get#member::T%>(#this, t); |
| static method exhaustiveInferred(self::A<core::num> a) → dynamic |
| return block { |
| core::int #t1; |
| final synthesized self::A<core::num> #0#0 = a; |
| #L1: |
| { |
| { |
| hoisted (core::int) → void member; |
| if(#0#0 is self::A<core::int>) { |
| member = self::_extension#1|get#member<core::int>(#0#0{self::A<core::int>}); |
| #t1 = 0; |
| break #L1; |
| } |
| } |
| { |
| hoisted (core::num) → void member; |
| if(true) { |
| member = self::_extension#1|get#member<core::num>(#0#0); |
| #t1 = 1; |
| break #L1; |
| } |
| } |
| } |
| } =>#t1; |
| static method exhaustiveTyped(self::A<core::num> a) → dynamic |
| return block { |
| core::int #t2; |
| final synthesized self::A<core::num> #0#0 = a; |
| synthesized (core::int) → void #0#2; |
| synthesized core::bool #0#2#isSet = false; |
| synthesized (core::num) → void #0#3; |
| synthesized core::bool #0#3#isSet = false; |
| #L2: |
| { |
| { |
| hoisted (core::int) → void member; |
| if(#0#0 is self::A<core::int> && (#0#2#isSet ?{(core::int) → void} #0#2{(core::int) → void} : let final core::bool #t3 = #0#2#isSet = true in #0#2 = self::_extension#1|get#member<core::int>(#0#0{self::A<core::int>})) is (core::int) → void) { |
| member = #0#2#isSet ?{(core::int) → void} #0#2{(core::int) → void} : let final core::bool #t4 = #0#2#isSet = true in #0#2 = self::_extension#1|get#member<core::int>(#0#0{self::A<core::int>}); |
| #t2 = 0; |
| break #L2; |
| } |
| } |
| { |
| hoisted (core::num) → void member; |
| if((#0#3#isSet ?{(core::num) → void} #0#3{(core::num) → void} : let final core::bool #t5 = #0#3#isSet = true in #0#3 = self::_extension#1|get#member<core::num>(#0#0)) is (core::num) → void) { |
| member = #0#3#isSet ?{(core::num) → void} #0#3{(core::num) → void} : let final core::bool #t6 = #0#3#isSet = true in #0#3 = self::_extension#1|get#member<core::num>(#0#0); |
| #t2 = 1; |
| break #L2; |
| } |
| } |
| } |
| } =>#t2; |
| static method unreachable(self::A<core::num> a) → dynamic |
| return block { |
| core::int #t7; |
| final synthesized self::A<core::num> #0#0 = a; |
| #L3: |
| { |
| { |
| hoisted (core::num) → void member; |
| if(true) { |
| member = self::_extension#1|get#member<core::num>(#0#0); |
| #t7 = 1; |
| break #L3; |
| } |
| } |
| { |
| hoisted (core::int) → void member; |
| if(#0#0 is self::A<core::int>) { |
| member = self::_extension#1|get#member<core::int>(#0#0{self::A<core::int>}); |
| #t7 = 0; |
| break #L3; |
| } |
| } |
| } |
| } =>#t7; |
| static method nonExhaustiveRestricted(self::A<core::num> a) → dynamic |
| return block { |
| core::int #t8; |
| final synthesized self::A<core::num> #0#0 = a; |
| synthesized (core::num) → void #0#1; |
| synthesized core::bool #0#1#isSet = false; |
| #L4: |
| { |
| { |
| hoisted (core::num) → void member; |
| if((#0#1#isSet ?{(core::num) → void} #0#1{(core::num) → void} : let final core::bool #t9 = #0#1#isSet = true in #0#1 = self::_extension#1|get#member<core::num>(#0#0)) is (core::num) → void) { |
| member = #0#1#isSet ?{(core::num) → void} #0#1{(core::num) → void} : let final core::bool #t10 = #0#1#isSet = true in #0#1 = self::_extension#1|get#member<core::num>(#0#0); |
| #t8 = 1; |
| break #L4; |
| } |
| } |
| { |
| hoisted (core::int) → void member; |
| if(#0#0 is self::A<core::int>) { |
| member = self::_extension#1|get#member<core::int>(#0#0{self::A<core::int>}); |
| #t8 = 0; |
| break #L4; |
| } |
| } |
| } |
| } =>#t8; |
| static method intersection(dynamic o) → dynamic { |
| #L5: |
| { |
| final synthesized dynamic #0#0 = o; |
| synthesized (core::int) → void #0#2; |
| synthesized core::bool #0#2#isSet = false; |
| { |
| lowered hoisted (core::int) → void member1#case#0; |
| lowered hoisted (core::double) → void member2#case#0; |
| lowered hoisted (core::int) → void member1#case#1; |
| lowered hoisted (core::num) → void member2#case#1; |
| if(#0#0 is self::A<core::int> && (let final (core::int) → void #t11 = member1#case#0 = #0#2#isSet ?{(core::int) → void} #0#2{(core::int) → void} : let final core::bool #t12 = #0#2#isSet = true in #0#2 = self::_extension#1|get#member<core::int>(#0#0{self::A<core::int>}) in true) && (#0#0{self::A<core::int>} is self::A<core::double> && (let final (core::double) → void #t13 = member2#case#0 = self::_extension#1|get#member<core::double>(#0#0{self::A<core::double>}) in true)) || #0#0 is self::A<core::int> && (let final (core::int) → void #t14 = member1#case#1 = #0#2#isSet ?{(core::int) → void} #0#2{(core::int) → void} : let final core::bool #t15 = #0#2#isSet = true in #0#2 = self::_extension#1|get#member<core::int>(#0#0{self::A<core::int>}) in true) && (let final (core::num) → void #t16 = member2#case#1 = self::_extension#1|get#member<core::num>(#0#0{self::A<core::int>}) in true)) { |
| } |
| } |
| } |
| } |
| static method exhaustiveMixed(self::I<core::num> i) → core::num |
| return block { |
| core::num #t17; |
| final synthesized self::I<core::num> #0#0 = i; |
| synthesized core::num #0#1; |
| synthesized core::bool #0#1#isSet = false; |
| #L6: |
| { |
| { |
| hoisted core::int member; |
| if((#0#1#isSet ?{core::num} #0#1{core::num} : let final core::bool #t18 = #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 #t19 = #0#1#isSet = true in #0#1 = self::_extension#0|get#member<core::num>(#0#0)) as{Unchecked} core::int; |
| #t17 = member; |
| break #L6; |
| } |
| } |
| { |
| hoisted core::double member; |
| if(#0#0 is self::J<core::num> && (#0#1#isSet ?{core::num} #0#1{core::num} : let final core::bool #t20 = #0#1#isSet = true in #0#1 = self::_extension#0|get#member<core::num>(#0#0{self::J<core::num>})) is core::double) { |
| member = (#0#1#isSet ?{core::num} #0#1{core::num} : let final core::bool #t21 = #0#1#isSet = true in #0#1 = self::_extension#0|get#member<core::num>(#0#0{self::J<core::num>})) as{Unchecked} core::double; |
| #t17 = member; |
| break #L6; |
| } |
| } |
| } |
| } =>#t17; |
| |
| constants { |
| #C1 = TypeLiteralConstant(core::int) |
| } |