| import java.util.Comparator; |
| import org.checkerframework.checker.interning.qual.Interned; |
| |
| public class ComplexComparison { |
| |
| void testInterned() { |
| |
| @Interned String a = "foo"; |
| @Interned String b = "bar"; |
| |
| if (a != null && b != null && a == b) { |
| System.out.println("yes"); |
| } else { |
| System.out.println("no"); |
| } |
| } |
| |
| void testInternedDueToFlow() { |
| |
| String c = "foo"; |
| String d = "bar"; |
| |
| if (c != null && d != null && c == d) { |
| System.out.println("yes"); |
| } else { |
| System.out.println("no"); |
| } |
| } |
| |
| void testNotInterned() { |
| |
| String e = new String("foo"); |
| String f = new String("bar"); |
| |
| // :: error: (not.interned) |
| if (e != null && f != null && e == f) { |
| System.out.println("yes"); |
| } else { |
| System.out.println("no"); |
| } |
| } |
| |
| /* @ pure */ public class DoubleArrayComparatorLexical implements Comparator<double[]> { |
| |
| /** |
| * Lexically compares o1 and o2 as double arrays. |
| * |
| * @return positive if o1 > 02, 0 if 01 == 02, negative if 01 < 02 |
| */ |
| public int compare(double[] a1, double[] a2) { |
| // Heuristic: permit "arg1 == arg2" in a test in the first statement |
| // of a "Comparator.compare" method, if the body just returns 0. |
| if (a1 == a2) { |
| return 0; |
| } |
| int len = Math.min(a1.length, a2.length); |
| for (int i = 0; i < len; i++) { |
| if (a1[i] != a2[i]) { |
| return ((a1[i] > a2[i]) ? 1 : -1); |
| } |
| } |
| return a1.length - a2.length; |
| } |
| } |
| |
| class C { |
| @Override |
| @org.checkerframework.dataflow.qual.Pure |
| public boolean equals(Object other) { |
| // Heuristic: permit "this == arg1" in a test in the first statement |
| // of a "Comparator.compare" method, if the body just returns true. |
| if (this == other) { |
| return true; |
| } |
| return super.equals(other); |
| } |
| } |
| |
| // // TODO |
| // class D { |
| // @Override |
| // public boolean equals(Object other) { |
| // // Don't suppress warnings at "this == arg1" if arg1 has been reassigned |
| // other = new Object(); |
| // |
| // if (this == other) { |
| // return true; |
| // } |
| // return super.equals(other); |
| // } |
| // } |
| |
| } |