diff --git a/src/share/classes/com/sun/tools/javac/comp/Check.java b/src/share/classes/com/sun/tools/javac/comp/Check.java index 76440d0b7d1214e8f8ff04f83766bc4d679c8bfa..da991f57185b86f49c68589be0f3e2214e0be64b 100644 --- a/src/share/classes/com/sun/tools/javac/comp/Check.java +++ b/src/share/classes/com/sun/tools/javac/comp/Check.java @@ -897,7 +897,8 @@ public class Check { assertConvertible(arg, arg.type, varArg, warn); args = args.tail; } - } else if ((sym.flags() & VARARGS) != 0 && allowVarargs) { + } else if ((sym.flags() & (VARARGS | SIGNATURE_POLYMORPHIC)) == VARARGS && + allowVarargs) { // non-varargs call to varargs method Type varParam = owntype.getParameterTypes().last(); Type lastArg = argtypes.last(); diff --git a/test/tools/javac/meth/VarargsWarn.java b/test/tools/javac/meth/VarargsWarn.java new file mode 100644 index 0000000000000000000000000000000000000000..476617b4eddb83bf20d3659ae51d350c964ac8c3 --- /dev/null +++ b/test/tools/javac/meth/VarargsWarn.java @@ -0,0 +1,17 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8019340 + * @summary varargs-related warnings are meaningless on signature-polymorphic methods such as MethodHandle.invokeExact + * + * @compile/fail/ref=VarargsWarn.out -XDrawDiagnostics -Werror VarargsWarn.java + */ + +import java.lang.invoke.*; + +class VarargsWarn { + void test(MethodHandle mh) throws Throwable { + mh.invokeExact((Integer[])null); + mh.invoke((Integer[])null); + mh.invokeWithArguments((Integer[])null); //not a sig poly method - warning here! + } +} diff --git a/test/tools/javac/meth/VarargsWarn.out b/test/tools/javac/meth/VarargsWarn.out new file mode 100644 index 0000000000000000000000000000000000000000..13decfad07dae5914af26d3f93141d058dd9f5f4 --- /dev/null +++ b/test/tools/javac/meth/VarargsWarn.out @@ -0,0 +1,4 @@ +VarargsWarn.java:15:32: compiler.warn.inexact.non-varargs.call: java.lang.Object, java.lang.Object[] +- compiler.err.warnings.and.werror +1 error +1 warning