library test;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

abstract class MyStream<T extends core::Object = dynamic> extends asy::Stream<self::MyStream::T> {
  static factory •<T extends core::Object = dynamic>() → self::MyStream<self::MyStream::•::T>
    return null;
}
static method F<T extends core::Object = dynamic>() → self::F::T
  return null;
static method f() → asy::Future<dynamic> async {
  dynamic d;
  core::Object o;
  for (dynamic x in self::F<core::Iterable<dynamic>>()) {
  }
  for (dynamic x in self::F<core::Iterable<dynamic>>()) {
  }
  for (core::Object x in self::F<core::Iterable<core::Object>>()) {
  }
  for (final dynamic #t1 in self::F<core::Iterable<dynamic>>()) {
    d = #t1;
  }
  for (final core::Object #t2 in self::F<core::Iterable<core::Object>>()) {
    o = #t2;
  }
  await for (dynamic x in self::F<asy::Stream<dynamic>>()) {
  }
  await for (dynamic x in self::F<asy::Stream<dynamic>>()) {
  }
  await for (core::Object x in self::F<asy::Stream<core::Object>>()) {
  }
  await for (final dynamic #t3 in self::F<asy::Stream<dynamic>>()) {
    d = #t3;
  }
  await for (final core::Object #t4 in self::F<asy::Stream<core::Object>>()) {
    o = #t4;
  }
}
static method main() → asy::Future<dynamic> async {
  for (core::int x in <core::int>[1, 2, 3]) {
  }
  for (core::num x in <core::num>[1, 2, 3]) {
  }
  for (core::int x in <core::int>[1, 2, 3]) {
  }
  await for (core::int x in self::MyStream::•<core::int>()) {
  }
  await for (core::int x in self::MyStream::•<core::int>()) {
  }
}
