--- /dev/null
+public class PR113447 {
+
+ public static void main(String[] args) {
+ PR113447 me = new PR113447();
+ me.method1();
+ me.method3();
+ }
+
+ public void method1(){}
+
+ public void method3(){}
+}
+
+aspect Super {
+
+ // second method doesn't exist
+ pointcut pc1(PR113447 s) :
+ (this(s) && execution(void method1()))
+ || (this(s) && execution(void method2()));
+
+ before(PR113447 s) : pc1(s) {
+ }
+
+ // second method does exist
+ pointcut pc2(PR113447 s) :
+ (this(s) && execution(void method1()))
+ || (this(s) && execution(void method3()));
+
+ before(PR113447 s) : pc2(s) {
+ }
+
+ // second method doesn't exist
+ pointcut pc3(PR113447 s) :
+ (args(s) && execution(void method1()))
+ || (args(s) && execution(void method2()));
+
+ before(PR113447 s) : pc3(s) {
+ }
+
+}
</compile>
</ajc-test>
+ <ajc-test dir="bugs150" title="no verify error with two this pcds">
+ <compile files="PR113447.java">
+ </compile>
+ <run class="PR113447"/>
+ </ajc-test>
+
<!-- ============================================================================ -->
<!-- ============================================================================ -->
if (type instanceof BindingTypePattern) {
BindingTypePattern btp = (BindingTypePattern)type;
// Check if we have already bound something to this formal
- if ((state.get(btp.getFormalIndex())!=null) && (lastMatchedShadowId != shadow.shadowId)){
-// ISourceLocation pcdSloc = getSourceLocation();
-// ISourceLocation shadowSloc = shadow.getSourceLocation();
-// Message errorMessage = new Message(
-// "Cannot use "+(isThis?"this()":"target()")+" to match at this location and bind a formal to type '"+var.getType()+
-// "' - the formal is already bound to type '"+state.get(btp.getFormalIndex()).getType()+"'"+
-// ". The secondary source location points to the problematic "+(isThis?"this()":"target()")+".",
-// shadowSloc,true,new ISourceLocation[]{pcdSloc});
-// shadow.getIWorld().getMessageHandler().handleMessage(errorMessage);
+ Var existingVarInThisSlot = state.get(btp.getFormalIndex());
+
+ if (existingVarInThisSlot != null ) {
+
+ // Is it already bound to exactly the same thing?
+ if (existingVarInThisSlot.equals(var)) return Literal.TRUE;
+
+ // If state.get() returned non-null then someone has already bound the variable in that slot at
+ // the shadow 'shadow.shadowId'. If our 'lastMatchedShadowId' is not the same as 'shadow.shadowId'
+ // then this pointcut wasn't involved in matching and so shouldn't contribute to binding - so just
+ // return Literal.TRUE meaning 'no residue'
+ if (lastMatchedShadowId != shadow.shadowId) return Literal.TRUE;
state.setErroneousVar(btp.getFormalIndex());
- //return null;
}
}
return exposeStateForVar(var, type, state, shadow.getIWorld());