blob: a147be9f476366b3b5ba21424f06b80267759371 [file] [log] [blame]
library;
import self as self;
import "dart:core" as core;
typedef E<invariant T extends core::Object? = dynamic> = (T%) T%;
class A extends core::Object {
synthetic constructor •() self::A
: super core::Object::•()
;
}
class B extends core::Object implements self::A {
synthetic constructor •() self::B
: super core::Object::•()
;
}
class C extends core::Object implements self::A {
synthetic constructor •() self::C
: super core::Object::•()
;
}
class D extends core::Object implements self::B, self::C {
synthetic constructor •() self::D
: super core::Object::•()
;
}
class Rt<T extends core::Object? = dynamic> extends core::Object {
constructor •(self::Rt::T% t) self::Rt<self::Rt::T%>
: super core::Object::•()
;
method rt<covariant-by-class T2 extends (self::Rt::T%) self::Rt::T%>() void {}
}
extension St<T extends core::Object? = dynamic> on T% {
method st = self::St|st;
method tearoff st = self::St|get#st;
}
static method main() void {
self::foo<core::Object>(false, new self::D::•(), new self::D::•());
}
static method foo<X extends core::Object? = dynamic>(core::bool not, self::foo::X% b, self::foo::X% c) void {
if(!(b is self::B))
return;
{
self::foo::X% v1 = b{self::foo::X% & self::B /* '%' & '!' = '!' */};
self::B v2 = b{self::foo::X% & self::B /* '%' & '!' = '!' */};
}
if(!(c is self::C))
return;
{
self::foo::X% v1 = c{self::foo::X% & self::C /* '%' & '!' = '!' */};
self::C v2 = c{self::foo::X% & self::C /* '%' & '!' = '!' */};
}
self::foo::X% bc = not ?{self::foo::X%} b{self::foo::X% & self::B /* '%' & '!' = '!' */} : c{self::foo::X% & self::C /* '%' & '!' = '!' */};
{
self::foo::X% v1 = bc;
if(not) {
bc = 0 as self::foo::X%;
throw "never got here, never go back";
}
}
self::St|get#st<self::foo::X%>(bc)<(self::foo::X%) → self::foo::X%>;
self::St|get#st<self::foo::X%>(bc)<(self::foo::X%) → self::foo::X%>;
(new self::Rt::•<self::foo::X%>(bc).{self::Rt::rt}{<T2 extends (self::foo::X%) self::foo::X%>() void} as{TypeError,CovarianceCheck} <T2 extends (self::foo::X%) self::foo::X%>() void)<(self::foo::X%) self::foo::X%>;
}
static extension-member method St|st<T extends core::Object? = dynamic, T2 extends (self::St|st::T%) self::St|st::T% = (dynamic) dynamic>(lowered final self::St|st::T% #this) → void {}
static extension-member method St|get#st<T extends core::Object? = dynamic>(lowered final self::St|get#st::T% #this) → <T2 extends (self::St|get#st::T%) → self::St|get#st::T% = (dynamic) → dynamic>() → void
return <T2 extends (self::St|get#st::T%) → self::St|get#st::T% = (dynamic) → dynamic>() → void => self::St|st<self::St|get#st::T%, T2>(#this);