library;
//
// Problems in library:
//
// pkg/front_end/testcases/accessors.dart:16:13: Warning: Getter not found: 'onlySetter'.
//       print(onlySetter);
//             ^^^^^^^^^^
//
// pkg/front_end/testcases/accessors.dart:25:11: Warning: Getter not found: 'onlySetter'.
//     print(onlySetter);
//           ^^^^^^^^^^
//
// pkg/front_end/testcases/accessors.dart:40:11: Warning: Getter not found: 'onlySetter'.
//     print(onlySetter);
//           ^^^^^^^^^^
//
import self as self;
import "dart:core" as core;

class C extends core::Object {
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  set onlySetter(dynamic value) → void {
    core::print("C.onlySetter called with ${value}.");
  }
  method testC() → dynamic {
    try {
      core::print(this.onlySetter);
      throw "No error thrown";
    }
    on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
      core::print("Expected error: ${e}");
    }
    this.{self::C::onlySetter} = "hest";
  }
  method testD() → dynamic {
    core::print(this.onlySetter);
    this.{self::C::onlySetter} = "hest";
  }
}
class D extends self::C {
  synthetic constructor •() → self::D
    : super self::C::•()
    ;
  get onlySetter() → core::String
    return "D.onlySetter called.";
  set onlySetter(dynamic value) → void {
    core::print("D.onlySetter called with ${value}.");
  }
}
static set onlySetter(dynamic value) → void {
  core::print("onlySetter called with ${value}.");
}
static method main() → dynamic {
  try {
    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#onlySetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
    throw "No error thrown";
  }
  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
    core::print("Expected error: ${e}");
  }
  self::onlySetter = "fisk";
  new self::C::•().testC();
  new self::D::•().testD();
}
