// 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

class C {
  C();
  factory C.fact() => null;
  factory C.fact2() = D;
  C.nonFact();
  C.nonFact2() : this.nonFact();
  static void staticFunction(int i) {}
}

class D extends C {}

void topLevelFunction(int i) {}

test() {
  void localFunction(int i) {}
  List<int> a = <Object>[];
  //            ^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_CAST_LITERAL_LIST
  //                    ^
  // [cfe] The list literal type 'List<Object>' isn't of expected type 'List<int>'.
  Map<int, String> b = <Object, String>{};
  //                   ^^^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_CAST_LITERAL_MAP
  //                                   ^
  // [cfe] The map literal type 'Map<Object, String>' isn't of expected type 'Map<int, String>'.
  Map<int, String> c = <int, Object>{};
  //                   ^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_CAST_LITERAL_MAP
  //                                ^
  // [cfe] The map literal type 'Map<int, Object>' isn't of expected type 'Map<int, String>'.
  int Function(Object) d = (int i) => i;
  //                       ^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_CAST_FUNCTION_EXPR
  // [cfe] The function expression type 'int Function(int)' isn't of expected type 'int Function(Object)'.
  D e = new C.fact();
  D f = new C.fact2();
  D g = new C.nonFact();
  //    ^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_CAST_NEW_EXPR
  //        ^
  // [cfe] The constructor returns type 'C' that isn't of expected type 'D'.
  D h = new C.nonFact2();
  //    ^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_CAST_NEW_EXPR
  //        ^
  // [cfe] The constructor returns type 'C' that isn't of expected type 'D'.
  void Function(Object) i = C.staticFunction;
  //                        ^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_CAST_METHOD
  //                          ^
  // [cfe] The static method has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
  void Function(Object) j = topLevelFunction;
  //                        ^^^^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_CAST_FUNCTION
  // [cfe] The top level function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
  void Function(Object) k = localFunction;
  //                        ^^^^^^^^^^^^^
  // [analyzer] COMPILE_TIME_ERROR.INVALID_CAST_FUNCTION
  // [cfe] The local function has type 'void Function(int)' that isn't of expected type 'void Function(Object)'.
}

main() {}
