--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Sun May 02 15:55:02 2010 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Mon May 03 17:12:59 2010 -0700
@@ -988,6 +988,13 @@
Env<AttrContext> catchEnv =
env.dup(c, env.info.dup(env.info.scope.dup()));
Type ctype = attribStat(c.param, catchEnv);
+ if (TreeInfo.isMultiCatch(c)) {
+ //check that multi-catch parameter is marked as final
+ if ((c.param.sym.flags() & FINAL) == 0) {
+ log.error(c.param.pos(), "multicatch.param.must.be.final", c.param.sym);
+ }
+ c.param.sym.flags_field = c.param.sym.flags() | DISJOINT;
+ }
if (c.param.type.tsym.kind == Kinds.VAR) {
c.param.sym.setData(ElementKind.EXCEPTION_PARAMETER);
}
@@ -2735,6 +2742,11 @@
result = check(tree, owntype, TYP, pkind, pt);
}
+ public void visitTypeDisjoint(JCTypeDisjoint tree) {
+ List<Type> componentTypes = attribTypes(tree.components, env);
+ tree.type = result = check(tree, types.lub(componentTypes), TYP, pkind, pt);
+ }
+
public void visitTypeParameter(JCTypeParameter tree) {
TypeVar a = (TypeVar)tree.type;
Set<Type> boundSet = new HashSet<Type>();