--- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Wed Jul 05 16:46:29 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Fri Jan 30 23:28:38 2009 -0800
@@ -709,12 +709,31 @@
case UNDETVAR:
if (s.tag == WILDCARD) {
UndetVar undetvar = (UndetVar)t;
- undetvar.inst = glb(upperBound(s), undetvar.inst);
- // We should check instantiated type against any of the
- // undetvar's lower bounds.
- for (Type t2 : undetvar.lobounds) {
- if (!isSubtype(t2, undetvar.inst))
- return false;
+ WildcardType wt = (WildcardType)s;
+ switch(wt.kind) {
+ case UNBOUND: //similar to ? extends Object
+ case EXTENDS: {
+ Type bound = upperBound(s);
+ // We should check the new upper bound against any of the
+ // undetvar's lower bounds.
+ for (Type t2 : undetvar.lobounds) {
+ if (!isSubtype(t2, bound))
+ return false;
+ }
+ undetvar.hibounds = undetvar.hibounds.prepend(bound);
+ break;
+ }
+ case SUPER: {
+ Type bound = lowerBound(s);
+ // We should check the new lower bound against any of the
+ // undetvar's lower bounds.
+ for (Type t2 : undetvar.hibounds) {
+ if (!isSubtype(bound, t2))
+ return false;
+ }
+ undetvar.lobounds = undetvar.lobounds.prepend(bound);
+ break;
+ }
}
return true;
} else {
@@ -930,12 +949,16 @@
}
if (t.isCompound()) {
+ Warner oldWarner = warnStack.head;
+ warnStack.head = Warner.noWarnings;
if (!visit(supertype(t), s))
return false;
for (Type intf : interfaces(t)) {
if (!visit(intf, s))
return false;
}
+ if (warnStack.head.unchecked == true)
+ oldWarner.warnUnchecked();
return true;
}
@@ -2108,9 +2131,6 @@
List<Type> to) {
if (tvars.isEmpty())
return tvars;
- if (tvars.tail.isEmpty())
- // fast common case
- return List.<Type>of(substBound((TypeVar)tvars.head, from, to));
ListBuffer<Type> newBoundsBuf = lb();
boolean changed = false;
// calculate new bounds
@@ -2150,8 +2170,14 @@
Type bound1 = subst(t.bound, from, to);
if (bound1 == t.bound)
return t;
- else
- return new TypeVar(t.tsym, bound1, syms.botType);
+ else {
+ // create new type variable without bounds
+ TypeVar tv = new TypeVar(t.tsym, null, syms.botType);
+ // the new bound should use the new type variable in place
+ // of the old
+ tv.bound = subst(bound1, List.<Type>of(t), List.<Type>of(tv));
+ return tv;
+ }
}
// </editor-fold>
@@ -2825,6 +2851,16 @@
// </editor-fold>
// <editor-fold defaultstate="collapsed" desc="Greatest lower bound">
+ public Type glb(List<Type> ts) {
+ Type t1 = ts.head;
+ for (Type t2 : ts.tail) {
+ if (t1.isErroneous())
+ return t1;
+ t1 = glb(t1, t2);
+ }
+ return t1;
+ }
+ //where
public Type glb(Type t, Type s) {
if (s == null)
return t;
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java Wed Jul 05 16:46:29 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java Fri Jan 30 23:28:38 2009 -0800
@@ -154,33 +154,15 @@
that.inst = syms.objectType;
else if (that.hibounds.tail.isEmpty())
that.inst = that.hibounds.head;
- else {
- for (List<Type> bs = that.hibounds;
- bs.nonEmpty() && that.inst == null;
- bs = bs.tail) {
- // System.out.println("hibounds = " + that.hibounds);//DEBUG
- if (isSubClass(bs.head, that.hibounds))
- that.inst = types.fromUnknownFun.apply(bs.head);
- }
- if (that.inst == null) {
- int classCount = 0, interfaceCount = 0;
- for (Type t : that.hibounds) {
- if (t.tag == CLASS) {
- if (t.isInterface())
- interfaceCount++;
- else
- classCount++;
- }
- }
- if ((that.hibounds.size() == classCount + interfaceCount) && classCount == 1)
- that.inst = types.makeCompoundType(that.hibounds);
- }
- if (that.inst == null || !types.isSubtypeUnchecked(that.inst, that.hibounds, warn))
- throw ambiguousNoInstanceException
- .setMessage("no.unique.maximal.instance.exists",
- that.qtype, that.hibounds);
- }
+ else
+ that.inst = types.glb(that.hibounds);
}
+ if (that.inst == null ||
+ that.inst.isErroneous() ||
+ !types.isSubtypeUnchecked(that.inst, that.hibounds, warn))
+ throw ambiguousNoInstanceException
+ .setMessage("no.unique.maximal.instance.exists",
+ that.qtype, that.hibounds);
}
//where
private boolean isSubClass(Type t, final List<Type> ts) {
--- a/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java Wed Jul 05 16:46:29 2017 +0200
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java Fri Jan 30 23:28:38 2009 -0800
@@ -83,7 +83,7 @@
cpString = appendPath(docletPath, cpString);
URL[] urls = pathToURLs(cpString);
if (docletParentClassLoader == null)
- appClassLoader = new URLClassLoader(urls);
+ appClassLoader = new URLClassLoader(urls, getDelegationClassLoader(docletClassName));
else
appClassLoader = new URLClassLoader(urls, docletParentClassLoader);
@@ -98,6 +98,57 @@
docletClass = dc;
}
+ /*
+ * Returns the delegation class loader to use when creating
+ * appClassLoader (used to load the doclet). The context class
+ * loader is the best choice, but legacy behavior was to use the
+ * default delegation class loader (aka system class loader).
+ *
+ * Here we favor using the context class loader. To ensure
+ * compatibility with existing apps, we revert to legacy
+ * behavior if either or both of the following conditions hold:
+ *
+ * 1) the doclet is loadable from the system class loader but not
+ * from the context class loader,
+ *
+ * 2) this.getClass() is loadable from the system class loader but not
+ * from the context class loader.
+ */
+ private ClassLoader getDelegationClassLoader(String docletClassName) {
+ ClassLoader ctxCL = Thread.currentThread().getContextClassLoader();
+ ClassLoader sysCL = ClassLoader.getSystemClassLoader();
+ if (sysCL == null)
+ return ctxCL;
+ if (ctxCL == null)
+ return sysCL;
+
+ // Condition 1.
+ try {
+ sysCL.loadClass(docletClassName);
+ try {
+ ctxCL.loadClass(docletClassName);
+ } catch (ClassNotFoundException e) {
+ return sysCL;
+ }
+ } catch (ClassNotFoundException e) {
+ }
+
+ // Condition 2.
+ try {
+ if (getClass() == sysCL.loadClass(getClass().getName())) {
+ try {
+ if (getClass() != ctxCL.loadClass(getClass().getName()))
+ return sysCL;
+ } catch (ClassNotFoundException e) {
+ return sysCL;
+ }
+ }
+ } catch (ClassNotFoundException e) {
+ }
+
+ return ctxCL;
+ }
+
/**
* Generate documentation here. Return true on success.
*/
@@ -231,6 +282,8 @@
docletClassName, methodName);
throw new DocletInvokeException();
}
+ ClassLoader savedCCL =
+ Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(appClassLoader);
return meth.invoke(null , params);
@@ -256,6 +309,8 @@
exc.getTargetException().printStackTrace();
}
throw new DocletInvokeException();
+ } finally {
+ Thread.currentThread().setContextClassLoader(savedCCL);
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/cast/6557182/T6557182.java Fri Jan 30 23:28:38 2009 -0800
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2009 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
+ * @author Maurizio Cimadamore
+ * @bug 6557182
+ * @summary Unchecked warning *and* inconvertible types
+ * @compile/fail/ref=T6557182.out -XDrawDiagnostics -Xlint:unchecked T6557182.java
+ */
+
+class T6557182 {
+
+ <T extends Number & Comparable<String>> void test1(T t) {
+ Comparable<Integer> ci = (Comparable<Integer>) t;
+ }
+
+ <T extends Number & Comparable<? extends Number>> void test2(T t) {
+ Comparable<Integer> ci = (Comparable<Integer>) t;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/cast/6557182/T6557182.out Fri Jan 30 23:28:38 2009 -0800
@@ -0,0 +1,4 @@
+T6557182.java:35:56: compiler.err.prob.found.req: (- compiler.misc.inconvertible.types), T, java.lang.Comparable<java.lang.Integer>
+T6557182.java:39:56: compiler.warn.prob.found.req: (- compiler.misc.unchecked.cast.to.type), T, java.lang.Comparable<java.lang.Integer>
+1 error
+1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/6729401/T6729401.java Fri Jan 30 23:28:38 2009 -0800
@@ -0,0 +1,46 @@
+/*
+ * 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 6729401
+ *
+ * @summary Compiler error when using F-bounded generics with free type variables
+ * @author Maurizio Cimadamore
+ * @compile T6729401.java
+ *
+ */
+
+class T6729401 {
+
+ interface I<U,W> {
+ <T extends I<U,T>> void m(I<U,T> x);
+ }
+
+ <X extends I<Object,X>,Y extends I<Object,Y>> void test(I<Object,X> x, I<Object,Y> y) {
+ x.<Y>m(y);
+ x.m(y);
+ y.<X>m(x);
+ y.m(x);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/inference/6315770/T6315770.java Fri Jan 30 23:28:38 2009 -0800
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2009 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 6315770
+ * @summary javac inference allows creation of strange types: Integer & Runnable
+ * @author Maurizio Cimadamore
+ *
+ * @compile/fail/ref=T6315770.out T6315770.java -XDrawDiagnostics
+ */
+
+class T6315770<V> {
+ <T extends Integer & Runnable> T6315770<T> m() {
+ return null;
+ }
+ void test() {
+ T6315770<?> c1 = m();
+ T6315770<? extends String> c2 = m();
+ T6315770<? super String> c3 = m();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/inference/6315770/T6315770.out Fri Jan 30 23:28:38 2009 -0800
@@ -0,0 +1,3 @@
+T6315770.java:39:42: compiler.err.undetermined.type.1: <T>T6315770<T>, (- compiler.misc.no.unique.maximal.instance.exists: T, java.lang.String,java.lang.Integer,java.lang.Runnable)
+T6315770.java:40:40: compiler.err.prob.found.req: (- compiler.misc.incompatible.types.1: (- compiler.misc.no.conforming.instance.exists: T, T6315770<T>, T6315770<? super java.lang.String>)), <T>T6315770<T>, T6315770<? super java.lang.String>
+2 errors
--- a/langtools/test/tools/javac/processing/model/testgetallmembers/Main.java Wed Jul 05 16:46:29 2017 +0200
+++ b/langtools/test/tools/javac/processing/model/testgetallmembers/Main.java Fri Jan 30 23:28:38 2009 -0800
@@ -23,7 +23,7 @@
/**
* @test
- * @bug 6374357 6308351
+ * @bug 6374357 6308351 6707027
* @summary PackageElement.getEnclosedElements() throws ClassReader$BadClassFileException
* @author Peter von der Ah\u00e9
* @run main/othervm -Xmx256m Main
@@ -118,7 +118,7 @@
packages.size(), classes, nestedClasses);
if (classes < 9000)
throw new AssertionError("Too few classes in PLATFORM_CLASS_PATH ;-)");
- if (packages.size() < 545)
+ if (packages.size() < 530)
throw new AssertionError("Too few packages in PLATFORM_CLASS_PATH ;-)");
if (nestedClasses < 3000)
throw new AssertionError("Too few nested classes in PLATFORM_CLASS_PATH ;-)");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javadoc/6176978/T6176978.java Fri Jan 30 23:28:38 2009 -0800
@@ -0,0 +1,80 @@
+/*
+ * 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 6176978
+ * @summary current Javadoc's invocation and extension (Doclet) mechanisms are problematic
+ * @build T6176978
+ * @run main T6176978
+ */
+
+import java.io.*;
+import java.net.*;
+
+public class T6176978
+{
+ public static void main(String[] args) throws Exception {
+ // create and use a temp dir that will not be on jtreg's
+ // default class path
+ File tmpDir = new File("tmp");
+ tmpDir.mkdirs();
+
+ File testSrc = new File(System.getProperty("test.src", "."));
+ String[] javac_args = {
+ "-d",
+ "tmp",
+ new File(testSrc, "X.java").getPath()
+ };
+
+ int rc = com.sun.tools.javac.Main.compile(javac_args);
+ if (rc != 0)
+ throw new Error("javac exit code: " + rc);
+
+ String[] jdoc_args = {
+ "-doclet",
+ "X",
+ new File(testSrc, "T6176978.java").getPath()
+ };
+
+ rc = com.sun.tools.javadoc.Main.execute(jdoc_args);
+ if (rc == 0)
+ throw new Error("javadoc unexpectedly succeeded");
+
+
+
+ Thread currThread = Thread.currentThread();
+ ClassLoader saveClassLoader = currThread.getContextClassLoader();
+ URLClassLoader urlCL = new URLClassLoader(new URL[] { tmpDir.toURL() });
+ currThread.setContextClassLoader(urlCL);
+
+ try {
+ rc = com.sun.tools.javadoc.Main.execute(jdoc_args);
+ if (rc != 0)
+ throw new Error("javadoc exit: " + rc);
+ }
+ finally {
+ currThread.setContextClassLoader(saveClassLoader);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javadoc/6176978/X.java Fri Jan 30 23:28:38 2009 -0800
@@ -0,0 +1,31 @@
+/*
+ * 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.
+ */
+
+import com.sun.javadoc.*;
+
+public class X {
+ public static boolean start(RootDoc root) {
+ System.out.println("X.start");
+ return true;
+ }
+}