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

/*
 * See Issue 137:
 * https://github.com/typetools/checker-framework/issues/137
 */
public class GenericTest7 {
  interface A {}

  interface B<T> {}

  interface C<U> {}

  public <I extends B<A> & C<A>> void one(I i) {
    B<A> i1 = i;
    C<A> i2 = i;
  }

  public <I extends B<A> & C<A>> void oneA(I i) {
    // :: error: (assignment)
    @Odd B<A> i1 = i;
    // :: error: (assignment)
    @Odd C<A> i2 = i;
  }

  public <I extends @Odd B<A> & @Odd C<A>> void oneB(I i) {
    @Odd B<A> i1 = i;
    @Odd C<A> i2 = i;
  }

  public <I extends B<? extends A> & C<? extends A>> void two(I i) {
    B<? extends A> i1 = i;
    C<? extends A> i2 = i;
  }

  public <I extends B<? extends A> & C<? extends A>> void twoA(I i) {
    // :: error: (assignment)
    @Odd B<? extends A> i1 = i;
    // :: error: (assignment)
    @Odd C<? extends A> i2 = i;
  }

  public <I extends @Odd B<? extends A> & @Odd C<? extends A>> void twoB(I i) {
    @Odd B<? extends A> i1 = i;
    @Odd C<? extends A> i2 = i;
  }

  public <I extends B<? extends @Odd A> & C<? extends @Odd A>> void twoC(I i) {
    B<? extends A> i1 = i;
    C<? extends A> i2 = i;
    B<? extends @Odd A> i3 = i;
    C<? extends @Odd A> i4 = i;
  }
}
