diff --git a/liquidjava-example/src/main/java/testSuite/ErrorUnknownMethodInOperation.java b/liquidjava-example/src/main/java/testSuite/ErrorUnknownMethodInOperation.java index 177dab74..3ca462a4 100644 --- a/liquidjava-example/src/main/java/testSuite/ErrorUnknownMethodInOperation.java +++ b/liquidjava-example/src/main/java/testSuite/ErrorUnknownMethodInOperation.java @@ -9,4 +9,17 @@ public void lengthPlusOne(String s) { @Refinement("_ > 0") int x = s.length() + 1; // Expect: Refinement Error } + + static void take(@Refinement("_ > 0") int amount) {} + + static void takeTrue(@Refinement("_ == true") boolean flag) {} + + // also when passed straight as an argument (issue #451) + public void lengthAsArgument(String s) { + take(s.length()); // Expect: Refinement Error + } + + public void isEmptyAsArgument(String s) { + takeTrue(s.isEmpty()); // Expect: Refinement Error + } } diff --git a/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/general_checkers/MethodsFunctionsChecker.java b/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/general_checkers/MethodsFunctionsChecker.java index 8c8f4ade..0e21f2fb 100644 --- a/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/general_checkers/MethodsFunctionsChecker.java +++ b/liquidjava-verifier/src/main/java/liquidjava/processor/refinement_checker/general_checkers/MethodsFunctionsChecker.java @@ -16,6 +16,7 @@ import liquidjava.processor.refinement_checker.object_checkers.AuxHierarchyRefinementsPassage; import liquidjava.processor.refinement_checker.object_checkers.AuxStateHandler; import liquidjava.rj_language.Predicate; +import liquidjava.rj_language.ast.LiteralBoolean; import liquidjava.rj_language.ast.formatter.ArgumentDisplayNames; import liquidjava.utils.GeneratedNames; import liquidjava.utils.Utils; @@ -456,7 +457,10 @@ private String createVariableRepresentingArgument(CtExpression iArg, Variable Predicate met = (Predicate) iArg.getMetadata(Keys.REFINEMENT); if (met == null) met = new Predicate(); - if (!met.getVariableNames().contains(Keys.WILDCARD)) + // a bare `true` means nothing is known about the argument (e.g. the result of an unrefined call), not that it + // equals true + boolean unknown = met.getExpression()instanceof LiteralBoolean b && b.isBooleanTrue(); + if (!unknown && !met.getVariableNames().contains(Keys.WILDCARD)) met = Predicate.createEquals(Predicate.createVar(Keys.WILDCARD), met); String nVar = String.format(Formats.INSTANCE, fArg.getName(), rtc.getContext().getCounter()); rtc.getContext().addInstanceToContext(nVar, fArg.getType(), met.substituteVariable(Keys.WILDCARD, nVar), iArg);