// Copyright (c) 2024, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'package:expect/async_helper.dart';

class Foo {
  bool disposed = false;

  void dispose() {
    if (disposed) throw 'Used disposed foo';
    disposed = true;
  }
}

Future<void> main() async {
  asyncStart();
  List<Function> callbacks = [];
  for (final x in [1, 2]) {
    final Foo foo = Foo();
    callbacks.add(() {
      // This closure should capture the foo from this loop iteration and only
      // dispose each one once.
      foo.dispose();
    });
  }
  for (final callback in callbacks) {
    callback();
  }
  asyncEnd();
}
