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

import "dart:async";

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>()) {
  }
}
