library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/warn_unresolved_sends.dart:48:10: Error: The getter 'missingField' isn't defined for the class 'D'.
//  - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'missingField'.
//     this.missingField;
//          ^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/warn_unresolved_sends.dart:49:10: Error: The setter 'missingField' isn't defined for the class 'D'.
//  - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'missingField'.
//     this.missingField = 0;
//          ^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/warn_unresolved_sends.dart:50:10: Error: The method 'missingMethod' isn't defined for the class 'D'.
//  - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
// Try correcting the name to the name of an existing method, or defining a method named 'missingMethod'.
//     this.missingMethod();
//          ^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/warn_unresolved_sends.dart:52:5: Error: The getter 'missingField' isn't defined for the class 'D'.
//  - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'missingField'.
//     missingField;
//     ^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/warn_unresolved_sends.dart:53:5: Error: The setter 'missingField' isn't defined for the class 'D'.
//  - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'missingField'.
//     missingField = 0;
//     ^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/warn_unresolved_sends.dart:54:5: Error: The method 'missingMethod' isn't defined for the class 'D'.
//  - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
// Try correcting the name to the name of an existing method, or defining a method named 'missingMethod'.
//     missingMethod();
//     ^^^^^^^^^^^^^
//
import self as self;
import "dart:core" as core;

class C extends core::Object {
  field dynamic superField = null;
  synthetic constructor •() → self::C*
    : super core::Object::•()
    ;
  method superMethod() → dynamic {}
  get setterOnly() → dynamic
    return null;
  set setterOnly(dynamic _) → void {}
  get getterOnly() → dynamic
    return null;
  set getterOnly(dynamic _) → void {}
}
class D extends self::C {
  field dynamic field = null;
  synthetic constructor •() → self::D*
    : super self::C::•()
    ;
  set setterOnly(dynamic _) → void {}
  get getterOnly() → dynamic
    return null;
  method method() → dynamic {}
  method test() → void {
    this.{self::D::field};
    this.{self::C::superField};
    this.{self::D::field} = 0;
    this.{self::C::superField} = 0;
    this.{self::D::method}();
    this.{self::C::superMethod}();
    this.{self::C::setterOnly};
    this.{self::D::setterOnly} = 0;
    this.{self::D::getterOnly};
    this.{self::C::getterOnly} = 0;
    this.{self::D::field};
    this.{self::C::superField};
    this.{self::D::field} = 0;
    this.{self::C::superField} = 0;
    this.{self::D::method}();
    this.{self::C::superMethod}();
    this.{self::C::setterOnly};
    this.{self::D::setterOnly} = 0;
    this.{self::D::getterOnly};
    this.{self::C::getterOnly} = 0;
    invalid-expression "pkg/front_end/testcases/general/warn_unresolved_sends.dart:48:10: Error: The getter 'missingField' isn't defined for the class 'D'.
 - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'missingField'.
    this.missingField;
         ^^^^^^^^^^^^";
    invalid-expression "pkg/front_end/testcases/general/warn_unresolved_sends.dart:49:10: Error: The setter 'missingField' isn't defined for the class 'D'.
 - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'missingField'.
    this.missingField = 0;
         ^^^^^^^^^^^^";
    invalid-expression "pkg/front_end/testcases/general/warn_unresolved_sends.dart:50:10: Error: The method 'missingMethod' isn't defined for the class 'D'.
 - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
Try correcting the name to the name of an existing method, or defining a method named 'missingMethod'.
    this.missingMethod();
         ^^^^^^^^^^^^^";
    invalid-expression "pkg/front_end/testcases/general/warn_unresolved_sends.dart:52:5: Error: The getter 'missingField' isn't defined for the class 'D'.
 - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'missingField'.
    missingField;
    ^^^^^^^^^^^^";
    invalid-expression "pkg/front_end/testcases/general/warn_unresolved_sends.dart:53:5: Error: The setter 'missingField' isn't defined for the class 'D'.
 - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'missingField'.
    missingField = 0;
    ^^^^^^^^^^^^";
    invalid-expression "pkg/front_end/testcases/general/warn_unresolved_sends.dart:54:5: Error: The method 'missingMethod' isn't defined for the class 'D'.
 - 'D' is from 'pkg/front_end/testcases/general/warn_unresolved_sends.dart'.
Try correcting the name to the name of an existing method, or defining a method named 'missingMethod'.
    missingMethod();
    ^^^^^^^^^^^^^";
  }
}
class E extends self::D {
  field dynamic missingField = null;
  synthetic constructor •() → self::E*
    : super self::D::•()
    ;
  method missingMethod() → void {}
}
static method main() → dynamic {}
