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

class Foo extends core::Object {
  field core::int bar = 42;
  synthetic constructor •() → self::Foo
    : super core::Object::•()
    ;
}
class Bar<T extends asy::Stream<core::String> = dynamic> extends core::Object {
  synthetic constructor •() → self::Bar<self::Bar::T>
    : super core::Object::•()
    ;
  method foo(self::Bar::T t) → dynamic async {
    await for (dynamic i in t) {
      core::int x = i;
    }
  }
}
class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
  synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
    : super core::Object::•()
    ;
  method foo(self::Baz::S t) → dynamic async {
    await for (dynamic i in t) {
      core::int x = i;
      self::Baz::T y = i;
    }
  }
}
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 test() → dynamic async {
  dynamic myStream = self::MyStream::•<self::Foo>();
  await for (dynamic x in myStream) {
    core::String y = x;
  }
  await for (dynamic x in myStream) {
    core::String y = x;
  }
  await for (core::String x in myStream) {
    core::String y = x;
  }
  dynamic z;
  await for (final dynamic #t1 in myStream) {
    z = #t1;
    core::String y = z;
  }
  asy::Stream<dynamic> stream = myStream;
  await for (self::Foo x in stream) {
    dynamic y = x;
  }
  dynamic stream2 = myStream;
  await for (self::Foo x in stream2) {
    dynamic y = x;
  }
  dynamic map = <core::String, self::Foo>{};
  await for (dynamic x in map) {
    core::String y = x;
  }
}
static method main() → dynamic {}
