--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Tue Mar 29 16:40:51 2011 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Tue Mar 29 16:41:18 2011 +0100
@@ -1089,6 +1089,10 @@
if (resource.getTag() == JCTree.VARDEF) {
attribStat(resource, tryEnv);
chk.checkType(resource, resource.type, syms.autoCloseableType, "try.not.applicable.to.type");
+
+ //check that resource type cannot throw InterruptedException
+ checkAutoCloseable(resource.pos(), localEnv, resource.type);
+
VarSymbol var = (VarSymbol)TreeInfo.symbolFor(resource);
var.setData(ElementKind.RESOURCE_VARIABLE);
} else {
@@ -1127,6 +1131,35 @@
result = null;
}
+ void checkAutoCloseable(DiagnosticPosition pos, Env<AttrContext> env, Type resource) {
+ if (!resource.isErroneous() &&
+ types.asSuper(resource, syms.autoCloseableType.tsym) != null) {
+ Symbol close = syms.noSymbol;
+ boolean prevDeferDiags = log.deferDiagnostics;
+ Queue<JCDiagnostic> prevDeferredDiags = log.deferredDiagnostics;
+ try {
+ log.deferDiagnostics = true;
+ log.deferredDiagnostics = ListBuffer.lb();
+ close = rs.resolveQualifiedMethod(pos,
+ env,
+ resource,
+ names.close,
+ List.<Type>nil(),
+ List.<Type>nil());
+ }
+ finally {
+ log.deferDiagnostics = prevDeferDiags;
+ log.deferredDiagnostics = prevDeferredDiags;
+ }
+ if (close.kind == MTH &&
+ close.overrides(syms.autoCloseableClose, resource.tsym, types, true) &&
+ chk.isHandled(syms.interruptedExceptionType, types.memberType(resource, close).getThrownTypes()) &&
+ env.info.lint.isEnabled(LintCategory.TRY)) {
+ log.warning(LintCategory.TRY, pos, "try.resource.throws.interrupted.exc", resource);
+ }
+ }
+ }
+
public void visitConditional(JCConditional tree) {
attribExpr(tree.cond, env, syms.booleanType);
attribExpr(tree.truepart, env);
@@ -3169,6 +3202,9 @@
// method conform to the method they implement.
chk.checkImplementations(tree);
+ //check that a resource implementing AutoCloseable cannot throw InterruptedException
+ checkAutoCloseable(tree.pos(), env, c.type);
+
for (List<JCTree> l = tree.defs; l.nonEmpty(); l = l.tail) {
// Attribute declaration
attribStat(l.head, env);