// Path: 2016/ifds/testcases/src/test/java/util/SourceAndSink.java
// public static void sink(Object obj) {
// 	System.out.println(obj);
// }
// 
// Path: 2016/ifds/testcases/src/test/java/util/SourceAndSink.java
// public static Object source() {
// 	return new Object();
// }


import static util.SourceAndSink.sink;
import static util.SourceAndSink.source;

package tests;


public class CorrelatedCalls {

	interface A {
		Object foo(Object x);
		Object bar(Object x);
	}
	
	class B implements A {
		@Override
		public Object foo(Object x) {
			return x;
		}

		@Override
		public Object bar(Object x) {
			return null;
		}
	}
	
	class C implements A {
		@Override
		public Object foo(Object x) {
			return null;
		}

		@Override
		public Object bar(Object x) {
			return x;
		}
	}
	
	public static void main(A a) {
		Object x = source();
		x = a.foo(x);
		x = a.bar(x);

// Path: 2016/ifds/testcases/src/test/java/util/SourceAndSink.java
// public static void sink(Object obj) {
// 	System.out.println(obj);
// }
// 
// Path: 2016/ifds/testcases/src/test/java/util/SourceAndSink.java
// public static Object source() {
// 	return new Object();
// }


// Path: 2016/ifds/testcases/src/test/java/tests/CorrelatedCalls.java
import static util.SourceAndSink.sink;
import static util.SourceAndSink.source;

package tests;


public class CorrelatedCalls {

	interface A {
		Object foo(Object x);
		Object bar(Object x);
	}
	
	class B implements A {
		@Override
		public Object foo(Object x) {
			return x;
		}

		@Override
		public Object bar(Object x) {
			return null;
		}
	}
	
	class C implements A {
		@Override
		public Object foo(Object x) {
			return null;
		}

		@Override
		public Object bar(Object x) {
			return x;
		}
	}
	
	public static void main(A a) {
		Object x = source();
		x = a.foo(x);
		x = a.bar(x);

		sink(x);
