1.1 --- a/src/share/classes/com/sun/tools/javac/comp/Infer.java Wed Oct 13 17:52:29 2010 -0700 1.2 +++ b/src/share/classes/com/sun/tools/javac/comp/Infer.java Mon Oct 18 19:14:36 2010 +0100 1.3 @@ -553,12 +553,24 @@ 1.4 //the enclosing tree E, as follows: if E is a cast, then use the 1.5 //target type of the cast expression as a return type; if E is an 1.6 //expression statement, the return type is 'void' - otherwise the 1.7 - //return type is simply 'Object'. 1.8 - switch (env.outer.tree.getTag()) { 1.9 + //return type is simply 'Object'. A correctness check ensures that 1.10 + //env.next refers to the lexically enclosing environment in which 1.11 + //the polymorphic signature call environment is nested. 1.12 + 1.13 + switch (env.next.tree.getTag()) { 1.14 case JCTree.TYPECAST: 1.15 - restype = ((JCTypeCast)env.outer.tree).clazz.type; break; 1.16 + JCTypeCast castTree = (JCTypeCast)env.next.tree; 1.17 + restype = (castTree.expr == env.tree) ? 1.18 + castTree.clazz.type : 1.19 + syms.objectType; 1.20 + break; 1.21 case JCTree.EXEC: 1.22 - restype = syms.voidType; break; 1.23 + JCTree.JCExpressionStatement execTree = 1.24 + (JCTree.JCExpressionStatement)env.next.tree; 1.25 + restype = (execTree.expr == env.tree) ? 1.26 + syms.voidType : 1.27 + syms.objectType; 1.28 + break; 1.29 default: 1.30 restype = syms.objectType; 1.31 }