library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/optional.dart:47:21: Error: The argument type 'InvalidListener' can't be assigned to the parameter type 'Listener'.
//  - 'InvalidListener' is from 'pkg/front_end/testcases/general/optional.dart'.
//  - 'Listener' is from 'pkg/front_end/testcases/general/optional.dart'.
//   extern.listen(new InvalidListener());
//                     ^
//
// pkg/front_end/testcases/general/optional.dart:49:28: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing1 = foo.method();
//                            ^
//
// pkg/front_end/testcases/general/optional.dart:50:28: Error: Too many positional arguments: 3 allowed, but 4 found.
// Try removing the extra positional arguments.
//   var nothing2 = foo.method(1, 2, 3, 4);
//                            ^
//
// pkg/front_end/testcases/general/optional.dart:51:39: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing3 = extern.externalMethod();
//                                       ^
//
// pkg/front_end/testcases/general/optional.dart:52:39: Error: Too many positional arguments: 3 allowed, but 4 found.
// Try removing the extra positional arguments.
//   var nothing4 = extern.externalMethod(1, 2, 3, 4);
//                                       ^
//
import self as self;
import "dart:core" as core;

class Foo extends core::Object {
  synthetic constructor •() → self::Foo
    : super core::Object::•()
    ;
  method method(dynamic x, [dynamic y = #C1, dynamic z = #C1]) → dynamic {
    return "string";
  }
}
abstract class External extends core::Object {
  synthetic constructor •() → self::External
    : super core::Object::•()
    ;
  abstract method externalMethod(core::int x, [core::int y = #C1, core::int z = #C1]) → core::String;
  abstract method listen(self::Listener listener) → void;
}
abstract class Listener extends core::Object {
  synthetic constructor •() → self::Listener
    : super core::Object::•()
    ;
  abstract method event(core::String input, [core::int? x = #C1, core::int? y = #C1]) → void;
}
class TestListener extends self::Listener {
  synthetic constructor •() → self::TestListener
    : super self::Listener::•()
    ;
  method event(core::String input, [core::int? x = #C1, core::int? y = #C1]) → void {}
}
class ExtendedListener extends self::Listener {
  synthetic constructor •() → self::ExtendedListener
    : super self::Listener::•()
    ;
  method event(core::String input, [core::int? x = #C1, core::int? y = #C1, dynamic z = #C1]) → void {}
}
class InvalidListener extends core::Object {
  synthetic constructor •() → self::InvalidListener
    : super core::Object::•()
    ;
  method event(dynamic input, [dynamic x = #C1]) → void {}
}
external static method createExternal() → self::External;
static method main() → dynamic {
  self::Foo foo = new self::Foo::•();
  dynamic string1 = foo.{self::Foo::method}(1){(dynamic, [dynamic, dynamic]) → dynamic};
  dynamic string2 = foo.{self::Foo::method}(1, 2){(dynamic, [dynamic, dynamic]) → dynamic};
  dynamic string3 = foo.{self::Foo::method}(1, 2, 3){(dynamic, [dynamic, dynamic]) → dynamic};
  self::External extern = self::createExternal();
  core::String string4 = extern.{self::External::externalMethod}(1){(core::int, [core::int, core::int]) → core::String};
  core::String string5 = extern.{self::External::externalMethod}(1, 2){(core::int, [core::int, core::int]) → core::String};
  core::String string6 = extern.{self::External::externalMethod}(1, 2, 3){(core::int, [core::int, core::int]) → core::String};
  extern.{self::External::listen}(new self::TestListener::•()){(self::Listener) → void};
  extern.{self::External::listen}(new self::ExtendedListener::•()){(self::Listener) → void};
  extern.{self::External::listen}(invalid-expression "pkg/front_end/testcases/general/optional.dart:47:21: Error: The argument type 'InvalidListener' can't be assigned to the parameter type 'Listener'.
 - 'InvalidListener' is from 'pkg/front_end/testcases/general/optional.dart'.
 - 'Listener' is from 'pkg/front_end/testcases/general/optional.dart'.
  extern.listen(new InvalidListener());
                    ^" in new self::InvalidListener::•() as{TypeError,ForNonNullableByDefault} self::Listener){(self::Listener) → void};
  invalid-type nothing1 = invalid-expression "pkg/front_end/testcases/general/optional.dart:49:28: Error: Too few positional arguments: 1 required, 0 given.
  var nothing1 = foo.method();
                           ^" in foo.{self::Foo::method}{<inapplicable>}.(){() → invalid-type};
  invalid-type nothing2 = invalid-expression "pkg/front_end/testcases/general/optional.dart:50:28: Error: Too many positional arguments: 3 allowed, but 4 found.
Try removing the extra positional arguments.
  var nothing2 = foo.method(1, 2, 3, 4);
                           ^" in foo.{self::Foo::method}{<inapplicable>}.(1, 2, 3, 4){(invalid-type, invalid-type, invalid-type, invalid-type) → invalid-type};
  invalid-type nothing3 = invalid-expression "pkg/front_end/testcases/general/optional.dart:51:39: Error: Too few positional arguments: 1 required, 0 given.
  var nothing3 = extern.externalMethod();
                                      ^" in extern.{self::External::externalMethod}{<inapplicable>}.(){() → invalid-type};
  invalid-type nothing4 = invalid-expression "pkg/front_end/testcases/general/optional.dart:52:39: Error: Too many positional arguments: 3 allowed, but 4 found.
Try removing the extra positional arguments.
  var nothing4 = extern.externalMethod(1, 2, 3, 4);
                                      ^" in extern.{self::External::externalMethod}{<inapplicable>}.(1, 2, 3, 4){(invalid-type, invalid-type, invalid-type, invalid-type) → invalid-type};
}

constants  {
  #C1 = null
}
