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

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