8014494: javac crashes when varargs element of a method reference is inferred from the context
Summary: varargs element is not refreshed after type-inference
Reviewed-by: jjg, vromero
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Fri May 24 15:27:12 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Fri May 24 15:27:27 2013 +0100
@@ -3732,7 +3732,7 @@
noteWarner);
return chk.checkMethod(owntype, sym, env, argtrees, argtypes, env.info.lastResolveVarargs(),
- noteWarner.hasNonSilentLint(LintCategory.UNCHECKED));
+ noteWarner.hasNonSilentLint(LintCategory.UNCHECKED), resultInfo.checkContext.inferenceContext());
} catch (Infer.InferenceException ex) {
//invalid target type - propagate exception outwards or report error
//depending on the current check context
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Fri May 24 15:27:12 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Fri May 24 15:27:27 2013 +0100
@@ -853,7 +853,8 @@
final List<JCExpression> argtrees,
List<Type> argtypes,
boolean useVarargs,
- boolean unchecked) {
+ boolean unchecked,
+ InferenceContext inferenceContext) {
// System.out.println("call : " + env.tree);
// System.out.println("method : " + owntype);
// System.out.println("actuals: " + argtypes);
@@ -917,7 +918,7 @@
argtype);
}
if (!((MethodSymbol)sym.baseSymbol()).isSignaturePolymorphic(types)) {
- TreeInfo.setVarargsElement(env.tree, types.elemtype(argtype));
+ setVarargsElement(env, types.elemtype(argtype), inferenceContext);
}
}
PolyKind pkind = (sym.type.hasTag(FORALL) &&
@@ -927,6 +928,17 @@
return owntype;
}
//where
+ private void setVarargsElement(final Env<AttrContext> env, final Type elemtype, InferenceContext inferenceContext) {
+ if (inferenceContext.free(elemtype)) {
+ inferenceContext.addFreeTypeListener(List.of(elemtype), new FreeTypeListener() {
+ public void typesInferred(InferenceContext inferenceContext) {
+ setVarargsElement(env, inferenceContext.asInstType(elemtype), inferenceContext);
+ }
+ });
+ }
+ TreeInfo.setVarargsElement(env.tree, elemtype);
+ }
+
private void assertConvertible(JCTree tree, Type actual, Type formal, Warner warn) {
if (types.isConvertible(actual, formal, warn))
return;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/TargetType73.java Fri May 24 15:27:27 2013 +0100
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2013, 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 8014494
+ * @summary javac crashes when varargs element of a method reference is inferred from the context
+ * @compile TargetType73.java
+ */
+import java.util.List;
+
+class TargetType73 {
+
+ interface Function<X,Y> {
+ Y m(X x);
+ }
+
+ static void test() {
+ m(TargetType73::g);
+ }
+
+ public static <T> List<T> g(T... a) {
+ return null;
+ }
+
+ public static <C> void m(Function<String, C> zipper) { }
+}