# HG changeset patch # User mcimadamore # Date 1289565232 0 # Node ID 8dd5f907461e30081059849d3e3339799de749cb # Parent 889e80aa1d2ed90bac152eb6a5b39b740f114a12 6999067: cast for invokeExact call gets redundant cast to warnings Summary: Xlint:cast should not report cast used in order to specify target type in polymorphic signature calls Reviewed-by: jjg diff -r 889e80aa1d2e -r 8dd5f907461e langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Fri Nov 12 12:32:43 2010 +0000 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Fri Nov 12 12:33:52 2010 +0000 @@ -1371,11 +1371,24 @@ if (!tree.type.isErroneous() && lint.isEnabled(Lint.LintCategory.CAST) && types.isSameType(tree.expr.type, tree.clazz.type) - && !(ignoreAnnotatedCasts && containsTypeAnnotation(tree.clazz))) { + && !(ignoreAnnotatedCasts && containsTypeAnnotation(tree.clazz)) + && !is292targetTypeCast(tree)) { log.warning(Lint.LintCategory.CAST, tree.pos(), "redundant.cast", tree.expr.type); } } + //where + private boolean is292targetTypeCast(JCTypeCast tree) { + boolean is292targetTypeCast = false; + if (tree.expr.getTag() == JCTree.APPLY) { + JCMethodInvocation apply = (JCMethodInvocation)tree.expr; + Symbol sym = TreeInfo.symbol(apply.meth); + is292targetTypeCast = sym != null && + sym.kind == MTH && + (sym.flags() & POLYMORPHIC_SIGNATURE) != 0; + } + return is292targetTypeCast; + } public void visitTopLevel(JCCompilationUnit tree) { // Do nothing for TopLevel since each class is visited individually diff -r 889e80aa1d2e -r 8dd5f907461e langtools/test/tools/javac/meth/XlintWarn.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/meth/XlintWarn.java Fri Nov 12 12:33:52 2010 +0000 @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6999067 + * @summary cast for invokeExact call gets redundant cast to warnings + * @author mcimadamore + * + * @compile -Werror -Xlint:cast XlintWarn.java + */ + +import java.dyn.*; + +class XlintWarn { + void test(MethodHandle mh) throws Throwable { + int i1 = (int)mh.invoke(); + int i2 = (int)mh.invokeExact(); + int i3 = (int)mh.invokeVarargs(); + int i4 = (int)InvokeDynamic.test(); + } +}