import org.aspectj.testing.Tester;
import org.aspectj.testing.Tester; 

public class CflowAlone {
    public static void main(String[] args){
        new testclass1(); 
        Tester.check(0 < Filteraspect.i, 
                     "0 < Filteraspect.i: " + Filteraspect.i);
    }
}
class testclass1 {}
class testclass2 {}
aspect Filteraspect {
    static int i;
    // all these variants fail
    //pointcut goCut(): cflow(this(testclass2));
    //pointcut goCut(): cflow(target(testclass2));
    //pointcut goCut(): cflow(args(testclass2));
    //pointcut goCut(): cflow(!within(FilterAspect));
    //pointcut goCut(): cflow(within(FilterAspect));
    //pointcut goCut(): cflow(within(testclass1));
    pointcut goCut(): !within(Filteraspect) && cflow(within(testclass1)) 
    		&& !preinitialization(new(..)) && !initialization(new(..));
    // works ok
    //pointcut goCut(): within(Filteraspect);
    Object around(): goCut() { i++; return proceed(); }
    // no bug when using before or after
    //after(): goCut() { int i = 1; System.getProperties().put("foo", "bar");}
}