Skip to content

Commit

Permalink
SE: Fix constant number pattern logic (#7931)
Browse files Browse the repository at this point in the history
  • Loading branch information
Tim-Pohlmann committed Aug 31, 2023
1 parent dc72d9e commit 28f2de5
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,14 @@ private static BoolConstraint BoolConstraintFromConstant(ProgramState state, IIs
else if (state.Constraint<NumberConstraint>(constantPattern) is { } constantNumberConstraint
&& value.Constraint<NumberConstraint>() is { } valueNumberConstraint)
{
return BoolConstraint.From(valueNumberConstraint.Overlaps(constantNumberConstraint));
if (constantNumberConstraint.IsSingleValue && valueNumberConstraint.IsSingleValue)
{
return BoolConstraint.From(constantNumberConstraint.Min == valueNumberConstraint.Min);
}
else if (!valueNumberConstraint.Overlaps(constantNumberConstraint))
{
return BoolConstraint.False;
}
}
}
return null; // We cannot take conclusive decision
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -328,11 +328,11 @@ public void DeclarationPattern_Var_Deconstruction_DoesNotSetConstraint()
[DataTestMethod]
[DataRow("i == 42", 42, true)]
[DataRow("i == 16", 42, false)]
[DataRow("i >= 42", 42, true)]
[DataRow("i <= 42", 42, true)]
[DataRow("i >= 42", 42, null)]
[DataRow("i <= 42", 42, null)]
[DataRow("i > 42", 42, false)]
[DataRow("i < 42", 42, false)]
public void ConstantNumberPatternSetBoolConstraint(string rangeCondition, int constant, bool expectedBoolConstraint)
public void ConstantNumberPatternSetBoolConstraint(string rangeCondition, int constant, bool? expectedBoolConstraint)
{
var code = $$"""
if ({{rangeCondition}})
Expand All @@ -341,7 +341,8 @@ public void ConstantNumberPatternSetBoolConstraint(string rangeCondition, int co
Tag("Result", result);
}
""";
SETestContext.CreateCS(code, "int i").Validator.TagValue("Result").Should().HaveOnlyConstraints(BoolConstraint.From(expectedBoolConstraint), ObjectConstraint.NotNull);
var expected = expectedBoolConstraint == null ? null : BoolConstraint.From(expectedBoolConstraint.Value);
SETestContext.CreateCS(code, "int i").Validator.TagValue("Result").Should().HaveOnlyConstraints(expected, ObjectConstraint.NotNull);
}

[DataTestMethod]
Expand Down

0 comments on commit 28f2de5

Please sign in to comment.