// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart = 2.9

// Regression test for a crash in dart2js.

part of crash_6725;

class Fisk {
  it1(x) {
    // "key" is unresolved and caused a crash in dart2js.
    // This is the original example the user reported.
    for (key in x) {
      print(key);
    }
  }

  it2(x) {
    // "length" is "intercepted" and handled differently from other
    // names when an instance of list is observed.
    for (length in x) {
      print(length);
    }
  }

  it3(x) {
    // We're pretty sure that there's no "fisk" that is "intercepted".
    for (fisk in x) {
      print(fisk);
    }
  }
}

class SubFisk extends Fisk {
  var key;
  var length;
  var fisk;
}

test() {
  Fisk f = new SubFisk();
  var m = (x) {
    for (undeclared in x) {
      print(undeclared);
    }
  };
  if (new DateTime.now().millisecondsSinceEpoch == 42) {
    f = null;
    m = (x) {};
  }

  f.it1([87, 42]);
  if (f.key != 42) {
    throw 'f.key != 42 (${f.key})';
  }

  f.it2([87, 42]);
  if (f.length != 42) {
    throw 'f.length != 42 (${f.length})';
  }

  f.it3([87, 42]);
  if (f.fisk != 42) {
    throw 'f.fisk != 42 (${f.fisk})';
  }

  try {
    m([87, 42]);
    throw 'NoSuchMethodError expected';
  } on NoSuchMethodError {
    // Expected.
  }
}
