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

class A extends core::Object {
  default constructor •() → void
    : super core::Object::•()
    ;
}
class B extends self::A {
  default constructor •() → void
    : super self::A::•()
    ;
}
static method f<T extends core::Object>() → self::f::T
  return null;
static method test() → dynamic async {
  core::Iterable<self::A> iterable;
  asy::Stream<self::A> stream;
  self::A a;
  self::B b;
  core::int i;
  for (final self::A #t1 in iterable) {
    a = #t1;
  }
  await for (final self::A #t2 in stream) {
    a = #t2;
  }
  for (final self::A #t3 in iterable) {
    b = #t3 as{TypeError} self::B;
  }
  await for (final self::A #t4 in stream) {
    b = #t4 as{TypeError} self::B;
  }
  for (final self::A #t5 in iterable) {
    i = let final dynamic #t6 = #t5 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:26:39: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  for (i /*@error=InvalidAssignment*/ in iterable) {}\n                                      ^"));
  }
  await for (final self::A #t7 in stream) {
    i = let final dynamic #t8 = #t7 in let dynamic _ = null in const core::_ConstantExpressionError::•().{core::_ConstantExpressionError::_throw}(new core::_CompileTimeError::•("pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:27:45: Error: A value of type 'test::A' can't be assigned to a variable of type 'dart.core::int'.\nTry changing the type of the left hand side, or casting the right hand side to 'dart.core::int'.\n  await for (i /*@error=InvalidAssignment*/ in stream) {}\n                                            ^"));
  }
  for (final self::A #t9 in self::f<core::Iterable<self::A>>()) {
    a = #t9;
  }
  await for (final self::A #t10 in self::f<asy::Stream<self::A>>()) {
    a = #t10;
  }
}
static method main() → dynamic {}
