import org.checkerframework.framework.testchecker.util.*;

public class Varargs {
  public void testVarargsInvocation() {
    @Odd String s = null;
    aVarargsMethod(s);
    // :: error: (argument)
    aVarargsMethod(s, "");
    aVarargsMethod(s, s);

    moreVarargs(new @Odd String[1]);
    // The assignment context infers @Odd for the component type.  With invariant array subtyping,
    // this will fail, as the main type is a subtype.
    moreVarargs(new String @Odd [1]);
    // :: warning: (cast.unsafe.constructor.invocation)
    moreVarargs(new @Odd String(), new @Odd String());
    // :: error: (argument)
    // :: warning: (cast.unsafe.constructor.invocation)
    moreVarargs(new String(), new @Odd String());
    moreVarargs(
        // :: error: (argument)
        new String(),
        // :: error: (argument)
        new String());
  }

  /* ------------------------------------------------------------ */

  public void aVarargsMethod(@Odd String s, @Odd String... more) {}

  public void moreVarargs(@Odd String... args) {}

  Varargs(String... args) {}

  void test() {
    new Varargs("m", "n");
    new Varargs();
  }

  void testVarargsConstructor() {
    new ProcessBuilder("hello");
  }
}
