| // Test case for Issue #770 |
| // https://github.com/typetools/checker-framework/issues/770 |
| |
| import org.checkerframework.checker.lock.qual.GuardedBy; |
| |
| public class ViewpointAdaptation { |
| // :: error: (expression.unparsable) |
| private final @GuardedBy("a") ViewpointAdaptation f = new ViewpointAdaptation(); |
| |
| private @GuardedBy("this.lock") ViewpointAdaptation g = new ViewpointAdaptation(); |
| |
| private final Object lock = new Object(); |
| |
| private int counter; |
| |
| public void method1(final String a) { |
| synchronized (a) { |
| // The expression "a" from the @GuardedBy annotation |
| // on f is not valid at the declaration site of f. |
| // :: error: (expression.unparsable) |
| f.counter++; |
| } |
| } |
| |
| public void method2() { |
| ViewpointAdaptation t = new ViewpointAdaptation(); |
| |
| // :: error: (assignment) |
| t.g = g; // "t.lock" != "this.lock" |
| |
| synchronized (t.lock) { |
| // :: error: (lock.not.held) |
| g.counter++; |
| } |
| } |
| |
| public void method3() { |
| final ViewpointAdaptation t = new ViewpointAdaptation(); |
| // The type of 'g' is refined from @GuardedByUnknown (the default for |
| // a local variable due to CLIMB-to-top semantics) to @GuardedBy("t.g") |
| final ViewpointAdaptation g = t.g; |
| Object l = t.lock; |
| |
| synchronized (l) { |
| // Aliasing of lock expressions is not tracked by the Lock Checker. |
| // The Lock Checker does not know that l == t.lock |
| // :: error: (lock.not.held) |
| g.counter++; |
| } |
| } |
| } |