blob: f2c8a911f10248b1afd647759f3164d335f84374 [file] [log] [blame]
// Copyright (c) 2016, 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.
/// @assertion Execution of a statement s of the form yield* e; proceeds as
/// follows:
/// First, the expression e is evaluated to an object o.
/// If the immediately enclosing function m is marked sync*, then:
/// 1. It is a dynamic error if the class of o does not implement Iterable.
/// Otherwise
/// 2. The method iterator is invoked upon o returning an object i.
/// 3. The moveNext method of i is invoked on it with no arguments. If moveNext
/// returns false execution of s is complete. Otherwise
/// 4. The getter current is invoked on i. If the invocation raises an
/// exception ex, execution of s throws ex. Otherwise, the result x of the
/// getter invocation is added to the iterable associated with m. Execution of
/// the function m immediately enclosing s is suspended until the nullary method
/// moveNext() is invoked upon the iterator used to initiate the current
/// invocation of m, at which point execution of s continues at 3.
/// 5. The current call to moveNext() returns true.
///
/// @description Check that dynamic error occurs if the class of o does not
/// implement Iterable.
/// @author a.semenov@unipro.ru
import '../../../../Utils/dynamic_check.dart';
Iterable<int> generator() sync* {
dynamic a = 1;
yield* a;
}
main() {
checkDynamicError(() => generator().first);
}