| // Copyright (c) 2020, 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. | |
| // Test the static analysis of expressions of the form `e1 == e2`: Null is | |
| // allowed on both the left and right hand side, but handled separately, so | |
| // the instance member `operator ==` is only invoked with non-null receiver | |
| // and argument. | |
| import 'dart:async'; | |
| class A {} | |
| class Covar1 { | |
| // When `typeof(e1)` is `Covar1`, `e1 == e2` requires `typeof(e2) <: Covar1`. | |
| operator ==(covariant Covar1 other) => identical(this, other); | |
| } | |
| abstract class AbstractCovar2 { | |
| // When typeof(e1) is a subtype of `AbstractCovar2`, but not a subtype of | |
| // `Covar2Impl`, `e1 == e2` requires `typeof(e2) <: AbstractCovar2`. We use | |
| // `const` to make it statically known that the actual object for `e1` is a | |
| // `Covar2Impl`, thus checking that the `==` check uses the specified static | |
| // type rather than using knowledge about the constant expression directly. | |
| operator ==(covariant AbstractCovar2 other); | |
| const factory AbstractCovar2() = Covar2Impl; | |
| } | |
| class Covar2Impl implements AbstractCovar2 { | |
| const Covar2Impl(); | |
| operator ==(Object other) => identical(this, other); | |
| } | |
| void main() { | |
| num numVar = 2; | |
| A aVar = A(); | |
| Covar1 covar1Var = Covar1(); | |
| A? aNullableVar = null; | |
| Covar1? covar1NullableVar = null; | |
| FutureOr<int?> futureOrNullableIntVar = null; | |
| FutureOr<Covar1> futureOrCovar1Var = covar1Var; | |
| List<void> voidListVar = [1]; | |
| var voidVar = voidListVar[0]; | |
| null == null; | |
| null == true; | |
| null == <int>{}; | |
| null == numVar; | |
| null == aVar; | |
| null == covar1Var; | |
| null == aNullableVar; | |
| null == covar1NullableVar; | |
| null == futureOrNullableIntVar; | |
| null == futureOrCovar1Var; | |
| null == const AbstractCovar2(); | |
| null == voidListVar; | |
| null == voidVar; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| true == null; | |
| true == true; | |
| true == <int>{}; | |
| true == numVar; | |
| true == aVar; | |
| true == covar1Var; | |
| true == aNullableVar; | |
| true == covar1NullableVar; | |
| true == futureOrNullableIntVar; | |
| true == futureOrCovar1Var; | |
| true == const AbstractCovar2(); | |
| true == voidListVar; | |
| true == voidVar; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| <int>{} == null; | |
| <int>{} == true; | |
| <int>{} == <int>{}; | |
| <int>{} == numVar; | |
| <int>{} == aVar; | |
| <int>{} == covar1Var; | |
| <int>{} == aNullableVar; | |
| <int>{} == covar1NullableVar; | |
| <int>{} == futureOrNullableIntVar; | |
| <int>{} == futureOrCovar1Var; | |
| <int>{} == const AbstractCovar2(); | |
| <int>{} == voidListVar; | |
| <int>{} == voidVar; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| numVar == null; | |
| numVar == true; | |
| numVar == <int>{}; | |
| numVar == numVar; | |
| numVar == aVar; | |
| numVar == covar1Var; | |
| numVar == aNullableVar; | |
| numVar == covar1NullableVar; | |
| numVar == futureOrNullableIntVar; | |
| numVar == futureOrCovar1Var; | |
| numVar == const AbstractCovar2(); | |
| numVar == voidListVar; | |
| numVar == voidVar; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| aVar == null; | |
| aVar == true; | |
| aVar == <int>{}; | |
| aVar == numVar; | |
| aVar == aVar; | |
| aVar == covar1Var; | |
| aVar == aNullableVar; | |
| aVar == covar1NullableVar; | |
| aVar == futureOrNullableIntVar; | |
| aVar == futureOrCovar1Var; | |
| aVar == const AbstractCovar2(); | |
| aVar == voidListVar; | |
| aVar == voidVar; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| covar1Var == null; | |
| covar1Var == true; | |
| // ^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'bool' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == <int>{}; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // ^ | |
| // [cfe] The argument type 'Set<int>' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == numVar; | |
| // ^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'num' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == aVar; | |
| // ^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'A' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == covar1Var; | |
| covar1Var == aNullableVar; | |
| // ^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'A?' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == covar1NullableVar; | |
| covar1Var == futureOrNullableIntVar; | |
| // ^^^^^^^^^^^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'FutureOr<int?>' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == futureOrCovar1Var; | |
| // ^^^^^^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'FutureOr<Covar1>' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == const AbstractCovar2(); | |
| // ^^^^^^^^^^^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // ^ | |
| // [cfe] The argument type 'AbstractCovar2' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == voidListVar; | |
| // ^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'List<void>' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == voidVar; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| aNullableVar == null; | |
| aNullableVar == true; | |
| aNullableVar == <int>{}; | |
| aNullableVar == numVar; | |
| aNullableVar == aVar; | |
| aNullableVar == covar1Var; | |
| aNullableVar == aNullableVar; | |
| aNullableVar == covar1NullableVar; | |
| aNullableVar == futureOrNullableIntVar; | |
| aNullableVar == futureOrCovar1Var; | |
| aNullableVar == const AbstractCovar2(); | |
| aNullableVar == voidListVar; | |
| aNullableVar == voidVar; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| covar1NullableVar == null; | |
| covar1NullableVar == true; | |
| // ^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'bool' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == <int>{}; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // ^ | |
| // [cfe] The argument type 'Set<int>' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == numVar; | |
| // ^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'num' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == aVar; | |
| // ^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'A' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == covar1Var; | |
| covar1NullableVar == aNullableVar; | |
| // ^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'A?' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == covar1NullableVar; | |
| covar1NullableVar == futureOrNullableIntVar; | |
| // ^^^^^^^^^^^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'FutureOr<int?>' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == futureOrCovar1Var; | |
| // ^^^^^^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'FutureOr<Covar1>' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == const AbstractCovar2(); | |
| // ^^^^^^^^^^^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // ^ | |
| // [cfe] The argument type 'AbstractCovar2' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == voidListVar; | |
| // ^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'List<void>' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == voidVar; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| futureOrNullableIntVar == null; | |
| futureOrNullableIntVar == true; | |
| futureOrNullableIntVar == <int>{}; | |
| futureOrNullableIntVar == numVar; | |
| futureOrNullableIntVar == aVar; | |
| futureOrNullableIntVar == covar1Var; | |
| futureOrNullableIntVar == aNullableVar; | |
| futureOrNullableIntVar == covar1NullableVar; | |
| futureOrNullableIntVar == futureOrNullableIntVar; | |
| futureOrNullableIntVar == futureOrCovar1Var; | |
| futureOrNullableIntVar == const AbstractCovar2(); | |
| futureOrNullableIntVar == voidListVar; | |
| futureOrNullableIntVar == voidVar; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| futureOrCovar1Var == null; | |
| futureOrCovar1Var == true; | |
| futureOrCovar1Var == <int>{}; | |
| futureOrCovar1Var == numVar; | |
| futureOrCovar1Var == aVar; | |
| futureOrCovar1Var == covar1Var; | |
| futureOrCovar1Var == aNullableVar; | |
| futureOrCovar1Var == covar1NullableVar; | |
| futureOrCovar1Var == futureOrNullableIntVar; | |
| futureOrCovar1Var == futureOrCovar1Var; | |
| futureOrCovar1Var == const AbstractCovar2(); | |
| futureOrCovar1Var == voidListVar; | |
| futureOrCovar1Var == voidVar; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| const AbstractCovar2() == null; | |
| const AbstractCovar2() == true; | |
| // ^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'bool' can't be assigned to the parameter type 'AbstractCovar2?'. | |
| const AbstractCovar2() == <int>{}; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // ^ | |
| // [cfe] The argument type 'Set<int>' can't be assigned to the parameter type 'AbstractCovar2?'. | |
| const AbstractCovar2() == numVar; | |
| // ^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'num' can't be assigned to the parameter type 'AbstractCovar2?'. | |
| const AbstractCovar2() == aVar; | |
| // ^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'A' can't be assigned to the parameter type 'AbstractCovar2?'. | |
| const AbstractCovar2() == covar1Var; | |
| // ^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'Covar1' can't be assigned to the parameter type 'AbstractCovar2?'. | |
| const AbstractCovar2() == aNullableVar; | |
| // ^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'A?' can't be assigned to the parameter type 'AbstractCovar2?'. | |
| const AbstractCovar2() == covar1NullableVar; | |
| // ^^^^^^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'Covar1?' can't be assigned to the parameter type 'AbstractCovar2?'. | |
| const AbstractCovar2() == futureOrNullableIntVar; | |
| // ^^^^^^^^^^^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'FutureOr<int?>' can't be assigned to the parameter type 'AbstractCovar2?'. | |
| const AbstractCovar2() == futureOrCovar1Var; | |
| // ^^^^^^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'FutureOr<Covar1>' can't be assigned to the parameter type 'AbstractCovar2?'. | |
| const AbstractCovar2() == const AbstractCovar2(); | |
| const AbstractCovar2() == voidListVar; | |
| // ^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'List<void>' can't be assigned to the parameter type 'AbstractCovar2?'. | |
| const AbstractCovar2() == voidVar; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| voidListVar == null; | |
| voidListVar == true; | |
| voidListVar == <int>{}; | |
| voidListVar == numVar; | |
| voidListVar == aVar; | |
| voidListVar == covar1Var; | |
| voidListVar == aNullableVar; | |
| voidListVar == covar1NullableVar; | |
| voidListVar == futureOrNullableIntVar; | |
| voidListVar == futureOrCovar1Var; | |
| voidListVar == const AbstractCovar2(); | |
| voidListVar == voidListVar; | |
| voidListVar == voidVar; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| voidVar == null; | |
| // [error column 3, length 7] | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| voidVar == true; | |
| // [error column 3, length 7] | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| voidVar == <int>{}; | |
| // [error column 3, length 7] | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| voidVar == numVar; | |
| // [error column 3, length 7] | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| voidVar == aVar; | |
| // [error column 3, length 7] | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| voidVar == covar1Var; | |
| // [error column 3, length 7] | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| voidVar == aNullableVar; | |
| // [error column 3, length 7] | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| voidVar == covar1NullableVar; | |
| // [error column 3, length 7] | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| voidVar == futureOrNullableIntVar; | |
| // [error column 3, length 7] | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| voidVar == futureOrCovar1Var; | |
| // [error column 3, length 7] | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| voidVar == voidListVar; | |
| // [error column 3, length 7] | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| voidVar == voidVar; | |
| // [error column 3, length 7] | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| void fun<X extends Covar1, Y extends Covar1?, Z extends FutureOr<Covar1>>( | |
| X covar1Var, | |
| Y covar1NullableVar, | |
| Z futureOrCovar1Var, | |
| ) { | |
| covar1Var == null; | |
| covar1Var == true; | |
| // ^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'bool' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == <int>{}; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // ^ | |
| // [cfe] The argument type 'Set<int>' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == numVar; | |
| // ^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'num' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == aVar; | |
| // ^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'A' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == covar1Var; | |
| covar1Var == aNullableVar; | |
| // ^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'A?' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == covar1NullableVar; | |
| covar1Var == futureOrNullableIntVar; | |
| // ^^^^^^^^^^^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'FutureOr<int?>' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == futureOrCovar1Var; | |
| // ^^^^^^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'Z' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == const AbstractCovar2(); | |
| // ^^^^^^^^^^^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // ^ | |
| // [cfe] The argument type 'AbstractCovar2' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == voidListVar; | |
| // ^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'List<void>' can't be assigned to the parameter type 'Covar1?'. | |
| covar1Var == voidVar; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| covar1NullableVar == null; | |
| covar1NullableVar == true; | |
| // ^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'bool' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == <int>{}; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // ^ | |
| // [cfe] The argument type 'Set<int>' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == numVar; | |
| // ^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'num' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == aVar; | |
| // ^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'A' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == covar1Var; | |
| covar1NullableVar == aNullableVar; | |
| // ^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'A?' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == covar1NullableVar; | |
| covar1NullableVar == futureOrNullableIntVar; | |
| // ^^^^^^^^^^^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'FutureOr<int?>' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == futureOrCovar1Var; | |
| // ^^^^^^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'Z' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == const AbstractCovar2(); | |
| // ^^^^^^^^^^^^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // ^ | |
| // [cfe] The argument type 'AbstractCovar2' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == voidListVar; | |
| // ^^^^^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.ARGUMENT_TYPE_NOT_ASSIGNABLE | |
| // [cfe] The argument type 'List<void>' can't be assigned to the parameter type 'Covar1?'. | |
| covar1NullableVar == voidVar; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| futureOrCovar1Var == null; | |
| futureOrCovar1Var == true; | |
| futureOrCovar1Var == <int>{}; | |
| futureOrCovar1Var == numVar; | |
| futureOrCovar1Var == aVar; | |
| futureOrCovar1Var == covar1Var; | |
| futureOrCovar1Var == aNullableVar; | |
| futureOrCovar1Var == covar1NullableVar; | |
| futureOrCovar1Var == futureOrNullableIntVar; | |
| futureOrCovar1Var == futureOrCovar1Var; | |
| futureOrCovar1Var == const AbstractCovar2(); | |
| futureOrCovar1Var == voidListVar; | |
| futureOrCovar1Var == voidVar; | |
| // ^^^^^^^ | |
| // [analyzer] COMPILE_TIME_ERROR.USE_OF_VOID_RESULT | |
| // [cfe] This expression has type 'void' and can't be used. | |
| } | |
| } |