library test /*isNonNullableByDefault*/;
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 /* futureValueType= 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 /* futureValueType= 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>()) {
  }
}
