library;
//
// Problems in library:
//
// pkg/front_end/testcases/for_in_without_declaration.dart:32:10: Error: Expected an identifier, but got 'super'.
//     for (super.superInstanceField in []) {}
//          ^^^^^
//
// pkg/front_end/testcases/for_in_without_declaration.dart:33:10: Error: Expected an identifier, but got 'super'.
//     for (super.untypedSuperInstanceField in []) {}
//          ^^^^^
//
// pkg/front_end/testcases/for_in_without_declaration.dart:35:11: Error: Unexpected token '.'.
//     for (c.instanceField in []) {}
//           ^
//
// pkg/front_end/testcases/for_in_without_declaration.dart:36:11: Error: Unexpected token '.'.
//     for (c.untypedSuperInstanceField in []) {}
//           ^
//
// pkg/front_end/testcases/for_in_without_declaration.dart:37:10: Warning: Setter not found: 'unresolved'.
//     for (unresolved in []) {}
//          ^^^^^^^^^^
//
// pkg/front_end/testcases/for_in_without_declaration.dart:38:10: Warning: Getter not found: 'unresolved'.
//     for (unresolved.foo in []) {}
//          ^^^^^^^^^^
//
// pkg/front_end/testcases/for_in_without_declaration.dart:38:20: Error: Unexpected token '.'.
//     for (unresolved.foo in []) {}
//                    ^
//
// pkg/front_end/testcases/for_in_without_declaration.dart:39:11: Error: Unexpected token '.'.
//     for (c.unresolved in []) {}
//           ^
//
// pkg/front_end/testcases/for_in_without_declaration.dart:40:14: Error: Unexpected token '('.
//     for (main() in []) {}
//              ^
//
// pkg/front_end/testcases/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
//     for (main() in []) {}
//          ^^^^
//
// pkg/front_end/testcases/for_in_without_declaration.dart:41:15: Error: Unexpected token ','.
//     for (var x, y in <int>[]) {
//               ^
//
// pkg/front_end/testcases/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
//     for (var x, y in <int>[]) {
//          ^^^
//
// pkg/front_end/testcases/for_in_without_declaration.dart:46:10: Warning: Setter not found: 'constant'.
//     for (constant in []) {}
//          ^^^^^^^^
//
import self as self;
import "dart:core" as core;

class Super extends core::Object {
  field core::int superInstanceField = null;
  field dynamic untypedSuperInstanceField = null;
  synthetic constructor •() → self::Super
    : super core::Object::•()
    ;
}
class C extends self::Super {
  field core::int instanceField = null;
  field dynamic untypedInstanceField = null;
  static field core::double staticField = null;
  static field dynamic untypedStaticField = null;
  synthetic constructor •() → self::C
    : super self::Super::•()
    ;
  method m() → dynamic {
    core::String local;
    dynamic untypedLocal;
    for (final dynamic #t1 in <dynamic>[]) {
      local = #t1;
    }
    for (final dynamic #t2 in <dynamic>[]) {
      untypedLocal = #t2;
    }
    for (final dynamic #t3 in <dynamic>[]) {
      this.{self::C::instanceField} = #t3;
    }
    for (final dynamic #t4 in <dynamic>[]) {
      this.{self::C::untypedInstanceField} = #t4;
    }
    for (final dynamic #t5 in <dynamic>[]) {
      self::C::staticField = #t5;
    }
    for (final dynamic #t6 in <dynamic>[]) {
      self::C::untypedStaticField = #t6;
    }
    for (final dynamic #t7 in <dynamic>[]) {
      self::topLevelField = #t7;
    }
    for (final dynamic #t8 in <dynamic>[]) {
      self::untypedTopLevelField = #t8;
    }
    for (final dynamic #t9 in <dynamic>[]) {
      super.{self::Super::superInstanceField} = #t9;
    }
    for (final dynamic #t10 in <dynamic>[]) {
      super.{self::Super::untypedSuperInstanceField} = #t10;
    }
    self::C c = new self::C::•();
    for (final dynamic #t11 in <dynamic>[]) {
      c.instanceField = #t11;
    }
    for (final dynamic #t12 in <dynamic>[]) {
      c.untypedSuperInstanceField = #t12;
    }
    for (final dynamic #t13 in <dynamic>[]) {
      this.unresolved = #t13;
    }
    for (final dynamic #t14 in <dynamic>[]) {
      this.unresolved.foo = #t14;
    }
    for (final dynamic #t15 in <dynamic>[]) {
      c.unresolved = #t15;
    }
    {
      invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
    for (main() in []) {}
         ^^^^";
      for (final dynamic #t16 in <dynamic>[]) {
        invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
    for (main() in []) {}
         ^^^^";
        self::main();
      }
    }
    {
      invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
    for (var x, y in <int>[]) {
         ^^^";
      for (final dynamic #t17 in <core::int>[]) {
        invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
    for (var x, y in <int>[]) {
         ^^^";
        dynamic x;
        dynamic y;
        core::print(x);
        core::print(y);
      }
    }
    const core::int constant = 0;
    for (final dynamic #t18 in <dynamic>[]) {
      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#constant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t18]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
    }
  }
}
static field core::bool topLevelField;
static field dynamic untypedTopLevelField;
static method main() → dynamic {}
