// Test case for Issue 946
// https://github.com/typetools/checker-framework/issues/946

interface Supply946<R> {
  R supply();
}

public class Issue946 {
  class MethodRefInnerA {
    // this line of code causes a crash in CF
    Supply946<MethodRefInnerB> constructorReferenceField = MethodRefInnerB::new;

    MethodRefInnerA(Issue946 Issue946.this) {
      // this line of code also causes a crash in CF
      Supply946<MethodRefInnerB> constructorReference = MethodRefInnerB::new;
    }

    void method() {
      // and so does this line
      Supply946<MethodRefInnerB> constructorReference = MethodRefInnerB::new;
    }

    class MethodRefInnerAInner {
      void method() {
        Supply946<MethodRefInnerB> constructorReference = MethodRefInnerB::new;
      }
    }
  }

  class MethodRefInnerB {
    MethodRefInnerB(Issue946 Issue946.this) {}

    void method() {
      Supply946<MethodRefInnerB> constructorReference = MethodRefInnerB::new;
    }
  }

  void method() {
    Supply946<MethodRefInnerB> constructorReference = MethodRefInnerB::new;
  }
}
