library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/accessors.dart:16:13: Warning: Getter not found: 'onlySetter'.
//       print(onlySetter);
//             ^^^^^^^^^^
//
// pkg/front_end/testcases/general/accessors.dart:25:11: Warning: Getter not found: 'onlySetter'.
//     print(onlySetter);
//           ^^^^^^^^^^
//
// pkg/front_end/testcases/general/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(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
    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();
}

constants  {
  #C1 = #onlySetter
  #C2 = <core::Type*>[]
  #C3 = <dynamic>[]
  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
}
