// Formatted problems:
//
// pkg/front_end/testcases/call.dart:29:31: Error: Cannot invoke an instance of '#lib1::CallableGetter' because it declares 'call' to be something other than a method.
// Try changing 'call' to a method or explicitly invoke 'call'.
//   var string5 = callableGetter(1);
//                               ^
//
// pkg/front_end/testcases/call.dart:34:25: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing1 = closure();
//                         ^
//
// pkg/front_end/testcases/call.dart:35:30: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing2 = closure.call();
//                              ^
//
// pkg/front_end/testcases/call.dart:36:35: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing3 = closure.call.call();
//                                   ^
//
// pkg/front_end/testcases/call.dart:37:40: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing4 = closure.call.call.call();
//                                        ^
//
// pkg/front_end/testcases/call.dart:39:26: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing5 = callable();
//                          ^
//
// pkg/front_end/testcases/call.dart:40:31: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing6 = callable.call();
//                               ^
//
// pkg/front_end/testcases/call.dart:41:36: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing7 = callable.call.call();
//                                    ^
//
// pkg/front_end/testcases/call.dart:42:41: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing8 = callable.call.call.call();
//                                         ^
//
// pkg/front_end/testcases/call.dart:44:32: Error: Cannot invoke an instance of '#lib1::CallableGetter' because it declares 'call' to be something other than a method.
// Try changing 'call' to a method or explicitly invoke 'call'.
//   var nothing9 = callableGetter();
//                                ^

// Unhandled errors:
//
// pkg/front_end/testcases/call.dart:34:25: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing1 = closure();
//                         ^
//
// pkg/front_end/testcases/call.dart:35:30: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing2 = closure.call();
//                              ^
//
// pkg/front_end/testcases/call.dart:36:35: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing3 = closure.call.call();
//                                   ^
//
// pkg/front_end/testcases/call.dart:37:40: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing4 = closure.call.call.call();
//                                        ^
//
// pkg/front_end/testcases/call.dart:39:26: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing5 = callable();
//                          ^
//
// pkg/front_end/testcases/call.dart:40:31: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing6 = callable.call();
//                               ^
//
// pkg/front_end/testcases/call.dart:41:36: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing7 = callable.call.call();
//                                    ^
//
// pkg/front_end/testcases/call.dart:42:41: Error: Too few positional arguments: 1 required, 0 given.
//   var nothing8 = callable.call.call.call();
//                                         ^

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

class Callable extends core::Object {
  synthetic constructor •() → self::Callable
    : super core::Object::•()
    ;
  method call(dynamic x) → dynamic {
    return "string";
  }
}
class CallableGetter extends core::Object {
  synthetic constructor •() → self::CallableGetter
    : super core::Object::•()
    ;
  get call() → dynamic
    return new self::Callable::•();
}
static method main() → dynamic {
  (dynamic) → dynamic closure = (dynamic x) → dynamic => x;
  dynamic int1 = closure.call(1);
  dynamic int2 = closure.call(1);
  dynamic int3 = closure.call.call(1);
  dynamic int4 = closure.call.call.call(1);
  self::Callable callable = new self::Callable::•();
  dynamic string1 = callable.{self::Callable::call}(1);
  dynamic string2 = callable.{self::Callable::call}(1);
  dynamic string3 = callable.{self::Callable::call}.call(1);
  dynamic string4 = callable.{self::Callable::call}.call.call(1);
  self::CallableGetter callableGetter = new self::CallableGetter::•();
  dynamic string5 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/call.dart:29:31: Error: Cannot invoke an instance of '#lib1::CallableGetter' because it declares 'call' to be something other than a method.
Try changing 'call' to a method or explicitly invoke 'call'.
  var string5 = callableGetter(1);
                              ^" in callableGetter.{self::CallableGetter::call}(1);
  dynamic string6 = callableGetter.{self::CallableGetter::call}(1);
  dynamic string7 = callableGetter.{self::CallableGetter::call}.call(1);
  dynamic string8 = callableGetter.{self::CallableGetter::call}.call.call(1);
  dynamic nothing1 = closure.call();
  dynamic nothing2 = closure.call();
  dynamic nothing3 = closure.call.call();
  dynamic nothing4 = closure.call.call.call();
  dynamic nothing5 = callable.{self::Callable::call}();
  dynamic nothing6 = callable.{self::Callable::call}();
  dynamic nothing7 = callable.{self::Callable::call}.call();
  dynamic nothing8 = callable.{self::Callable::call}.call.call();
  dynamic nothing9 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/call.dart:44:32: Error: Cannot invoke an instance of '#lib1::CallableGetter' because it declares 'call' to be something other than a method.
Try changing 'call' to a method or explicitly invoke 'call'.
  var nothing9 = callableGetter();
                               ^" in callableGetter.{self::CallableGetter::call}();
  dynamic nothing10 = callableGetter.{self::CallableGetter::call}();
  dynamic nothing11 = callableGetter.{self::CallableGetter::call}.call();
  dynamic nothing12 = callableGetter.{self::CallableGetter::call}.call.call();
}
