library #lib /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:ffi" as ffi;
import "dart:_internal" as _in;

import "dart:ffi";

class MyFinalizable extends core::Object implements ffi::Finalizable {
  synthetic constructor •() → self::MyFinalizable
    : super core::Object::•()
    ;
}
static method doSomething() → core::int
  return 3;
static method useFinalizableSyncStar(ffi::Finalizable finalizable) → core::Iterable<core::int> sync* {
  yield block {
    final core::int :expressionValueWrappedFinalizable = self::doSomething();
    _in::reachabilityFence(finalizable);
  } =>:expressionValueWrappedFinalizable;
  final self::MyFinalizable finalizable2 = new self::MyFinalizable::•();
  yield block {
    final core::int :expressionValueWrappedFinalizable = 5;
    _in::reachabilityFence(finalizable);
    _in::reachabilityFence(finalizable2);
  } =>:expressionValueWrappedFinalizable;
  final self::MyFinalizable finalizable3 = new self::MyFinalizable::•();
  yield block {
    final core::int :expressionValueWrappedFinalizable = 10;
    _in::reachabilityFence(finalizable);
    _in::reachabilityFence(finalizable2);
    _in::reachabilityFence(finalizable3);
  } =>:expressionValueWrappedFinalizable;
  _in::reachabilityFence(finalizable2);
  _in::reachabilityFence(finalizable3);
  _in::reachabilityFence(finalizable);
}
static method main() → void {
  final self::MyFinalizable finalizable = new self::MyFinalizable::•();
  {
    core::Iterator<core::int> :sync-for-iterator = self::useFinalizableSyncStar(finalizable).{core::Iterable::iterator}{core::Iterator<core::int>};
    for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
      final core::int element = :sync-for-iterator.{core::Iterator::current}{core::int};
      {
        core::print(element);
      }
    }
  }
  _in::reachabilityFence(finalizable);
}
