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

import "package:expect/expect.dart";

void block_test() {
  List<Object> Function() g;
  g = () {
    return [3];
  };
  assert(g is List<Object> Function());
  assert(g is! List<int> Function());
  g().add("hello"); // No runtime error
  List<int> l = [3];
  g = () {
    return l;
  };
  assert(g is List<Object> Function());
  assert(g is List<int> Function());
  Expect.throwsTypeError(() {
    g().add("hello"); // runtime error
  });
  Object o = l;
  g = () {
    return o;
  }; // No implicit downcast on the assignment, implicit downcast on the return
  assert(g is List<Object> Function());
  assert(g is! List<int> Function());
  assert(g is Object Function());
  g(); // No runtime error;
  o = 3;
  Expect.throwsTypeError(() {
    g(); // Failed runtime cast on the return type of f
  });
}

void arrow_test() {
  List<Object> Function() g;
  g = () => [3];
  assert(g is List<Object> Function());
  assert(g is! List<int> Function());
  g().add("hello"); // No runtime error
  List<int> l = [3];
  g = () => l;
  assert(g is List<Object> Function());
  assert(g is List<int> Function());
  Expect.throwsTypeError(() {
    g().add("hello"); // runtime error
  });
  Object o = l;
  g = () =>
      o; // No implicit downcast on the assignment, implicit downcast on the return
  assert(g is List<Object> Function());
  assert(g is! List<int> Function());
  assert(g is Object Function());
  g(); // No runtime error;
  o = 3;
  Expect.throwsTypeError(() {
    g(); // Failed runtime cast on the return type of f
  });
}

main() {
  block_test();
  arrow_test();
}
