0fd7cd0456
Change-Id: Ifff0e171eff354c2f8fc87271c8b58db6b2117df Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/400581 Reviewed-by: Erik Ernst <eernst@google.com> Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
350 lines
14 KiB
Dart
350 lines
14 KiB
Dart
// 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<T> = void Function<X extends T>();
|
|
typedef Cov<T> = T Function();
|
|
typedef Contra<T> = void Function(T);
|
|
|
|
class Covariant<out T> {}
|
|
class Contravariant<in T> {}
|
|
class Invariant<inout T> {}
|
|
|
|
class A<in T> {
|
|
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<T> x) {}
|
|
// ^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// ^
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'out' position.
|
|
|
|
Cov<T> 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<Cov<T>> 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<Contra<T>> x) {}
|
|
// ^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// ^
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'out' position.
|
|
|
|
Contra<Contra<T>> method6() => (Contra<T> 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<Cov<T>> 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<T> 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<T> x) {}
|
|
// ^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// ^
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'inout' position.
|
|
|
|
Covariant<T> 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<T> x) {}
|
|
// ^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// ^
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'out' position.
|
|
|
|
Invariant<T> 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<T> 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<Covariant<T>> 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<Contravariant<T>> x) {}
|
|
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// ^
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'out' position.
|
|
|
|
Contravariant<Contravariant<T>> method16() => Contravariant<Contravariant<T>>();
|
|
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
// [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<Covariant<T>> method17() => Covariant<Covariant<T>>();
|
|
//^^^^^^^^^^^^^^^^^^^^^^^
|
|
// [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<X extends T>() {}
|
|
// ^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'inout' position.
|
|
|
|
void method19<X extends Cov<T>>() {}
|
|
// ^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'inout' position.
|
|
|
|
void method20<X extends Covariant<T>>() {}
|
|
// ^^^^^^^^^^^^^^^^^^^^^^
|
|
// [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<T> 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<T> 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<T> x, required Contravariant<T> y}) {}
|
|
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// ^
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'out' position.
|
|
|
|
void method24<X extends Contra<T>>() {}
|
|
// ^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'inout' position.
|
|
|
|
void method25<X extends Contravariant<T>>() {}
|
|
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'inout' position.
|
|
}
|
|
|
|
mixin BMixin<in T> {
|
|
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<T> x) {}
|
|
// ^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// ^
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'out' position.
|
|
|
|
Cov<T> 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<Cov<T>> 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<Contra<T>> x) {}
|
|
// ^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// ^
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'out' position.
|
|
|
|
Contra<Contra<T>> method6() => (Contra<T> 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<Cov<T>> 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<T> 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<T> x) {}
|
|
// ^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// ^
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'inout' position.
|
|
|
|
Covariant<T> 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<T> x) {}
|
|
// ^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// ^
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'out' position.
|
|
|
|
Invariant<T> 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<T> 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<Covariant<T>> 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<Contravariant<T>> x) {}
|
|
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// ^
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'out' position.
|
|
|
|
Contravariant<Contravariant<T>> method16() => Contravariant<Contravariant<T>>();
|
|
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
// [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<Covariant<T>> method17() => Covariant<Covariant<T>>();
|
|
//^^^^^^^^^^^^^^^^^^^^^^^
|
|
// [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<X extends T>() {}
|
|
// ^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'inout' position.
|
|
|
|
void method19<X extends Cov<T>>() {}
|
|
// ^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'inout' position.
|
|
|
|
void method20<X extends Covariant<T>>() {}
|
|
// ^^^^^^^^^^^^^^^^^^^^^^
|
|
// [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<T> 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<T> 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<T> x, required Contravariant<T> y}) {}
|
|
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// ^
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'out' position.
|
|
|
|
void method24<X extends Contra<T>>() {}
|
|
// ^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'inout' position.
|
|
|
|
void method25<X extends Contravariant<T>>() {}
|
|
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'inout' position.
|
|
}
|
|
|
|
class B<in T> {
|
|
void method1(A<T> x) {}
|
|
// ^^^^^^
|
|
// [analyzer] COMPILE_TIME_ERROR.WRONG_TYPE_PARAMETER_VARIANCE_POSITION
|
|
// ^
|
|
// [cfe] Can't use 'in' type variable 'T' in an 'out' position.
|
|
Contra<A<T>> 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<T> {
|
|
void method(T x) {}
|
|
}
|
|
|
|
class D<in T> extends C<void Function(T)> {
|
|
@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.
|
|
}
|