diff -r 26d93df3905a -r 2eca84194807 src/share/classes/com/sun/tools/javac/comp/Check.java --- a/src/share/classes/com/sun/tools/javac/comp/Check.java Tue Sep 25 11:53:18 2012 +0100 +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java Tue Sep 25 11:55:34 2012 +0100 @@ -40,6 +40,8 @@ import com.sun.tools.javac.code.Lint.LintCategory; import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.code.Symbol.*; +import com.sun.tools.javac.comp.Infer.InferenceContext; +import com.sun.tools.javac.comp.Infer.InferenceContext.FreeTypeListener; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.ANNOTATION; @@ -429,6 +431,8 @@ * Obtain a warner for this check context */ public Warner checkWarner(DiagnosticPosition pos, Type found, Type req); + + public Infer.InferenceContext inferenceContext(); } /** @@ -455,6 +459,10 @@ public Warner checkWarner(DiagnosticPosition pos, Type found, Type req) { return enclosingContext.checkWarner(pos, found, req); } + + public Infer.InferenceContext inferenceContext() { + return enclosingContext.inferenceContext(); + } } /** @@ -471,6 +479,10 @@ public Warner checkWarner(DiagnosticPosition pos, Type found, Type req) { return convertWarner(pos, found, req); } + + public InferenceContext inferenceContext() { + return infer.emptyContext; + } }; /** Check that a given type is assignable to a given proto-type. @@ -483,7 +495,16 @@ return checkType(pos, found, req, basicHandler); } - Type checkType(final DiagnosticPosition pos, Type found, Type req, CheckContext checkContext) { + Type checkType(final DiagnosticPosition pos, final Type found, final Type req, final CheckContext checkContext) { + final Infer.InferenceContext inferenceContext = checkContext.inferenceContext(); + if (inferenceContext.free(req)) { + inferenceContext.addFreeTypeListener(List.of(req), new FreeTypeListener() { + @Override + public void typesInferred(InferenceContext inferenceContext) { + checkType(pos, found, inferenceContext.asInstType(req, types), checkContext); + } + }); + } if (req.tag == ERROR) return req; if (req.tag == NONE)