abstract aspect GenericAbstractAspect<T>{ abstract protected pointcut pc(); before() : pc() {} } aspect Concrete extends GenericAbstractAspect<Concrete> { // should get circular dependency error message from this protected pointcut pc() : pc(); } aspect Concrete2 extends GenericAbstractAspect<Concrete2> { // this should compile as expected protected pointcut pc() : p1(); pointcut p1() : call(void Concrete2.foo(..)); } aspect Concrete3 extends GenericAbstractAspect<Concrete3> { // should get circular dependency error message from this protected pointcut pc() : pc1(); pointcut pc1() : pc2(); pointcut pc2() : pc(); }