# HG changeset patch # User mcimadamore # Date 1290510523 0 # Node ID 2536dedd897ef0f34cdb0596f0aaf7184cc54cc0 # Parent 03177f49411d82218235f16eb50e171f4ca1a6fa 6995200: JDK 7 compiler crashes when type-variable is inferred from expected primitive type Summary: 15.12.2.8 should use boxing when expected type in assignment context is a primitive type Reviewed-by: jjg diff -r 03177f49411d -r 2536dedd897e src/share/classes/com/sun/tools/javac/code/Types.java --- a/src/share/classes/com/sun/tools/javac/code/Types.java Thu Nov 18 16:13:11 2010 -0800 +++ b/src/share/classes/com/sun/tools/javac/code/Types.java Tue Nov 23 11:08:43 2010 +0000 @@ -2772,6 +2772,8 @@ public Type glb(Type t, Type s) { if (s == null) return t; + else if (t.isPrimitive() || s.isPrimitive()) + return syms.errType; else if (isSubtypeNoCapture(t, s)) return t; else if (isSubtypeNoCapture(s, t)) @@ -2928,6 +2930,15 @@ } /** + * Return the boxed type if 't' is primitive, otherwise return 't' itself. + */ + public Type boxedTypeOrType(Type t) { + return t.isPrimitive() ? + boxedClass(t).type : + t; + } + + /** * Return the primitive type corresponding to a boxed type. */ public Type unboxedType(Type t) { diff -r 03177f49411d -r 2536dedd897e src/share/classes/com/sun/tools/javac/comp/Infer.java --- a/src/share/classes/com/sun/tools/javac/comp/Infer.java Thu Nov 18 16:13:11 2010 -0800 +++ b/src/share/classes/com/sun/tools/javac/comp/Infer.java Tue Nov 23 11:08:43 2010 +0000 @@ -305,7 +305,8 @@ uv.hibounds = hibounds.toList(); } Type qtype1 = types.subst(that.qtype, that.tvars, undetvars); - if (!types.isSubtype(qtype1, to)) { + if (!types.isSubtype(qtype1, + qtype1.tag == UNDETVAR ? types.boxedTypeOrType(to) : to)) { throw unambiguousNoInstanceException .setMessage("infer.no.conforming.instance.exists", that.tvars, that.qtype, to); diff -r 03177f49411d -r 2536dedd897e test/tools/javac/generics/inference/6638712/T6638712a.java --- a/test/tools/javac/generics/inference/6638712/T6638712a.java Thu Nov 18 16:13:11 2010 -0800 +++ b/test/tools/javac/generics/inference/6638712/T6638712a.java Tue Nov 23 11:08:43 2010 +0000 @@ -10,7 +10,7 @@ class T6638712a { - Comparator compound(Iterable> it) {} + Comparator compound(Iterable> it) { return null; } public void test(List> x) { Comparator c3 = compound(x); diff -r 03177f49411d -r 2536dedd897e test/tools/javac/generics/inference/6995200/T6995200.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/generics/inference/6995200/T6995200.java Tue Nov 23 11:08:43 2010 +0000 @@ -0,0 +1,67 @@ +/* + * Copyright (c) 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 6995200 + * + * @summary JDK 7 compiler crashes when type-variable is inferred from expected primitive type + * @author mcimadamore + * @compile T6995200.java + * + */ + +import java.util.List; + +class T6995200 { + static T getValue() { + return null; + } + + void test() { + byte v1 = getValue(); + short v2 = getValue(); + int v3 = getValue(); + long v4 = getValue(); + float v5 = getValue(); + double v6 = getValue(); + String v7 = getValue(); + String[] v8 = getValue(); + List v9 = getValue(); + List[] v10 = getValue(); + List v11 = getValue(); + List[] v12 = getValue(); + List v13 = getValue(); + List[] v14 = getValue(); + List v15 = getValue(); + List[] v16 = getValue(); + X v17 = getValue(); + X[] v18 = getValue(); + List v19 = getValue(); + List[] v20 = getValue(); + List v21 = getValue(); + List[] v22 = getValue(); + List v23 = getValue(); + List[] v24 = getValue(); + } +}