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

class F0 extends core::Object {
  constructor •(core::List<core::int> a) → void
    : super core::Object::•() {}
}
class F1 extends core::Object {
  constructor •({core::List<core::int> a = null}) → void
    : super core::Object::•() {}
}
class F2 extends core::Object {
  constructor •(core::Iterable<core::int> a) → void
    : super core::Object::•() {}
}
class F3 extends core::Object {
  constructor •(core::Iterable<core::Iterable<core::int>> a) → void
    : super core::Object::•() {}
}
class F4 extends core::Object {
  constructor •({core::Iterable<core::Iterable<core::int>> a = null}) → void
    : super core::Object::•() {}
}
static method test() → void {
  new self::F0::•(<dynamic>[]);
  new self::F0::•(<dynamic>[3]);
  new self::F0::•(<dynamic>["hello"]);
  new self::F0::•(<dynamic>["hello", 3]);
  new self::F1::•(a: <dynamic>[]);
  new self::F1::•(a: <dynamic>[3]);
  new self::F1::•(a: <dynamic>["hello"]);
  new self::F1::•(a: <dynamic>["hello", 3]);
  new self::F2::•(<dynamic>[]);
  new self::F2::•(<dynamic>[3]);
  new self::F2::•(<dynamic>["hello"]);
  new self::F2::•(<dynamic>["hello", 3]);
  new self::F3::•(<dynamic>[]);
  new self::F3::•(<dynamic>[<dynamic>[3]]);
  new self::F3::•(<dynamic>[<dynamic>["hello"]]);
  new self::F3::•(<dynamic>[<dynamic>["hello"], <dynamic>[3]]);
  new self::F4::•(a: <dynamic>[]);
  new self::F4::•(a: <dynamic>[<dynamic>[3]]);
  new self::F4::•(a: <dynamic>[<dynamic>["hello"]]);
  new self::F4::•(a: <dynamic>[<dynamic>["hello"], <dynamic>[3]]);
}
static method main() → dynamic {}
