changeset 363:49281ea88125

Merge
author tbell
date Fri, 30 Jan 2009 23:28:38 -0800
parents be546a6c08e3 79f2f2c7d846
children 638d5fbf5e78 9d541fd2916b
files
diffstat 11 files changed, 360 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/com/sun/tools/javac/code/Types.java	Thu Jan 29 21:48:36 2009 -0800
+++ b/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/src/share/classes/com/sun/tools/javac/comp/Infer.java	Thu Jan 29 21:48:36 2009 -0800
+++ b/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/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java	Thu Jan 29 21:48:36 2009 -0800
+++ b/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/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/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/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/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/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/test/tools/javac/processing/model/testgetallmembers/Main.java	Thu Jan 29 21:48:36 2009 -0800
+++ b/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/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/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;
+    }
+}