// Formatted problems:
//
// pkg/front_end/testcases/regress/issue_31299.dart:18:12: Error: Too many positional arguments: 0 allowed, but 2 found.
// Try removing the extra positional arguments.
//   new A.foo(1, 2);
//            ^
// pkg/front_end/testcases/regress/issue_31299.dart:10:3: Error: Found this candidate, but the arguments don't match.
//   A.foo() : m = 2;
//   ^^^
//
// pkg/front_end/testcases/regress/issue_31299.dart:15:14: Error: Too few positional arguments: 2 required, 0 given.
//   new A().foo();
//              ^

// Unhandled errors:
//
// pkg/front_end/testcases/regress/issue_31299.dart:18:12: Error: Too many positional arguments: 0 allowed, but 2 found.
// Try removing the extra positional arguments.
//   new A.foo(1, 2);
//            ^
//
// pkg/front_end/testcases/regress/issue_31299.dart:15:14: Error: Too few positional arguments: 2 required, 0 given.
//   new A().foo();
//              ^

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

class A extends core::Object {
  field core::int m;
  constructor •() → void
    : self::A::m = 1, super core::Object::•()
    ;
  constructor foo() → void
    : self::A::m = 2, super core::Object::•()
    ;
  method foo(core::int a, core::int b) → core::int
    return a.{core::num::+}(b.{core::num::*}(this.{self::A::m}));
}
static method test() → dynamic {
  new self::A::•().{self::A::foo}();
  new self::A::•().{self::A::foo}(1, 2);
  new self::A::foo();
  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#foo, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[1, 2]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
}
static method main() → dynamic {}
