// This is a test for the old @ReturnsReceiver annotation, which is inherited.
// No one should ever write that annotation, but Lombok generates it as of version 1.18.10.

import org.checkerframework.checker.builder.qual.ReturnsReceiver;
import org.checkerframework.checker.calledmethods.qual.*;

public class OldInherited {
  @ReturnsReceiver
  OldInherited getThis() {
    return this;
  }

  static class OldInheritedChild extends OldInherited {
    @java.lang.Override
    OldInherited getThis() {
      return this;
    }
  }

  void requiresGetThis(@CalledMethods("getThis") OldInherited this) {}

  public static void testGoodParent() {
    OldInherited o = new OldInherited();
    o.getThis();
    o.requiresGetThis();
  }

  public static void testGoodChild() {
    OldInheritedChild o = new OldInheritedChild();
    o.getThis();
    o.requiresGetThis();
  }

  public static void testBadParent() {
    OldInherited o = new OldInherited();
    // :: error: finalizer.invocation
    o.requiresGetThis();
  }

  public static void testBadChild() {
    OldInheritedChild o = new OldInheritedChild();
    // :: error: finalizer.invocation
    o.requiresGetThis();
  }
}
