--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Thu Jun 28 17:49:13 2018 -0700
+++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Fri Jun 29 10:41:10 2018 +0200
@@ -586,8 +586,11 @@
class RecoveryInfo extends ResultInfo {
public RecoveryInfo(final DeferredAttr.DeferredAttrContext deferredAttrContext) {
- super(KindSelector.VAL, Type.recoveryType,
- new Check.NestedCheckContext(chk.basicHandler) {
+ this(deferredAttrContext, Type.recoveryType);
+ }
+
+ public RecoveryInfo(final DeferredAttr.DeferredAttrContext deferredAttrContext, Type pt) {
+ super(KindSelector.VAL, pt, new Check.NestedCheckContext(chk.basicHandler) {
@Override
public DeferredAttr.DeferredAttrContext deferredAttrContext() {
return deferredAttrContext;
@@ -598,7 +601,9 @@
}
@Override
public void report(DiagnosticPosition pos, JCDiagnostic details) {
- chk.basicHandler.report(pos, details);
+ if (pt == Type.recoveryType) {
+ chk.basicHandler.report(pos, details);
+ }
}
});
}
@@ -656,7 +661,7 @@
}
if (tree == breakTree &&
resultInfo.checkContext.deferredAttrContext().mode == AttrMode.CHECK) {
- throw new BreakAttr(copyEnv(env));
+ breakTreeFound(copyEnv(env));
}
return result;
} catch (CompletionFailure ex) {
@@ -668,6 +673,10 @@
}
}
+ protected void breakTreeFound(Env<AttrContext> env) {
+ throw new BreakAttr(env);
+ }
+
Env<AttrContext> copyEnv(Env<AttrContext> env) {
Env<AttrContext> newEnv =
env.dup(env.tree, env.info.dup(copyScope(env.info.scope)));
@@ -2506,8 +2515,7 @@
//lambda only allowed in assignment or method invocation/cast context
log.error(that.pos(), Errors.UnexpectedLambda);
}
- result = that.type = types.createErrorType(pt());
- return;
+ resultInfo = recoveryInfo;
}
//create an environment for attribution of the lambda expression
final Env<AttrContext> localEnv = lambdaEnv(that, env);
@@ -2595,6 +2603,10 @@
attribTree(that.getBody(), localEnv, bodyResultInfo);
} else {
JCBlock body = (JCBlock)that.body;
+ if (body == breakTree &&
+ resultInfo.checkContext.deferredAttrContext().mode == AttrMode.CHECK) {
+ breakTreeFound(copyEnv(localEnv));
+ }
attribStats(body.stats, localEnv);
}
@@ -4126,8 +4138,8 @@
typeargtypes,
noteWarner);
- DeferredAttr.DeferredTypeMap checkDeferredMap =
- deferredAttr.new DeferredTypeMap(DeferredAttr.AttrMode.CHECK, sym, env.info.pendingResolutionPhase);
+ DeferredAttr.DeferredTypeMap<Void> checkDeferredMap =
+ deferredAttr.new DeferredTypeMap<>(DeferredAttr.AttrMode.CHECK, sym, env.info.pendingResolutionPhase);
argtypes = argtypes.map(checkDeferredMap);