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

// Dart test for a closure result type test that cannot be eliminated at compile
// time.

import "package:expect/expect.dart";

void test(A func(String value), String value) {
  Expect.throwsTypeError(() {
    B x = func(value);
  });
}


class A {
}

class B extends A {
}

class C {
  static A a(String x) => new A();
}

A aclosure(String x) => C.a(x);
A bclosure() => new A();

main() {
  test(aclosure, "foo");
  test((bar) => bclosure(), "baz");
}
