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

class C extends core::Object {
  field dynamic superField = null;
  synthetic constructor •() → void
    : 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 •() → void
    : 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;
    let final dynamic #t1 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/warn_unresolved_sends.dart:49:39: Error: The getter 'missingField' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named 'missingField'.\n    this. /*@warning=GetterNotFound*/ missingField;\n                                      ^";
    let final dynamic #t2 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/warn_unresolved_sends.dart:50:39: Error: The setter 'missingField' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing setter, or defining a setter or field named 'missingField'.\n    this. /*@warning=SetterNotFound*/ missingField = 0;\n                                      ^";
    let final dynamic #t3 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/warn_unresolved_sends.dart:51:39: Error: The method 'missingMethod' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing method, or defining a method named 'missingMethod'.\n    this. /*@warning=MethodNotFound*/ missingMethod();\n                                      ^";
    let final dynamic #t4 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/warn_unresolved_sends.dart:53:33: Error: The getter 'missingField' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing getter, or defining a getter or field named 'missingField'.\n    /*@warning=GetterNotFound*/ missingField;\n                                ^";
    let final dynamic #t5 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/warn_unresolved_sends.dart:54:33: Error: The setter 'missingField' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing setter, or defining a setter or field named 'missingField'.\n    /*@warning=SetterNotFound*/ missingField = 0;\n                                ^";
    let final dynamic #t6 = this in let dynamic _ = null in invalid-expression "pkg/front_end/testcases/warn_unresolved_sends.dart:55:33: Error: The method 'missingMethod' isn't defined for the class '#lib1::D'.\nTry correcting the name to the name of an existing method, or defining a method named 'missingMethod'.\n    /*@warning=MethodNotFound*/ missingMethod();\n                                ^";
  }
}
class E extends self::D {
  field dynamic missingField = null;
  synthetic constructor •() → void
    : super self::D::•()
    ;
  method missingMethod() → void {}
}
static method main() → dynamic {
  new self::E::•().{self::D::test}();
}
