8010101: Intersection type cast issues redundant unchecked warning
Summary: Code for checking intersection type cast is incorrectly swapping operands, leading to spurious warnings
Reviewed-by: jjg
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Fri Mar 22 12:38:12 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Fri Mar 22 12:39:34 2013 +0000
@@ -1418,23 +1418,10 @@
}
}
- if (t.isCompound()) {
- Warner oldWarner = warnStack.head;
- warnStack.head = noWarnings;
- if (!visit(supertype(t), s))
- return false;
- for (Type intf : interfaces(t)) {
- if (!visit(intf, s))
- return false;
- }
- if (warnStack.head.hasLint(LintCategory.UNCHECKED))
- oldWarner.warn(LintCategory.UNCHECKED);
- return true;
- }
-
- if (s.isCompound()) {
- // call recursively to reuse the above code
- return visitClassType((ClassType)s, t);
+ if (t.isCompound() || s.isCompound()) {
+ return !t.isCompound() ?
+ visitIntersectionType((IntersectionClassType)s, t, true) :
+ visitIntersectionType((IntersectionClassType)t, s, false);
}
if (s.tag == CLASS || s.tag == ARRAY) {
@@ -1512,6 +1499,18 @@
return false;
}
+ boolean visitIntersectionType(IntersectionClassType ict, Type s, boolean reverse) {
+ Warner warn = noWarnings;
+ for (Type c : ict.getComponents()) {
+ warn.clear();
+ if (reverse ? !isCastable(s, c, warn) : !isCastable(c, s, warn))
+ return false;
+ }
+ if (warn.hasLint(LintCategory.UNCHECKED))
+ warnStack.head.warn(LintCategory.UNCHECKED);
+ return true;
+ }
+
@Override
public Boolean visitArrayType(ArrayType t, Type s) {
switch (s.tag) {
@@ -3889,11 +3888,18 @@
}
private boolean giveWarning(Type from, Type to) {
- Type subFrom = asSub(from, to.tsym);
- return to.isParameterized() &&
- (!(isUnbounded(to) ||
- isSubtype(from, to) ||
- ((subFrom != null) && containsType(to.allparams(), subFrom.allparams()))));
+ List<Type> bounds = to.isCompound() ?
+ ((IntersectionClassType)to).getComponents() : List.of(to);
+ for (Type b : bounds) {
+ Type subFrom = asSub(from, b.tsym);
+ if (b.isParameterized() &&
+ (!(isUnbounded(b) ||
+ isSubtype(from, b) ||
+ ((subFrom != null) && containsType(b.allparams(), subFrom.allparams()))))) {
+ return true;
+ }
+ }
+ return false;
}
private List<Type> superClosure(Type t, Type s) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/Intersection02.java Fri Mar 22 12:39:34 2013 +0000
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2012, 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 8010101
+ * @summary Intersection type cast issues redundant unchecked warning
+ * @compile/fail/ref=Intersection02.out -Werror -Xlint:unchecked -XDrawDiagnostics Intersection02.java
+ */
+import java.io.Serializable;
+import java.util.List;
+
+class Intersection02 {
+
+ interface P<X> { }
+
+ void test(List<String> ls) {
+ Object o1 = (List<String> & Serializable)ls;
+ Object o2 = (List<String> & Serializable & P<String>)ls;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/Intersection02.out Fri Mar 22 12:39:34 2013 +0000
@@ -0,0 +1,4 @@
+Intersection02.java:39:62: compiler.warn.prob.found.req: (compiler.misc.unchecked.cast.to.type), java.util.List<java.lang.String>, java.lang.Object&java.util.List<java.lang.String>&java.io.Serializable&Intersection02.P<java.lang.String>
+- compiler.err.warnings.and.werror
+1 error
+1 warning