[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:
Alexander Markov 2019-12-10 20:28:46 +00:00 committed by commit-bot@chromium.org
parent 4ce13659b4
commit c74a8ec2c4
2 changed files with 23 additions and 5 deletions

View file

@ -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;
}

View file

@ -25,7 +25,8 @@ for arg in "$@"; do
--packages=*)
PACKAGES="$arg"
;;
--enable-asserts)
--enable-asserts | \
--enable-experiment=*)
GEN_KERNEL_OPTIONS+=("$arg")
OPTIONS+=("$arg")
;;