mirror of
https://github.com/dart-lang/sdk
synced 2024-10-03 03:12:17 +00:00
[vm/bytecode] Fix handling of contravariant parameters in isUncheckedCall
Fixes language_2/variance/variance_in_method_test.dart when bytecode is enabled in AOT mode. Change-Id: I2d1338f2d68ab3a91127cdbeb60c71597d4da718 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/127981 Reviewed-by: Régis Crelier <regis@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com>
This commit is contained in:
parent
4ce13659b4
commit
c74a8ec2c4
|
@ -226,14 +226,31 @@ bool isUncheckedCall(Member interfaceTarget, Expression receiver,
|
|||
|
||||
DartType receiverStaticType = getStaticType(receiver, staticTypeContext);
|
||||
if (receiverStaticType is InterfaceType) {
|
||||
if (receiverStaticType.typeArguments.isEmpty) {
|
||||
final typeArguments = receiverStaticType.typeArguments;
|
||||
if (typeArguments.isEmpty) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (receiverStaticType.typeArguments.every(
|
||||
(t) => isSealedType(t, staticTypeContext.typeEnvironment.coreTypes))) {
|
||||
return true;
|
||||
final typeParameters = receiverStaticType.classNode.typeParameters;
|
||||
assert(typeArguments.length == typeParameters.length);
|
||||
for (int i = 0; i < typeArguments.length; ++i) {
|
||||
switch (typeParameters[i].variance) {
|
||||
case Variance.covariant:
|
||||
if (!isSealedType(
|
||||
typeArguments[i], staticTypeContext.typeEnvironment.coreTypes)) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case Variance.invariant:
|
||||
break;
|
||||
case Variance.contravariant:
|
||||
return false;
|
||||
default:
|
||||
throw 'Unexpected variance ${typeParameters[i].variance} of '
|
||||
'${typeParameters[i]} in ${receiverStaticType.classNode}';
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -25,7 +25,8 @@ for arg in "$@"; do
|
|||
--packages=*)
|
||||
PACKAGES="$arg"
|
||||
;;
|
||||
--enable-asserts)
|
||||
--enable-asserts | \
|
||||
--enable-experiment=*)
|
||||
GEN_KERNEL_OPTIONS+=("$arg")
|
||||
OPTIONS+=("$arg")
|
||||
;;
|
||||
|
|
Loading…
Reference in a new issue