// Copyright (c) 2018, 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.

class T1 {}

class T2 {}

abstract class A {
  foo();
}

class B extends A {
  foo() => new T1();
}

class C implements B {
  foo() => new T2();
}

class Intermediate {
  bar(A aa) => aa.foo();
}

use1(Intermediate i, A aa) => i.bar(aa);
use2(Intermediate i, A aa) => i.bar(aa);

late Function unknown;

getDynamic() => unknown.call();

allocateB() {
  new B();
}

main(List<String> args) {
  use1(new Intermediate(), getDynamic()); // No subclasses of A allocated.

  allocateB();

  use2(new Intermediate(), getDynamic()); // Now B is allocated.
}
