import org.checkerframework.common.util.report.qual.*;

public class Accesses {
  class Demo {
    @ReportReadWrite Object read;

    @ReportWrite Object write;

    @ReportCall
    Object foo(Object p) {
      return null;
    }

    void implicitRead() {
      // :: error: (fieldreadwrite)
      Object o = read;
      // A read counts as access
      // :: error: (fieldreadwrite)
      read = null;
      // :: error: (fieldreadwrite)
      read.toString();
    }

    void implicitWrite() {
      Object o = write;
      // :: error: (fieldwrite)
      write = null;
      write.toString();
    }

    void implicitMethod() {
      // :: error: (methodcall)
      foo(null);
      // :: error: (methodcall)
      equals(foo(null));
    }
  }

  void accessesRead(Demo d) {
    // :: error: (fieldreadwrite)
    Object o = d.read;
    // A read counts as access
    // :: error: (fieldreadwrite)
    d.read = null;
    // :: error: (fieldreadwrite)
    d.read.toString();
  }

  void accessesWrite(Demo d) {
    Object o = d.write;
    // :: error: (fieldwrite)
    d.write = null;
    d.write.toString();
  }

  void accessesMethod(Demo d) {
    // :: error: (methodcall)
    d.foo(null);
    // :: error: (methodcall)
    d.equals(d.foo(null));
  }
}
