import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import org.checkerframework.framework.testchecker.util.*;

@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@interface OddInt {
  @Odd int value();
}

@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@interface OddIntArr {
  @Odd int[] value();
}

@interface OddRec {
  OddIntArr[] value();
}

class Const {
  @SuppressWarnings("evenodd")
  public static final @Odd int ok1 = 5;

  @SuppressWarnings("evenodd")
  public static final @Odd int ok2 = 5;

  public static final int notodd = 4;
}

class Uses {
  @OddInt(Const.ok1)
  Object good1;

  // :: error: (annotation)
  @OddInt(4)
  Object bad1;

  // :: error: (annotation)
  @OddInt(Const.notodd)
  Object bad2;

  @OddIntArr(Const.ok1)
  Object good2;

  @OddIntArr({Const.ok1, Const.ok2})
  Object good3;

  // :: error: (annotation)
  @OddIntArr(4)
  Object bada1;

  // :: error: (annotation)
  @OddIntArr({Const.ok1, 4})
  Object bada2;

  @OddRec(@OddIntArr({Const.ok1, Const.ok2}))
  void goodrec1() {}

  @OddRec({@OddIntArr({Const.ok1, Const.ok2}), @OddIntArr({Const.ok1, Const.ok2})})
  void goodrec2() {}

  // :: error: (annotation)
  @OddRec(@OddIntArr({Const.ok1, 4}))
  void badrec1() {}

  // :: error: (annotation)
  @OddRec({@OddIntArr({Const.ok1, Const.ok2}), @OddIntArr({3, Const.ok2})})
  void badrec2() {}
}
