blob: 93e83161cc37af0fdb2d1a7d4244b7ffdc14f4ca [file] [log] [blame]
// Copyright (c) 2024, 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.
/// @assertion Let `D` be the declaration of a class or mixin, enum or a type
/// extension and let `X` be a type parameter declared by `D`.
///
/// If `X` has the variance modifier `out` then it is a compile-time error for
/// `X` to occur in a non-covariant position in a member signature in the body
/// of `D`, except that it is not an error if it occurs in a covariant position
/// in the type annotation of a formal parameter which is covariant (this is a
/// contravariant position in the member signature as a whole).
///
/// In particular, `X` can not be the type of a method parameter (unless it is
/// covariant). It can never be the bound of a type parameter of a generic
/// method
///
/// @description Check that it is a compile-time error if a type parameter has a
/// variance modifier `out` and occurs in a contravariant position in a member
/// signature in the body of `D` (it occurs in a covariant position in a
/// contravariant parameter).
/// @author sgrekhov22@gmail.com
// SharedOptions=--enable-experiment=variance
typedef CovariantT<T> = T Function();
class C<out X> {
final CovariantT<X>? v = null; // Ok, covariant
f(CovariantT<X> v) {}
// ^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
void set s(CovariantT<X> v) {}
// ^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
}
mixin M<out X> {
f(CovariantT<X> v) {}
// ^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
void set s(CovariantT<X> v) {}
// ^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
}
enum E<out X> {
e;
f(CovariantT<X> v) {}
// ^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
void set s(CovariantT<X> v) {}
// ^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
}
extension type ET<out X>(X x) {
f(CovariantT<X> v) {}
// ^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
void set s(CovariantT<X> v) {}
// ^^^^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
}
void main() {
print(C);
print(M);
print(E);
print(ET);
}