// tests that the Must Call checker respects the Owning and NotOwning annotations on return values.

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

class BorrowOnReturn {
  @MustCall("a") class Foo {
    void a() {}
  }

  @Owning
  Object getOwnedFoo() {
    // :: error: return
    return new Foo();
  }

  Object getNoAnnoFoo() {
    // Treat as owning, so warn
    // :: error: return
    return new Foo();
  }

  @NotOwning
  Object getNotOwningFooWrong() {
    // :: error: return
    return new Foo();
  }

  Object getNotOwningFooRightButNoNotOwningAnno() {
    Foo f = new Foo();
    f.a();
    // This is still an error for now, because it's treated as an owning pointer. TODO: fix this
    // kind of FP?
    // :: error: return
    return f;
  }

  @NotOwning
  Object getNotOwningFooRight() {
    Foo f = new Foo();
    f.a();
    // :: error: return
    return f;
  }

  @MustCall("a") Object getNotOwningFooRight2() {
    return new Foo();
  }
}
