library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd/issue41520.dart:7:11: Error: The method 'notAMethodOnObject' isn't defined for the class 'Object'.
//  - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'notAMethodOnObject'.
//     error.notAMethodOnObject();
//           ^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/issue41520.dart:12:11: Error: The method 'notAMethodOnObject' isn't defined for the class 'Object'.
//  - 'Object' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'notAMethodOnObject'.
//     error.notAMethodOnObject();
//           ^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/nnbd/issue41520.dart:13:16: Error: The method 'notAMethodOnStackTrace' isn't defined for the class 'StackTrace'.
//  - 'StackTrace' is from 'dart:core'.
// Try correcting the name to the name of an existing method, or defining a method named 'notAMethodOnStackTrace'.
//     stackTrace.notAMethodOnStackTrace();
//                ^^^^^^^^^^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;

static method errors() → void {
  try {
  }
  on core::Object catch(final core::Object error) {
    invalid-expression "pkg/front_end/testcases/nnbd/issue41520.dart:7:11: Error: The method 'notAMethodOnObject' isn't defined for the class 'Object'.
 - 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'notAMethodOnObject'.
    error.notAMethodOnObject();
          ^^^^^^^^^^^^^^^^^^" in error{<unresolved>}.notAMethodOnObject();
    self::_takesObject(error);
  }
  try {
  }
  on core::Object catch(final core::Object error, final core::StackTrace stackTrace) {
    invalid-expression "pkg/front_end/testcases/nnbd/issue41520.dart:12:11: Error: The method 'notAMethodOnObject' isn't defined for the class 'Object'.
 - 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'notAMethodOnObject'.
    error.notAMethodOnObject();
          ^^^^^^^^^^^^^^^^^^" in error{<unresolved>}.notAMethodOnObject();
    invalid-expression "pkg/front_end/testcases/nnbd/issue41520.dart:13:16: Error: The method 'notAMethodOnStackTrace' isn't defined for the class 'StackTrace'.
 - 'StackTrace' is from 'dart:core'.
Try correcting the name to the name of an existing method, or defining a method named 'notAMethodOnStackTrace'.
    stackTrace.notAMethodOnStackTrace();
               ^^^^^^^^^^^^^^^^^^^^^^" in stackTrace{<unresolved>}.notAMethodOnStackTrace();
    self::_takesObject(error);
    self::_takesStackTrace(stackTrace);
  }
}
static method _takesObject(core::Object o) → void {}
static method _takesStackTrace(core::StackTrace o) → void {}
static method main() → void {}
