library test;
import self as self;
import "dart:core" as core;

static method block_test() → void {
  () →* core::List<core::Object*>* g;
  g = () → core::List<core::Object*>* {
    return <core::Object*>[3];
  };
  assert(g is () →* core::List<core::Object*>*);
  assert(!(g is () →* core::List<core::int*>*));
  g.call().{core::List::add}("hello");
  core::List<core::int*>* l = <core::int*>[3];
  g = () → core::List<core::int*>* {
    return l;
  };
  assert(g is () →* core::List<core::Object*>*);
  assert(g is () →* core::List<core::int*>*);
  try {
    g.call().{core::List::add}("hello");
    throw "expected a runtime error";
  }
  on core::TypeError* catch(no-exception-var) {
  }
  core::Object* o = l;
  g = () → core::List<core::Object*>* {
    return o as{TypeError} core::List<core::Object*>*;
  };
  assert(g is () →* core::List<core::Object*>*);
  assert(!(g is () →* core::List<core::int*>*));
  assert(!(g is () →* core::Object*));
  g.call();
  o = 3;
  try {
    g.call();
    throw "expected a runtime error";
  }
  on core::TypeError* catch(no-exception-var) {
  }
}
static method arrow_test() → void {
  () →* core::List<core::Object*>* g;
  g = () → core::List<core::Object*>* => <core::Object*>[3];
  assert(g is () →* core::List<core::Object*>*);
  assert(!(g is () →* core::List<core::int*>*));
  g.call().{core::List::add}("hello");
  core::List<core::int*>* l = <core::int*>[3];
  g = () → core::List<core::int*>* => l;
  assert(g is () →* core::List<core::Object*>*);
  assert(g is () →* core::List<core::int*>*);
  try {
    g.call().{core::List::add}("hello");
    throw "expected a runtime error";
  }
  on core::TypeError* catch(no-exception-var) {
  }
  core::Object* o = l;
  g = () → core::List<core::Object*>* => o as{TypeError} core::List<core::Object*>*;
  assert(g is () →* core::List<core::Object*>*);
  assert(!(g is () →* core::List<core::int*>*));
  assert(!(g is () →* core::Object*));
  g.call();
  o = 3;
  try {
    g.call();
    throw "expected a runtime error";
  }
  on core::TypeError* catch(no-exception-var) {
  }
}
static method main() → dynamic {
  self::block_test();
  self::arrow_test();
}
