Skip to content

Commit 1dfc32c

Browse files
committed
Fix Misleading Expansions
1 parent f8d3f3e commit 1dfc32c

File tree

4 files changed

+22
-12
lines changed

4 files changed

+22
-12
lines changed

liquidjava-verifier/src/main/java/liquidjava/rj_language/ast/Var.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,8 @@ public boolean equals(Object obj) {
7070
return name.equals(other.name);
7171
}
7272
}
73+
74+
public boolean isInternal() {
75+
return name.startsWith("#");
76+
}
7377
}

liquidjava-verifier/src/main/java/liquidjava/rj_language/opt/ConstantFolding.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,18 +172,24 @@ private static ValDerivationNode foldUnary(ValDerivationNode node) {
172172
// !true => false, !false => true
173173
boolean value = operand.isBooleanTrue();
174174
Expression res = new LiteralBoolean(!value);
175-
return new ValDerivationNode(res, new UnaryDerivationNode(operandNode, operator));
175+
DerivationNode origin = operandNode.getOrigin() != null ? new UnaryDerivationNode(operandNode, operator)
176+
: null;
177+
return new ValDerivationNode(res, origin);
176178
}
177179
// unary minus
178180
if ("-".equals(operator)) {
179181
// -(x) => -x
180182
if (operand instanceof LiteralInt) {
181183
Expression res = new LiteralInt(-((LiteralInt) operand).getValue());
182-
return new ValDerivationNode(res, new UnaryDerivationNode(operandNode, operator));
184+
DerivationNode origin = operandNode.getOrigin() != null ? new UnaryDerivationNode(operandNode, operator)
185+
: null;
186+
return new ValDerivationNode(res, origin);
183187
}
184188
if (operand instanceof LiteralReal) {
185189
Expression res = new LiteralReal(-((LiteralReal) operand).getValue());
186-
return new ValDerivationNode(res, new UnaryDerivationNode(operandNode, operator));
190+
DerivationNode origin = operandNode.getOrigin() != null ? new UnaryDerivationNode(operandNode, operator)
191+
: null;
192+
return new ValDerivationNode(res, origin);
187193
}
188194
}
189195

liquidjava-verifier/src/main/java/liquidjava/rj_language/opt/ExpressionSimplifier.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,12 @@ private static ValDerivationNode simplifyValDerivationNode(ValDerivationNode nod
7676

7777
// return the conjunction with simplified children
7878
Expression newValue = new BinaryExpression(leftSimplified.getValue(), "&&", rightSimplified.getValue());
79-
DerivationNode newOrigin = new BinaryDerivationNode(leftSimplified, rightSimplified, "&&");
80-
return new ValDerivationNode(newValue, newOrigin);
79+
// only create origin if at least one child has a meaningful origin
80+
if (leftSimplified.getOrigin() != null || rightSimplified.getOrigin() != null) {
81+
DerivationNode newOrigin = new BinaryDerivationNode(leftSimplified, rightSimplified, "&&");
82+
return new ValDerivationNode(newValue, newOrigin);
83+
}
84+
return new ValDerivationNode(newValue, null);
8185
}
8286
// no simplification
8387
return node;

liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/ExpressionSimplifierTest.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,7 @@ void testSimpleComparison() {
120120
ValDerivationNode trueFromOr = new ValDerivationNode(new LiteralBoolean(true), orFalseTrue);
121121

122122
// !true = false
123-
ValDerivationNode valTrue2 = new ValDerivationNode(new LiteralBoolean(true), null);
124-
UnaryDerivationNode notOp = new UnaryDerivationNode(valTrue2, "!");
125-
ValDerivationNode falseFromNot = new ValDerivationNode(new LiteralBoolean(false), notOp);
123+
ValDerivationNode falseFromNot = new ValDerivationNode(new LiteralBoolean(false), null);
126124

127125
// true && false = false
128126
BinaryDerivationNode andTrueFalse = new BinaryDerivationNode(trueFromOr, falseFromNot, "&&");
@@ -187,10 +185,8 @@ void testArithmeticWithConstants() {
187185
BinaryDerivationNode div6By2 = new BinaryDerivationNode(val6, val2, "/");
188186
ValDerivationNode val3 = new ValDerivationNode(new LiteralInt(3), div6By2);
189187

190-
// -5 from unary negation of 5
191-
ValDerivationNode val5 = new ValDerivationNode(new LiteralInt(5), null);
192-
UnaryDerivationNode unaryNeg5 = new UnaryDerivationNode(val5, "-");
193-
ValDerivationNode valNeg5 = new ValDerivationNode(new LiteralInt(-5), unaryNeg5);
188+
// -5 is a literal with no origin
189+
ValDerivationNode valNeg5 = new ValDerivationNode(new LiteralInt(-5), null);
194190

195191
// 3 + (-5) = -2
196192
BinaryDerivationNode add3AndNeg5 = new BinaryDerivationNode(val3, valNeg5, "+");

0 commit comments

Comments
 (0)