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

class A extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  set a(dynamic #synthetic) → dynamic
    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.\n  set a();\n       ^";
  set d(dynamic #synthetic) → dynamic
    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.\n  set d(x, y);\n       ^";
}
abstract class B extends core::Object {
  synthetic constructor •() → void
    : super core::Object::•()
    ;
  set a(dynamic #synthetic) → dynamic
    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.\n  set a();\n       ^";
  set d(dynamic #synthetic) → dynamic
    let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.\n  set d(x, y);\n       ^";
}
static const field dynamic #errors = const <dynamic>["pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.\nTry adding {}.\nset b();\n       ^", "pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.\nTry adding {}.\nset c(x, y);\n           ^"]/* from null */;
static set b(dynamic #synthetic) → dynamic
  let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.\nset b();\n     ^";
static set c(dynamic #synthetic) → dynamic
  let dynamic _ = null in invalid-expression "pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.\nset c(x, y);\n     ^";
static method main() → dynamic {
  core::bool threw;
  try {
    threw = true;
    new self::A::•().a = null;
    threw = false;
  }
  on dynamic catch(final dynamic e) {
  }
  if(!threw) {
    throw "Expected an error above.";
  }
  try {
    threw = true;
    new self::A::•().d = null;
    threw = false;
  }
  on dynamic catch(final dynamic e) {
  }
  if(!threw) {
    throw "Expected an error above.";
  }
  try {
    threw = true;
    self::b = null;
    threw = false;
  }
  on dynamic catch(final dynamic e) {
  }
  if(!threw) {
    throw "Expected an error above.";
  }
  if(!threw) {
    throw "Expected an error above.";
  }
  try {
    threw = true;
    self::c = null;
    threw = false;
  }
  on dynamic catch(final dynamic e) {
  }
  if(!threw) {
    throw "Expected an error above.";
  }
  try {
    threw = true;
    throw new core::AbstractClassInstantiationError::•("B");
    threw = false;
  }
  on core::AbstractClassInstantiationError catch(final core::AbstractClassInstantiationError _) {
  }
  if(!threw) {
    throw "Expected an error above.";
  }
}
