// Copyright (c) 2019, 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. // Tests erroneous method signatures and return types for the `in` variance modifier. // SharedOptions=--enable-experiment=variance typedef Inv = void Function(); typedef Cov = T Function(); typedef Contra = void Function(T); class Covariant {} class Contravariant {} class Invariant {} class A { T method1() => throw "uncalled"; //^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position in the return type. void method2(Contra x) {} // ^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. Cov method3() { //^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position in the return type. return () => throw "uncalled"; } void method4(Contra> x) {} // ^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. void method5(Cov> x) {} // ^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. Contra> method6() => (Contra x) {}; //^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position in the return type. Cov> method7() { //^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position in the return type. return () { return () => throw "uncalled"; }; } Inv method8() => throw "uncalled"; //^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'inout' position in the return type. void method9(Inv x) {} // ^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'inout' position. Covariant method10() => throw "uncalled"; //^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position in the return type. void method11(Contravariant x) {} // ^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. Invariant method12() => throw "uncalled"; //^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'inout' position in the return type. void method13(Invariant x) {} // ^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'inout' position. void method14(Contravariant> x) {} // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. void method15(Covariant> x) {} // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. Contravariant> method16() => Contravariant>(); //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position in the return type. Covariant> method17() => Covariant>(); //^^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position in the return type. void method18() {} // ^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // [cfe] Can't use 'in' type variable 'T' in an 'inout' position. void method19>() {} // ^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // [cfe] Can't use 'in' type variable 'T' in an 'inout' position. void method20>() {} // ^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // [cfe] Can't use 'in' type variable 'T' in an 'inout' position. void method21({required Contra x}) {} // ^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. void method22({required Contravariant x}) {} // ^^^^^^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. void method23({required Covariant x, required Contravariant y}) {} // ^^^^^^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. void method24>() {} // ^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // [cfe] Can't use 'in' type variable 'T' in an 'inout' position. void method25>() {} // ^^^^^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // [cfe] Can't use 'in' type variable 'T' in an 'inout' position. } mixin BMixin { T method1() => throw "uncalled"; //^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position in the return type. void method2(Contra x) {} // ^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. Cov method3() { //^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position in the return type. return () => throw "uncalled"; } void method4(Contra> x) {} // ^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. void method5(Cov> x) {} // ^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. Contra> method6() => (Contra x) {}; //^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position in the return type. Cov> method7() { //^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position in the return type. return () { return () => throw "uncalled"; }; } Inv method8() => throw "uncalled"; //^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'inout' position in the return type. void method9(Inv x) {} // ^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'inout' position. Covariant method10() => throw "uncalled"; //^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position in the return type. void method11(Contravariant x) {} // ^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. Invariant method12() => throw "uncalled"; //^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'inout' position in the return type. void method13(Invariant x) {} // ^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'inout' position. void method14(Contravariant> x) {} // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. void method15(Covariant> x) {} // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. Contravariant> method16() => Contravariant>(); //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position in the return type. Covariant> method17() => Covariant>(); //^^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position in the return type. void method18() {} // ^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // [cfe] Can't use 'in' type variable 'T' in an 'inout' position. void method19>() {} // ^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // [cfe] Can't use 'in' type variable 'T' in an 'inout' position. void method20>() {} // ^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // [cfe] Can't use 'in' type variable 'T' in an 'inout' position. void method21({required Contra x}) {} // ^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. void method22({required Contravariant x}) {} // ^^^^^^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. void method23({required Covariant x, required Contravariant y}) {} // ^^^^^^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. void method24>() {} // ^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // [cfe] Can't use 'in' type variable 'T' in an 'inout' position. void method25>() {} // ^^^^^^^^^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // [cfe] Can't use 'in' type variable 'T' in an 'inout' position. } class B { void method1(A x) {} // ^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. Contra> method2() { //^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position in the return type. throw "uncalled"; } } class C { void method(T x) {} } class D extends C { @override void method(void Function(T) x) {} // ^^^^^^^^^^^^^^^^^^ // [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION // ^ // [cfe] Can't use 'in' type variable 'T' in an 'out' position. }