title="Polymorphic ITD fails in CVS HEAD (From ajdt 1.1.6)">
<compile files="OverloadedITDNPE.java" />
</ajc-test>
+
+ <ajc-test dir="bugs" pr="51320"
+ title="ClasscastException on concretization of if(false)">
+ <compile files="DecwClassCastException.java">
+
+ <!-- These are the illegal PCDs against a deow -->
+ <message kind="error" line="27" text="if() pointcut designator cannot be used"/>
+ <message kind="error" line="29" text="if() pointcut designator cannot be used"/>
+
+ <message kind="error" line="31" text="cflow() pointcut designator cannot be used"/>
+ <message kind="error" line="33" text="cflow() pointcut designator cannot be used"/>
+
+ <message kind="error" line="35" text="cflowbelow() pointcut designator cannot be used"/>
+ <message kind="error" line="37" text="cflowbelow() pointcut designator cannot be used"/>
+
+ <message kind="error" line="39" text="this() pointcut designator cannot be used"/>
+ <message kind="error" line="41" text="this() pointcut designator cannot be used"/>
+
+ <message kind="error" line="43" text="target() pointcut designator cannot be used"/>
+ <message kind="error" line="45" text="target() pointcut designator cannot be used"/>
+
+ <message kind="error" line="47" text="args() pointcut designator cannot be used"/>
+ <message kind="error" line="49" text="args() pointcut designator cannot be used"/>
+
+ </compile>
+ </ajc-test>
</suite>
--- /dev/null
+/*
+ * From:
+ *
+ * http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/aspectj-home/doc/progguide/semantics-declare.html#d0e6499
+ *
+ * Pointcuts that appear inside of declare forms have certain restrictions.
+ * Like other pointcuts, these pick out join points, but they do so in a
+ * way that is statically determinable.
+ *
+ * Consequently, such pointcuts may not include, directly or indirectly
+ * (through user-defined pointcut declarations) pointcuts that discriminate
+ * based on dynamic (runtime) context. Therefore, such pointcuts may not be
+ * defined in terms of
+ *
+ * cflow
+ * cflowbelow
+ * this
+ * target
+ * args
+ * if
+ *
+ * all of which can discriminate on runtime information.
+ */
+
+public aspect DecwClassCastException {
+
+ declare warning : if(true) : "if(true) directly against checker";
+ pointcut p(): if(false);
+ declare warning : p() : "if(false) through defined pointcut";
+
+ declare error : cflow(execution(* main(..))): "cflow(execution(* main(..))) directly against checker";
+ pointcut p2(): cflow(execution(* main(..)));
+ declare error : p2() : "cflow(execution(* main(..))) through defined pointcut";
+
+ declare warning : cflowbelow(execution(* main(..))): "cflowbelow(execution(* main(..))) directly against checker";
+ pointcut p3(): cflowbelow(execution(* main(..)));
+ declare error : p3() : "cflowbelow(execution(* main(..))) through defined pointcut";
+
+ declare warning : this(Object): "this(Object) directly against checker";
+ pointcut p4(): this(Object);
+ declare warning : p4(): "this(Object) through defined pointcut";
+
+ declare warning : target(Object): "target(Object) directly against checker";
+ pointcut p5(): target(Object);
+ declare warning : p5(): "target(Object) through defined pointcut";
+
+ declare warning : args(Object): "args(Object) directly against checker";
+ pointcut p6(): args(Object);
+ declare warning : p6(): "args(Object) through defined pointcut";
+
+
+ public static void main(String[] args) {
+ System.err.println("In main!");
+ }
+
+}
\ No newline at end of file
import org.aspectj.bridge.IMessage;
import org.aspectj.util.FuzzyBoolean;
import org.aspectj.weaver.BetaException;
+import org.aspectj.weaver.Checker;
import org.aspectj.weaver.ISourceContext;
import org.aspectj.weaver.IntMap;
import org.aspectj.weaver.ResolvedTypeX;
public Pointcut concretize1(ResolvedTypeX inAspect, IntMap bindings) {
+ if (bindings.getEnclosingAdvice() instanceof Checker) {
+ // Enforce rule about which designators are supported in deow
+ inAspect.getWorld().showMessage(IMessage.ERROR,
+ "args() pointcut designator cannot be used in declare statement",
+ bindings.getEnclosingAdvice().getSourceLocation(), null);
+ return Pointcut.makeMatchesNothing(Pointcut.CONCRETE);
+ }
TypePatternList args = arguments.resolveReferences(bindings);
if (inAspect.crosscuttingMembers != null) {
inAspect.crosscuttingMembers.exposeTypes(args.getExactTypes());
import java.util.Collection;
import java.util.List;
+import org.aspectj.bridge.IMessage;
import org.aspectj.util.FileUtil;
import org.aspectj.util.FuzzyBoolean;
import org.aspectj.weaver.Advice;
+import org.aspectj.weaver.Checker;
import org.aspectj.weaver.CrosscuttingMembers;
import org.aspectj.weaver.ISourceContext;
import org.aspectj.weaver.IntMap;
public Pointcut concretize1(ResolvedTypeX inAspect, IntMap bindings) {
+ if (bindings.getEnclosingAdvice() instanceof Checker) {
+ // Enforce rule about which designators are supported in deow
+ inAspect.getWorld().showMessage(IMessage.ERROR,
+ "cflow"+(isBelow?"below":"")+"() pointcut designator cannot be used in declare statement",
+ bindings.getEnclosingAdvice().getSourceLocation(), null);
+ return Pointcut.makeMatchesNothing(Pointcut.CONCRETE);
+ }
//make this remap from formal positions to arrayIndices
IntMap entryBindings = new IntMap();
for (int i=0, len=freeVars.length; i < len; i++) {
import org.aspectj.bridge.IMessage;
import org.aspectj.util.FuzzyBoolean;
import org.aspectj.weaver.Advice;
+import org.aspectj.weaver.Checker;
import org.aspectj.weaver.ISourceContext;
import org.aspectj.weaver.IntMap;
import org.aspectj.weaver.ResolvedMember;
private IfPointcut partiallyConcretized = null;
public Pointcut concretize1(ResolvedTypeX inAspect, IntMap bindings) {
//System.err.println("concretize: " + this + " already: " + partiallyConcretized);
+
+ if (bindings.getEnclosingAdvice() instanceof Checker) {
+ // Enforce rule about which designators are supported in deow
+ inAspect.getWorld().showMessage(IMessage.ERROR,
+ "if() pointcut designator cannot be used in declare statement",
+ bindings.getEnclosingAdvice().getSourceLocation(),
+ null);
+ return Pointcut.makeMatchesNothing(Pointcut.CONCRETE);
+ }
+
if (partiallyConcretized != null) {
return partiallyConcretized;
}
partiallyConcretized = ret;
if (bindings.directlyInAdvice()) {
ShadowMunger advice = bindings.getEnclosingAdvice();
- ret.baseArgsCount = ((Advice)advice).getBaseParameterCount();
+ if (advice instanceof Advice) {
+ ret.baseArgsCount = ((Advice)advice).getBaseParameterCount();
+ } else {
+ ret.baseArgsCount = 0;
+ }
ret.residueSource = advice.getPointcut().concretize(inAspect, ret.baseArgsCount, advice);
} else {
ResolvedPointcutDefinition def = bindings.peekEnclosingDefinitition();
import java.io.DataOutputStream;
import java.io.IOException;
+import org.aspectj.bridge.IMessage;
import org.aspectj.util.FuzzyBoolean;
+import org.aspectj.weaver.Checker;
import org.aspectj.weaver.ISourceContext;
import org.aspectj.weaver.IntMap;
import org.aspectj.weaver.ResolvedTypeX;
}
public Pointcut concretize1(ResolvedTypeX inAspect, IntMap bindings) {
+ if (bindings.getEnclosingAdvice() instanceof Checker) {
+ // Enforce rule about which designators are supported in deow
+ inAspect.getWorld().showMessage(IMessage.ERROR,
+ (isThis?"this":"target")+"() pointcut designator cannot be used in declare statement",
+ bindings.getEnclosingAdvice().getSourceLocation(), null);
+ return Pointcut.makeMatchesNothing(Pointcut.CONCRETE);
+ }
+
TypePattern newType = type.remapAdviceFormals(bindings);
if (inAspect.crosscuttingMembers != null) {
inAspect.crosscuttingMembers.exposeType(newType.getExactType());