| // Copyright (c) 2020, 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. |
| |
| // See: https://github.com/dart-lang/sdk/issues/42466 |
| |
| import 'dart:collection'; |
| import 'package:expect/expect.dart'; |
| |
| String? caughtString; |
| |
| a() sync* { |
| yield 3; |
| throw 'Throw from a()'; |
| yield 4; |
| } |
| |
| b() sync* { |
| yield 2; |
| yield* a(); |
| yield 5; |
| } |
| |
| c() sync* { |
| try { |
| yield 1; |
| yield* b(); |
| yield 6; |
| } catch (e, st) { |
| caughtString = 'Caught in c()'; |
| } |
| } |
| |
| d() sync* { |
| try { |
| yield 0; |
| yield* c(); |
| yield 7; |
| } catch (e, st) { |
| caughtString = 'Caught in d()'; |
| } |
| } |
| |
| main() { |
| List yields = []; |
| try { |
| for (final e in d()) { |
| yields.add(e); |
| } |
| } catch (e, st) { |
| caughtString = 'Caught in main()'; |
| } |
| Expect.equals('Caught in c()', caughtString); |
| Expect.listEquals([0, 1, 2, 3, 7], yields); |
| } |