diff -r e701af23a095 -r 9851071b551a src/share/classes/com/sun/tools/javac/comp/Infer.java --- a/src/share/classes/com/sun/tools/javac/comp/Infer.java Tue Jun 18 18:57:52 2013 +0100 +++ b/src/share/classes/com/sun/tools/javac/comp/Infer.java Tue Jun 18 19:02:48 2013 +0100 @@ -952,8 +952,9 @@ Type solve(UndetVar uv, InferenceContext inferenceContext) { Infer infer = inferenceContext.infer(); List lobounds = filterBounds(uv, inferenceContext); - Type owntype = infer.types.lub(lobounds); - if (owntype.hasTag(ERROR)) { + //note: lobounds should have at least one element + Type owntype = lobounds.tail.tail == null ? lobounds.head : infer.types.lub(lobounds); + if (owntype.isPrimitive() || owntype.hasTag(ERROR)) { throw infer.inferenceException .setMessage("no.unique.minimal.instance.exists", uv.qtype, lobounds); @@ -971,8 +972,9 @@ Type solve(UndetVar uv, InferenceContext inferenceContext) { Infer infer = inferenceContext.infer(); List hibounds = filterBounds(uv, inferenceContext); - Type owntype = infer.types.glb(hibounds); - if (owntype.isErroneous()) { + //note: lobounds should have at least one element + Type owntype = hibounds.tail.tail == null ? hibounds.head : infer.types.glb(hibounds); + if (owntype.isPrimitive() || owntype.hasTag(ERROR)) { throw infer.inferenceException .setMessage("no.unique.maximal.instance.exists", uv.qtype, hibounds); @@ -1100,10 +1102,11 @@ } } //no progress - throw inferenceException; + throw inferenceException.setMessage(); } } catch (InferenceException ex) { + //did we fail because of interdependent ivars? inferenceContext.rollback(); instantiateAsUninferredVars(varsToSolve, inferenceContext); checkWithinBounds(inferenceContext, warn);