8014494: javac crashes when varargs element of a method reference is inferred from the context
authormcimadamore
Fri, 24 May 2013 15:27:27 +0100
changeset 17805 b87d5c2f1df8
parent 17804 6bed8a263318
child 17806 b694bd72f635
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
langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java
langtools/src/share/classes/com/sun/tools/javac/comp/Check.java
langtools/test/tools/javac/lambda/TargetType73.java
--- 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) {  }
+}