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 throw "";
}
static method F<T extends core::Object? = dynamic>() → self::F::T%
  return throw "";
static method f() → asy::Future<dynamic> async /* emittedValueType= dynamic */ {
  dynamic d;
  core::Object o;
  for (core::Object? x in self::F<core::Iterable<core::Object?>>()) {
  }
  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 (core::Object? x in self::F<asy::Stream<core::Object?>>()) {
  }
  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 /* emittedValueType= dynamic */ {
  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>()) {
  }
}
