blob: 4309789b5dabf9aec1719f0668230bb3d6bdbd5e [file] [log] [blame]
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)
}