// Formatted problems:
//
// 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>[]) {
//          ^^^

// Unhandled errors:
//
// 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: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:41:15: Error: Unexpected token ','.
//     for (var x, y in <int>[]) {
//               ^

library;
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);
        }
      }
    }
  }
}
static field core::bool topLevelField;
static field dynamic untypedTopLevelField;
static method main() → dynamic {}
