library test /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
//       int x = /*error:INVALID_ASSIGNMENT*/ i;
//                                            ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
//       int x = /*error:INVALID_ASSIGNMENT*/ i;
//                                            ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
//     String y = /*error:INVALID_ASSIGNMENT*/ x;
//                                             ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
// Try changing the type of the variable.
//   await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {
//                     ^
//
// pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:76: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Stream<dynamic>'.
//  - 'Map' is from 'dart:core'.
//  - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
//  - 'Stream' is from 'dart:async'.
//   await for (var /*@ type=dynamic */ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
//                                                                            ^
//
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

import "dart:async";

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>> extends core::Object {
  synthetic constructor •() → self::Bar<self::Bar::T>
    : super core::Object::•()
    ;
  method foo(covariant-by-class self::Bar::T t) → dynamic async /* futureValueType= dynamic */ {
    await for (core::String i in t) {
      core::int x = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:17:44: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
      int x = /*error:INVALID_ASSIGNMENT*/ i;
                                           ^" in i as{TypeError,ForNonNullableByDefault} core::int;
    }
  }
}
class Baz<T extends core::Object? = dynamic, E extends asy::Stream<self::Baz::T%> = asy::Stream<dynamic>, S extends self::Baz::E = asy::Stream<dynamic>> extends core::Object {
  synthetic constructor •() → self::Baz<self::Baz::T%, self::Baz::E, self::Baz::S>
    : super core::Object::•()
    ;
  method foo(covariant-by-class self::Baz::S t) → dynamic async /* futureValueType= dynamic */ {
    await for (self::Baz::T% i in t) {
      core::int x = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:25:44: Error: A value of type 'T' can't be assigned to a variable of type 'int'.
      int x = /*error:INVALID_ASSIGNMENT*/ i;
                                           ^" in i as{TypeError,ForNonNullableByDefault} core::int;
      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 throw "";
}
static method test() → dynamic async /* futureValueType= dynamic */ {
  self::MyStream<self::Foo> myStream = self::MyStream::•<self::Foo>();
  await for (self::Foo x in myStream) {
    core::String y = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:38:45: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
 - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
    String y = /*error:INVALID_ASSIGNMENT*/ x;
                                            ^" in x as{TypeError,ForNonNullableByDefault} core::String;
  }
  await for (dynamic x in myStream) {
    core::String y = x as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
  }
  await for (final self::Foo #t1 in myStream) {
    core::String x = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:45:21: Error: A value of type 'Foo' can't be assigned to a variable of type 'String'.
 - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
Try changing the type of the variable.
  await for (String x in /*error:FOR_IN_OF_INVALID_ELEMENT_TYPE*/ myStream) {
                    ^" in #t1 as{TypeError,ForNonNullableByDefault} core::String;
    core::String y = x;
  }
  dynamic z;
  await for (final self::Foo #t2 in myStream) {
    z = #t2;
    core::String y = z as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
  }
  asy::Stream<dynamic> stream = myStream;
  await for (final dynamic #t3 in stream) {
    self::Foo x = #t3 as{TypeError,ForDynamic,ForNonNullableByDefault} self::Foo;
    self::Foo y = x;
  }
  dynamic stream2 = myStream;
  await for (final dynamic #t4 in stream2 as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Stream<dynamic>) {
    self::Foo x = #t4 as{TypeError,ForDynamic,ForNonNullableByDefault} self::Foo;
    self::Foo y = x;
  }
  core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
  await for (dynamic x in invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:76: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Stream<dynamic>'.
 - 'Map' is from 'dart:core'.
 - 'Foo' is from 'pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart'.
 - 'Stream' is from 'dart:async'.
  await for (var /*@ type=dynamic */ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
                                                                           ^" in map as{TypeError,ForNonNullableByDefault} asy::Stream<dynamic>) {
    core::String y = x as{TypeError,ForDynamic,ForNonNullableByDefault} core::String;
  }
}
static method main() → dynamic {}
