// 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
/*@testedFeatures=inference*/
library test;

void test() {
  {
    String f<S>(int x) => null;
    var /*@ type=<S extends Object* = dynamic>(int*) ->* String* */ v = f;
    v = <T> /*@ returnType=Null */ (int x) => null;
    v = <T> /*@ returnType=String* */ (int x) => "hello";
    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
        "hello";
    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (int x) => 3;
    v = <T> /*@ returnType=String* */ (int x) {
      return /*error:RETURN_OF_INVALID_TYPE*/ 3;
    };
  }
  {
    String f<S>(int x) => null;
    var /*@ type=<S extends Object* = dynamic>(int*) ->* String* */ v = f;
    v = <T> /*@ returnType=Null */ (/*@ type=int* */ x) => null;
    v = <T> /*@ returnType=String* */ (/*@ type=int* */ x) => "hello";
    v = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ <
            T> /*@ returnType=String* */ (/*@ type=int* */ x) =>
        3;
    v = <T> /*@ returnType=String* */ (/*@ type=int* */ x) {
      return /*error:RETURN_OF_INVALID_TYPE*/ 3;
    };
    v = <T> /*@ returnType=String* */ (/*@ type=int* */ x) {
      return /*error:RETURN_OF_INVALID_TYPE*/ x;
    };
  }
  {
    List<String> f<S>(int x) => null;
    var /*@ type=<S extends Object* = dynamic>(int*) ->* List<String*>* */ v = f;
    v = <T> /*@ returnType=Null */ (int x) => null;
    v = <T> /*@ returnType=List<String*>* */ (int x) => /*@ typeArgs=String* */ [
          "hello"
        ];
    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=List<String*>* */ (String
        x) => /*@ typeArgs=String* */ ["hello"];
    v = <T> /*@ returnType=List<String*>* */ (int x) => /*@ typeArgs=String* */ [
          /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
        ];
    v = <T> /*@ returnType=List<String*>* */ (int x) {
      return /*@ typeArgs=String* */ [
        /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
      ];
    };
  }
  {
    int int2int<S>(int x) => null;
    String int2String<T>(int x) => null;
    String string2String<T>(String x) => null;
    var /*@ type=<S extends Object* = dynamic>(int*) ->* int* */ x = int2int;
    x = <T> /*@ returnType=int* */ (/*@ type=int* */ x) => x;
    x = <T> /*@ returnType=int* */ (/*@ type=int* */ x) => x /*@target=num.+*/ + 1;
    var /*@ type=<T extends Object* = dynamic>(int*) ->* String* */ y = int2String;
    y = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ <
            T> /*@ returnType=String* */ (/*@ type=int* */ x) =>
        x;
    y = <T> /*@ returnType=String* */ (/*@ type=int* */ x) => /*info:DYNAMIC_INVOKE, info:DYNAMIC_CAST*/ x
        .substring(3);
    var /*@ type=<T extends Object* = dynamic>(String*) ->* String* */ z =
        string2String;
    z = <T> /*@ returnType=String* */ (/*@ type=String* */ x) =>
        x. /*@target=String.substring*/ substring(3);
  }
}

main() {}
