--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Fri Aug 08 17:38:20 2008 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Fri Aug 08 17:43:24 2008 +0100
@@ -730,9 +730,8 @@
// In order to catch self-references, we set the variable's
// declaration position to maximal possible value, effectively
// marking the variable as undefined.
- v.pos = Position.MAXPOS;
+ initEnv.info.enclVar = v;
attribExpr(tree.init, initEnv, v.type);
- v.pos = tree.pos;
}
}
result = tree.type = v.type;
@@ -2198,18 +2197,19 @@
// This check applies only to class and instance
// variables. Local variables follow different scope rules,
// and are subject to definite assignment checking.
- if (v.pos > tree.pos &&
+ if ((env.info.enclVar == v || v.pos > tree.pos) &&
v.owner.kind == TYP &&
canOwnInitializer(env.info.scope.owner) &&
v.owner == env.info.scope.owner.enclClass() &&
((v.flags() & STATIC) != 0) == Resolve.isStatic(env) &&
(env.tree.getTag() != JCTree.ASSIGN ||
TreeInfo.skipParens(((JCAssign) env.tree).lhs) != tree)) {
-
+ String suffix = (env.info.enclVar == v) ?
+ "self.ref" : "forward.ref";
if (!onlyWarning || isStaticEnumField(v)) {
- log.error(tree.pos(), "illegal.forward.ref");
+ log.error(tree.pos(), "illegal." + suffix);
} else if (useBeforeDeclarationWarning) {
- log.warning(tree.pos(), "forward.ref", v);
+ log.warning(tree.pos(), suffix, v);
}
}