// Copyright (c) 2015, 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.
// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation

// @dart = 2.9

import "package:expect/expect.dart";

// Test dense class-id checks. Regression test for issue 22104.

class A {
  toString() => "an A";
}

class A1 extends A {}

class A2 extends A {}

class A3 extends A {}

class A4 extends A {
  toString() => "ha";
}

class A5 extends A {}

class A6 extends A {}

class A7 extends A {}

class A8 extends A {}

class A9 extends A {}

class A10 extends A {}

class A11 extends A {}

class A12 extends A {}

class A13 extends A {}

class A14 extends A {}

class A15 extends A {}

class A16 extends A {}

class A17 extends A {}

class A18 extends A {}

class A19 extends A {}

class A20 extends A {}

class A21 extends A {}

class A22 extends A {}

class A23 extends A {}

class A24 extends A {}

class A25 extends A {}

class A26 extends A {}

class A27 extends A {}

class A28 extends A {}

class A29 extends A {}

class A30 extends A {}

class A31 extends A {}

class A32 extends A {}

class A33 extends A {}

class A34 extends A {}

class A35 extends A {}

class A36 extends A {}

test_class_check(e) => e.toString();

main() {
  var list = [new A1(), new A2(), new A11(), new A36()];
  for (var i = 0; i < list.length; i++) {
    test_class_check(list[i]);
  }
  for (var i = 0; i < 100; i++) {
    Expect.equals("an A", test_class_check(new A1()));
  }
  Expect.equals("ha", test_class_check(new A4()));
}
