library;
//
// Problems in library:
//
// pkg/front_end/testcases/general_nnbd_opt_out/warn_unresolved_sends.dart:50:10: Error: The getter 'missingField' isn't defined for the class 'D'.
//  - 'D' is from 'pkg/front_end/testcases/general_nnbd_opt_out/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_nnbd_opt_out/warn_unresolved_sends.dart:51:10: Error: The setter 'missingField' isn't defined for the class 'D'.
//  - 'D' is from 'pkg/front_end/testcases/general_nnbd_opt_out/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_nnbd_opt_out/warn_unresolved_sends.dart:52:10: Error: The method 'missingMethod' isn't defined for the class 'D'.
//  - 'D' is from 'pkg/front_end/testcases/general_nnbd_opt_out/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_nnbd_opt_out/warn_unresolved_sends.dart:54:5: Error: The getter 'missingField' isn't defined for the class 'D'.
//  - 'D' is from 'pkg/front_end/testcases/general_nnbd_opt_out/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_nnbd_opt_out/warn_unresolved_sends.dart:55:5: Error: The setter 'missingField' isn't defined for the class 'D'.
//  - 'D' is from 'pkg/front_end/testcases/general_nnbd_opt_out/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_nnbd_opt_out/warn_unresolved_sends.dart:56:5: Error: The method 'missingMethod' isn't defined for the class 'D'.
//  - 'D' is from 'pkg/front_end/testcases/general_nnbd_opt_out/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 {}
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
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_nnbd_opt_out/warn_unresolved_sends.dart:50:10: Error: The getter 'missingField' isn't defined for the class 'D'.
 - 'D' is from 'pkg/front_end/testcases/general_nnbd_opt_out/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_nnbd_opt_out/warn_unresolved_sends.dart:51:10: Error: The setter 'missingField' isn't defined for the class 'D'.
 - 'D' is from 'pkg/front_end/testcases/general_nnbd_opt_out/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_nnbd_opt_out/warn_unresolved_sends.dart:52:10: Error: The method 'missingMethod' isn't defined for the class 'D'.
 - 'D' is from 'pkg/front_end/testcases/general_nnbd_opt_out/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_nnbd_opt_out/warn_unresolved_sends.dart:54:5: Error: The getter 'missingField' isn't defined for the class 'D'.
 - 'D' is from 'pkg/front_end/testcases/general_nnbd_opt_out/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_nnbd_opt_out/warn_unresolved_sends.dart:55:5: Error: The setter 'missingField' isn't defined for the class 'D'.
 - 'D' is from 'pkg/front_end/testcases/general_nnbd_opt_out/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_nnbd_opt_out/warn_unresolved_sends.dart:56:5: Error: The method 'missingMethod' isn't defined for the class 'D'.
 - 'D' is from 'pkg/front_end/testcases/general_nnbd_opt_out/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 {}
