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

public class Values {

  void test() {
    Object o = get();
    Object o1 = get1();
    Object o2 = get2();
    foo1(o1);
    foo2(o2);

    // :: error: (argument)
    foo1(o);
    // :: error: (argument)
    foo2(o1);
    // :: error: (argument)
    foo1(o2);
    // :: error: (argument)
    foo(o2);

    o1 = o2;
    foo2(o1);
    // :: error: (argument)
    foo1(o1);

    o2 = get1();
    foo1(o2);
    // :: error: (argument)
    foo2(o2);
  }

  void andlubTest(Collection<Object> c) {
    for (Object obj : c) {
      Object o = get1();
    }
  }

  void orlubTest(boolean b1, boolean b2) {
    if (b1) {
      Object o = get1();
      return;
    } else if (b2) {
      Object o = get2();
      return;
    }
  }

  void foo(@Value Object o) {}

  void foo1(@Value(1) Object o) {}

  void foo2(@Value(2) Object o) {}

  @SuppressWarnings("flowtest:return")
  @Value Object get() {
    return null;
  }

  @SuppressWarnings("flowtest:return")
  @Value(1) Object get1() {
    return null;
  }

  @SuppressWarnings("flowtest:return")
  @Value(2) Object get2() {
    return null;
  }
}
