diff -r be443002e970 -r b61e5f801f7c src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java --- a/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Tue Jan 22 16:23:35 2013 +0000 +++ b/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Tue Jan 22 16:39:51 2013 +0000 @@ -859,8 +859,8 @@ finally { frameStack = prevStack; } - if (frameStack.nonEmpty() && enclosingLambda() != null) { - // Any class defined within a lambda is an implicit 'this' reference + if (!tree.sym.isStatic() && frameStack.nonEmpty() && enclosingLambda() != null) { + // Any (non-static) class defined within a lambda is an implicit 'this' reference // because its constructor will reference the enclosing class ((LambdaTranslationContext) context()).addSymbol(tree.sym.type.getEnclosingType().tsym, CAPTURED_THIS); } @@ -994,6 +994,11 @@ * (required to skip synthetic lambda symbols) */ private Symbol owner() { + return owner(false); + } + + @SuppressWarnings("fallthrough") + private Symbol owner(boolean skipLambda) { List frameStack2 = frameStack; while (frameStack2.nonEmpty()) { switch (frameStack2.head.tree.getTag()) { @@ -1012,7 +1017,8 @@ case METHODDEF: return ((JCMethodDecl)frameStack2.head.tree).sym; case LAMBDA: - return ((LambdaTranslationContext)contextMap.get(frameStack2.head.tree)).translatedSym; + if (!skipLambda) + return ((LambdaTranslationContext)contextMap.get(frameStack2.head.tree)).translatedSym; default: frameStack2 = frameStack2.tail; } @@ -1311,8 +1317,9 @@ } Type enclosingType() { - //local inner classes defined inside a lambda are always non-static - return owner.enclClass().type; + return owner.isStatic() ? + Type.noType : + owner.enclClass().type; } Type generatedLambdaSig() {