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

class C<T extends core::Object> extends core::Object {
  constructor optional(([self::C::T]) → void func) → void
    : super core::Object::•() {}
  constructor named(({x: self::C::T}) → void func) → void
    : super core::Object::•() {}
}
static method optional_toplevel([dynamic x = const <core::int>[0]]) → void {}
static method named_toplevel({dynamic x = const <core::int>[0]}) → void {}
static method main() → dynamic {
  function optional_local([dynamic x = const <core::int>[0]]) → void {}
  function named_local({dynamic x = const <core::int>[0]}) → void {}
  self::C<dynamic> c_optional_toplevel = new self::C::optional<dynamic>(self::optional_toplevel);
  self::C<dynamic> c_named_toplevel = new self::C::named<dynamic>(self::named_toplevel);
  self::C<dynamic> c_optional_local = new self::C::optional<dynamic>(optional_local);
  self::C<dynamic> c_named_local = new self::C::named<dynamic>(named_local);
  self::C<dynamic> c_optional_closure = new self::C::optional<dynamic>(([dynamic x = const <core::int>[0]]) → core::Null {});
  self::C<dynamic> c_named_closure = new self::C::named<dynamic>(({dynamic x = const <core::int>[0]}) → core::Null {});
}
