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

/*@testedFeatures=inference*/
library test;

typedef T Function2<S, T>(S x);

void test() {
  {
    Function2<int, String> l0 = /*@ returnType=Null? */ (int x) => null;
    Function2<int, String> l1 = /*@ returnType=String* */ (int x) => "hello";
    Function2<int, String>
        l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
            "hello";
    Function2<int, String>
        l3 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (int x) => 3;
    Function2<int, String> l4 = /*@ returnType=String* */ (int x) {
      return /*error:RETURN_OF_INVALID_TYPE*/ 3;
    };
  }
  {
    Function2<int, String> l0 = /*@ returnType=Null? */ (/*@ type=int* */ x) => null;
    Function2<int, String> l1 = /*@ returnType=String* */ (/*@ type=int* */ x) =>
        "hello";
    Function2<int, String>
        l2 = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (/*@ type=int* */ x) =>
            3;
    Function2<int, String> l3 = /*@ returnType=String* */ (/*@ type=int* */ x) {
      return /*error:RETURN_OF_INVALID_TYPE*/ 3;
    };
    Function2<int, String> l4 = /*@ returnType=String* */ (/*@ type=int* */ x) {
      return /*error:RETURN_OF_INVALID_TYPE*/ x;
    };
  }
  {
    Function2<int, List<String>> l0 = /*@ returnType=Null? */ (int x) => null;
    Function2<int, List<String>> l1 = /*@ returnType=List<String*>* */ (int
        x) => /*@ typeArgs=String* */ ["hello"];
    Function2<int, List<String>>
        l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=List<String*>* */ (String
            x) => /*@ typeArgs=String* */ ["hello"];
    Function2<int, List<String>>
        l3 = /*@ returnType=List<String*>* */ (int x) => /*@ typeArgs=String* */ [
              /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
            ];
    Function2<int, List<String>> l4 = /*@ returnType=List<String*>* */ (int x) {
      return /*@ typeArgs=String* */ [
        /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
      ];
    };
  }
  {
    Function2<int, int> l0 = /*@ returnType=int* */ (/*@ type=int* */ x) => x;
    Function2<int, int> l1 = /*@ returnType=int* */ (/*@ type=int* */ x) =>
        x /*@target=num.+*/ + 1;
    Function2<int, String>
        l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (/*@ type=int* */ x) =>
            x;
    Function2<int, String>
        l3 = /*@ returnType=String* */ (/*@ type=int* */ x) => /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/ x
            .substring(3);
    Function2<String, String>
        l4 = /*@ returnType=String* */ (/*@ type=String* */ x) =>
            x. /*@target=String.substring*/ substring(3);
  }
}

main() {}
