blob: 89feb06e0beea4a94557bc2c0d632e65f2674bdb [file] [log] [blame]
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