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