@@ -4543,8 +4543,9 @@ class HIsTest extends HInstruction {
45434543 HInstruction get typeInput => inputs[0 ];
45444544 HInstruction get checkedInput => inputs[1 ];
45454545
4546- AbstractBool evaluate (JClosedWorld closedWorld) =>
4547- _isTestResult (checkedInput, dartType, checkedAbstractValue, closedWorld);
4546+ AbstractBool evaluate (JClosedWorld closedWorld, bool useNullSafety) =>
4547+ _isTestResult (checkedInput, dartType, checkedAbstractValue, closedWorld,
4548+ useNullSafety);
45484549
45494550 @override
45504551 accept (HVisitor visitor) => visitor.visitIsTest (this );
@@ -4577,8 +4578,9 @@ class HIsTestSimple extends HInstruction {
45774578
45784579 HInstruction get checkedInput => inputs[0 ];
45794580
4580- AbstractBool evaluate (JClosedWorld closedWorld) =>
4581- _isTestResult (checkedInput, dartType, checkedAbstractValue, closedWorld);
4581+ AbstractBool evaluate (JClosedWorld closedWorld, bool useNullSafety) =>
4582+ _isTestResult (checkedInput, dartType, checkedAbstractValue, closedWorld,
4583+ useNullSafety);
45824584
45834585 @override
45844586 accept (HVisitor visitor) => visitor.visitIsTestSimple (this );
@@ -4596,11 +4598,36 @@ class HIsTestSimple extends HInstruction {
45964598 String toString () => 'HIsTestSimple()' ;
45974599}
45984600
4599- AbstractBool _isTestResult (HInstruction expression, DartType dartType,
4600- AbstractValueWithPrecision checkedAbstractValue, JClosedWorld closedWorld) {
4601+ AbstractBool _isTestResult (
4602+ HInstruction expression,
4603+ DartType dartType,
4604+ AbstractValueWithPrecision checkedAbstractValue,
4605+ JClosedWorld closedWorld,
4606+ bool useNullSafety) {
46014607 AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
46024608 AbstractValue subsetType = expression.instructionType;
46034609 AbstractValue supersetType = checkedAbstractValue.abstractValue;
4610+
4611+ if (useNullSafety &&
4612+ expression.isNull (abstractValueDomain).isDefinitelyTrue) {
4613+ if (closedWorld.dartTypes.isTopType (dartType) ||
4614+ dartType is NullableType ||
4615+ dartType.isNull) {
4616+ return AbstractBool .True ;
4617+ }
4618+ if (dartType is TypeVariableType || dartType is FunctionTypeVariable ) {
4619+ return AbstractBool .Maybe ;
4620+ }
4621+ if (dartType is LegacyType ) {
4622+ DartType baseType = dartType.baseType;
4623+ if (baseType is NeverType ) return AbstractBool .True ;
4624+ if (baseType is TypeVariableType || baseType is FunctionTypeVariable ) {
4625+ return AbstractBool .Maybe ;
4626+ }
4627+ }
4628+ return AbstractBool .False ;
4629+ }
4630+
46044631 if (checkedAbstractValue.isPrecise &&
46054632 abstractValueDomain.isIn (subsetType, supersetType).isDefinitelyTrue) {
46064633 return AbstractBool .True ;
0 commit comments