6548436: Incorrect inconvertible types error
Summary: Types.rewrite quantifiers should cope with captured type-variables properly
Reviewed-by: jjg
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Thu Oct 23 18:00:05 2008 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Thu Oct 23 18:10:23 2008 +0100
@@ -3367,33 +3367,67 @@
* quantifiers) only
*/
private Type rewriteQuantifiers(Type t, boolean high, boolean rewriteTypeVars) {
- ListBuffer<Type> from = new ListBuffer<Type>();
- ListBuffer<Type> to = new ListBuffer<Type>();
- adaptSelf(t, from, to);
- ListBuffer<Type> rewritten = new ListBuffer<Type>();
- List<Type> formals = from.toList();
- boolean changed = false;
- for (Type arg : to.toList()) {
- Type bound;
- if (rewriteTypeVars && arg.tag == TYPEVAR) {
- TypeVar tv = (TypeVar)arg;
- bound = high ? tv.bound : syms.botType;
- } else {
- bound = high ? upperBound(arg) : lowerBound(arg);
+ return new Rewriter(high, rewriteTypeVars).rewrite(t);
+ }
+
+ class Rewriter extends UnaryVisitor<Type> {
+
+ boolean high;
+ boolean rewriteTypeVars;
+
+ Rewriter(boolean high, boolean rewriteTypeVars) {
+ this.high = high;
+ this.rewriteTypeVars = rewriteTypeVars;
+ }
+
+ Type rewrite(Type t) {
+ ListBuffer<Type> from = new ListBuffer<Type>();
+ ListBuffer<Type> to = new ListBuffer<Type>();
+ adaptSelf(t, from, to);
+ ListBuffer<Type> rewritten = new ListBuffer<Type>();
+ List<Type> formals = from.toList();
+ boolean changed = false;
+ for (Type arg : to.toList()) {
+ Type bound = visit(arg);
+ if (arg != bound) {
+ changed = true;
+ bound = high ? makeExtendsWildcard(bound, (TypeVar)formals.head)
+ : makeSuperWildcard(bound, (TypeVar)formals.head);
+ }
+ rewritten.append(bound);
+ formals = formals.tail;
}
- Type newarg = bound;
- if (arg != bound) {
- changed = true;
- newarg = high ? makeExtendsWildcard(bound, (TypeVar)formals.head)
- : makeSuperWildcard(bound, (TypeVar)formals.head);
- }
- rewritten.append(newarg);
- formals = formals.tail;
+ if (changed)
+ return subst(t.tsym.type, from.toList(), rewritten.toList());
+ else
+ return t;
+ }
+
+ public Type visitType(Type t, Void s) {
+ return high ? upperBound(t) : lowerBound(t);
+ }
+
+ @Override
+ public Type visitCapturedType(CapturedType t, Void s) {
+ return visitWildcardType(t.wildcard, null);
}
- if (changed)
- return subst(t.tsym.type, from.toList(), rewritten.toList());
- else
- return t;
+
+ @Override
+ public Type visitTypeVar(TypeVar t, Void s) {
+ if (rewriteTypeVars)
+ return high ? t.bound : syms.botType;
+ else
+ return t;
+ }
+
+ @Override
+ public Type visitWildcardType(WildcardType t, Void s) {
+ Type bound = high ? t.getExtendsBound() :
+ t.getSuperBound();
+ if (bound == null)
+ bound = high ? syms.objectType : syms.botType;
+ return bound;
+ }
}
/**
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/cast/6548436/T6548436a.java Thu Oct 23 18:10:23 2008 +0100
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6548436
+ * @summary Incorrect inconvertible types error
+ * @author Maurizio Cimadamore
+ *
+ * @compile T6548436a.java
+ */
+
+public class T6548436a {
+
+ static class Base<E extends Comparable<E>> {}
+
+ static void test(Base<?> je) {
+ Object o = (Base<Integer>)je;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/cast/6548436/T6548436b.java Thu Oct 23 18:10:23 2008 +0100
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6548436
+ * @summary Incorrect inconvertible types error
+ * @author Maurizio Cimadamore
+ *
+ * @compile T6548436b.java
+ */
+
+public class T6548436b {
+
+ enum E { }
+
+ static void test(Enum<?> o) {
+ Object e = (E)o;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/cast/6548436/T6548436c.java Thu Oct 23 18:10:23 2008 +0100
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6548436
+ * @summary Incorrect inconvertible types error
+ * @author Maurizio Cimadamore
+ *
+ * @compile T6548436c.java
+ */
+
+public class T6548436c {
+
+ interface A<T extends A<? super T>> { }
+
+ interface B extends A<B> { }
+
+ static void test(A<?> a) {
+ Object o = (B)a;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/cast/6548436/T6548436d.java Thu Oct 23 18:10:23 2008 +0100
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6548436
+ * @summary Incorrect inconvertible types error
+ * @author Maurizio Cimadamore
+ *
+ * @compile/fail T6548436d.java
+ */
+
+public class T6548436d {
+
+ static class Base<E extends Comparable<E>> {}
+
+ static void test(Base<? extends Double> je) {
+ Object o = (Base<Integer>)je;
+ }
+}
\ No newline at end of file