import org.checkerframework.checker.nullness.qual.*;

// @skip-test
// This test is broken as it uses multiple classes.  Javac halts when seeing the first error
public class RawSuper {

  class A {
    @NonNull Object afield;

    A() {
      super();
      mRA(this);
      // :: error: (type.incompatible)
      mA(this);
      afield = new Object();
      mRA(this);
      mA(this);
    }

    A(int ignore) {
      this.raw();
      afield = new Object();
    }

    void raw(A this) {}

    void nonRaw() {}
  }

  class B extends A {
    @NonNull Object bfield;

    B() {
      mRA(this);
      mA(this);
      mRB(this);
      // :: error: (type.incompatible)
      mB(this);
      bfield = new Object();
      mRA(this);
      mA(this);
      mRB(this);
      mB(this);
    }

    void raw(B this) {
      // :: error: (type.incompatible)
      super.nonRaw();
    }
  }
  // This test may be extraneous
  class C extends B {
    @NonNull Object cfield;

    C() {
      mRA(this);
      mA(this);
      mRB(this);
      mB(this);
      mRC(this);
      // :: error: (type.incompatible)
      mC(this);
      cfield = new Object();
      mRA(this);
      mA(this);
      mRB(this);
      mB(this);
      mRC(this);
      mC(this);
    }
  }

  void mA(A a) {}

  void mRA(A a) {}

  void mB(B b) {}

  void mRB(B b) {}

  void mC(C c) {}

  void mRC(C c) {}
}
