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