Merge
diff --git a/make/build.properties b/make/build.properties
index 38fd0f4..c1059c2 100644
--- a/make/build.properties
+++ b/make/build.properties
@@ -66,7 +66,7 @@
 # set the following to -version to verify the versions of javac being used
 javac.version.opt = 
 # in time, there should be no exceptions to -Xlint:all
-javac.lint.opts = -Xlint:all,-deprecation,-fallthrough,-serial,-unchecked,-cast
+javac.lint.opts = -Xlint:all,-deprecation,-fallthrough,-serial,-unchecked,-cast,-rawtypes
 
 # options for the <javadoc> task for javac
 javadoc.jls3.url=http://java.sun.com/docs/books/jls/
diff --git a/src/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java b/src/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java
index f256560..c7bc83e 100644
--- a/src/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java
+++ b/src/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java
@@ -474,23 +474,22 @@
     }
 
     abstract class Filter {
-        void run(ListBuffer<Env<AttrContext>> list, Iterable<? extends TypeElement> classes) {
+        void run(Queue<Env<AttrContext>> list, Iterable<? extends TypeElement> classes) {
             Set<TypeElement> set = new HashSet<TypeElement>();
             for (TypeElement item: classes)
                 set.add(item);
 
-            List<Env<AttrContext>> defer = List.<Env<AttrContext>>nil();
-            while (list.nonEmpty()) {
-                Env<AttrContext> env = list.next();
+            ListBuffer<Env<AttrContext>> defer = ListBuffer.<Env<AttrContext>>lb();
+            while (list.peek() != null) {
+                Env<AttrContext> env = list.remove();
                 ClassSymbol csym = env.enclClass.sym;
                 if (csym != null && set.contains(csym.outermostClass()))
                     process(env);
                 else
-                    defer = defer.prepend(env);
+                    defer = defer.append(env);
             }
 
-            for (List<Env<AttrContext>> l = defer; l.nonEmpty(); l = l.tail)
-                list.prepend(l.head);
+            list.addAll(defer);
         }
 
         abstract void process(Env<AttrContext> env);
diff --git a/src/share/classes/com/sun/tools/javac/code/Lint.java b/src/share/classes/com/sun/tools/javac/code/Lint.java
index 76d57e2..8025e61 100644
--- a/src/share/classes/com/sun/tools/javac/code/Lint.java
+++ b/src/share/classes/com/sun/tools/javac/code/Lint.java
@@ -176,6 +176,11 @@
         PATH("path"),
 
         /**
+         * Warn about issues regarding annotation processing.
+         */
+        PROCESSING("processing"),
+
+        /**
          * Warn about Serializable classes that do not provide a serial version ID.
          */
         SERIAL("serial"),
@@ -183,7 +188,12 @@
         /**
          * Warn about unchecked operations on raw types.
          */
-        UNCHECKED("unchecked");
+        UNCHECKED("unchecked"),
+
+        /**
+         * Warn about unchecked operations on raw types.
+         */
+        RAW("rawtypes");
 
         LintCategory(String option) {
             this.option = option;
diff --git a/src/share/classes/com/sun/tools/javac/code/Symbol.java b/src/share/classes/com/sun/tools/javac/code/Symbol.java
index 9971e50..d856613 100644
--- a/src/share/classes/com/sun/tools/javac/code/Symbol.java
+++ b/src/share/classes/com/sun/tools/javac/code/Symbol.java
@@ -132,6 +132,10 @@
         throw new AssertionError();
     }
 
+    public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
+        return v.visitSymbol(this, p);
+    }
+
     /** The Java source which this symbol represents.
      *  A description of this symbol; overrides Object.
      */
@@ -477,6 +481,10 @@
         public <R, P> R accept(ElementVisitor<R, P> v, P p) {
             return other.accept(v, p);
         }
+
+        public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
+            return v.visitSymbol(other, p);
+        }
     }
 
     /** A class for type symbols. Type variables are represented by instances
@@ -570,6 +578,10 @@
             return v.visitTypeParameter(this, p);
         }
 
+        public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
+            return v.visitTypeSymbol(this, p);
+        }
+
         public List<Type> getBounds() {
             TypeVar t = (TypeVar)type;
             Type bound = t.getUpperBound();
@@ -653,6 +665,10 @@
         public <R, P> R accept(ElementVisitor<R, P> v, P p) {
             return v.visitPackage(this, p);
         }
+
+        public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
+            return v.visitPackageSymbol(this, p);
+        }
     }
 
     /** A class for class symbols
@@ -843,6 +859,10 @@
         public <R, P> R accept(ElementVisitor<R, P> v, P p) {
             return v.visitType(this, p);
         }
+
+        public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
+            return v.visitClassSymbol(this, p);
+        }
     }
 
 
@@ -969,6 +989,10 @@
             assert !(data instanceof Env<?>) : this;
             this.data = data;
         }
+
+        public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
+            return v.visitVarSymbol(this, p);
+        }
     }
 
     /** A class for method symbols.
@@ -1232,6 +1256,10 @@
             return v.visitExecutable(this, p);
         }
 
+        public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
+            return v.visitMethodSymbol(this, p);
+        }
+
         public Type getReturnType() {
             return asType().getReturnType();
         }
@@ -1251,6 +1279,10 @@
             super(PUBLIC | STATIC, name, type, owner);
             this.opcode = opcode;
         }
+
+        public <R, P> R accept(Symbol.Visitor<R, P> v, P p) {
+            return v.visitOperatorSymbol(this, p);
+        }
     }
 
     /** Symbol completer interface.
@@ -1308,4 +1340,28 @@
         }
 
     }
+
+    /**
+     * A visitor for symbols.  A visitor is used to implement operations
+     * (or relations) on symbols.  Most common operations on types are
+     * binary relations and this interface is designed for binary
+     * relations, that is, operations on the form
+     * Symbol&nbsp;&times;&nbsp;P&nbsp;&rarr;&nbsp;R.
+     * <!-- In plain text: Type x P -> R -->
+     *
+     * @param <R> the return type of the operation implemented by this
+     * visitor; use Void if no return type is needed.
+     * @param <P> the type of the second argument (the first being the
+     * symbol itself) of the operation implemented by this visitor; use
+     * Void if a second argument is not needed.
+     */
+    public interface Visitor<R,P> {
+        R visitClassSymbol(ClassSymbol s, P arg);
+        R visitMethodSymbol(MethodSymbol s, P arg);
+        R visitPackageSymbol(PackageSymbol s, P arg);
+        R visitOperatorSymbol(OperatorSymbol s, P arg);
+        R visitVarSymbol(VarSymbol s, P arg);
+        R visitTypeSymbol(TypeSymbol s, P arg);
+        R visitSymbol(Symbol s, P arg);
+    }
 }
diff --git a/src/share/classes/com/sun/tools/javac/code/Types.java b/src/share/classes/com/sun/tools/javac/code/Types.java
index 761169e..88556d6 100644
--- a/src/share/classes/com/sun/tools/javac/code/Types.java
+++ b/src/share/classes/com/sun/tools/javac/code/Types.java
@@ -67,6 +67,7 @@
         new Context.Key<Types>();
 
     final Symtab syms;
+    final Messages messages;
     final Names names;
     final boolean allowBoxing;
     final ClassReader reader;
@@ -92,6 +93,7 @@
         source = Source.instance(context);
         chk = Check.instance(context);
         capturedName = names.fromString("<captured wildcard>");
+        messages = Messages.instance(context);
     }
     // </editor-fold>
 
@@ -1589,10 +1591,10 @@
                             syms.noSymbol);
         if (bounds.head.tag == TYPEVAR)
             // error condition, recover
-            bc.erasure_field = syms.objectType;
-        else
-            bc.erasure_field = erasure(bounds.head);
-        bc.members_field = new Scope(bc);
+                bc.erasure_field = syms.objectType;
+            else
+                bc.erasure_field = erasure(bounds.head);
+            bc.members_field = new Scope(bc);
         ClassType bt = (ClassType)bc.type;
         bt.allparams_field = List.nil();
         if (supertype != null) {
@@ -2249,10 +2251,234 @@
     }
     // </editor-fold>
 
+    // <editor-fold defaultstate="collapsed" desc="printType">
+    /**
+     * Visitor for generating a string representation of a given type
+     * accordingly to a given locale
+     */
+    public String toString(Type t, Locale locale) {
+        return typePrinter.visit(t, locale);
+    }
+    // where
+    private TypePrinter typePrinter = new TypePrinter();
+
+    public class TypePrinter extends DefaultTypeVisitor<String, Locale> {
+
+        public String visit(List<Type> ts, Locale locale) {
+            ListBuffer<String> sbuf = lb();
+            for (Type t : ts) {
+                sbuf.append(visit(t, locale));
+            }
+            return sbuf.toList().toString();
+        }
+
+        @Override
+        public String visitCapturedType(CapturedType t, Locale locale) {
+            return messages.getLocalizedString("compiler.misc.type.captureof",
+                        (t.hashCode() & 0xFFFFFFFFL) % Type.CapturedType.PRIME,
+                        visit(t.wildcard, locale));
+        }
+
+        @Override
+        public String visitForAll(ForAll t, Locale locale) {
+            return "<" + visit(t.tvars, locale) + ">" + visit(t.qtype, locale);
+        }
+
+        @Override
+        public String visitUndetVar(UndetVar t, Locale locale) {
+            if (t.inst != null) {
+                return visit(t.inst, locale);
+            } else {
+                return visit(t.qtype, locale) + "?";
+            }
+        }
+
+        @Override
+        public String visitArrayType(ArrayType t, Locale locale) {
+            return visit(t.elemtype, locale) + "[]";
+        }
+
+        @Override
+        public String visitClassType(ClassType t, Locale locale) {
+            StringBuffer buf = new StringBuffer();
+            if (t.getEnclosingType().tag == CLASS && t.tsym.owner.kind == Kinds.TYP) {
+                buf.append(visit(t.getEnclosingType(), locale));
+                buf.append(".");
+                buf.append(className(t, false, locale));
+            } else {
+                buf.append(className(t, true, locale));
+            }
+            if (t.getTypeArguments().nonEmpty()) {
+                buf.append('<');
+                buf.append(visit(t.getTypeArguments(), locale));
+                buf.append(">");
+            }
+            return buf.toString();
+        }
+
+        @Override
+        public String visitMethodType(MethodType t, Locale locale) {
+            return "(" + printMethodArgs(t.argtypes, false, locale) + ")" + visit(t.restype, locale);
+        }
+
+        @Override
+        public String visitPackageType(PackageType t, Locale locale) {
+            return t.tsym.getQualifiedName().toString();
+        }
+
+        @Override
+        public String visitWildcardType(WildcardType t, Locale locale) {
+            StringBuffer s = new StringBuffer();
+            s.append(t.kind);
+            if (t.kind != UNBOUND) {
+                s.append(visit(t.type, locale));
+            }
+            return s.toString();
+        }
+
+
+        public String visitType(Type t, Locale locale) {
+            String s = (t.tsym == null || t.tsym.name == null)
+                    ? messages.getLocalizedString("compiler.misc.type.none")
+                    : t.tsym.name.toString();
+            return s;
+        }
+
+        protected String className(ClassType t, boolean longform, Locale locale) {
+            Symbol sym = t.tsym;
+            if (sym.name.length() == 0 && (sym.flags() & COMPOUND) != 0) {
+                StringBuffer s = new StringBuffer(visit(supertype(t), locale));
+                for (List<Type> is = interfaces(t); is.nonEmpty(); is = is.tail) {
+                    s.append("&");
+                    s.append(visit(is.head, locale));
+                }
+                return s.toString();
+            } else if (sym.name.length() == 0) {
+                String s;
+                ClassType norm = (ClassType) t.tsym.type;
+                if (norm == null) {
+                    s = getLocalizedString(locale, "compiler.misc.anonymous.class", (Object) null);
+                } else if (interfaces(norm).nonEmpty()) {
+                    s = getLocalizedString(locale, "compiler.misc.anonymous.class",
+                            visit(interfaces(norm).head, locale));
+                } else {
+                    s = getLocalizedString(locale, "compiler.misc.anonymous.class",
+                            visit(supertype(norm), locale));
+                }
+                return s;
+            } else if (longform) {
+                return sym.getQualifiedName().toString();
+            } else {
+                return sym.name.toString();
+            }
+        }
+
+        protected String printMethodArgs(List<Type> args, boolean varArgs, Locale locale) {
+            if (!varArgs) {
+                return visit(args, locale);
+            } else {
+                StringBuffer buf = new StringBuffer();
+                while (args.tail.nonEmpty()) {
+                    buf.append(visit(args.head, locale));
+                    args = args.tail;
+                    buf.append(',');
+                }
+                if (args.head.tag == ARRAY) {
+                    buf.append(visit(((ArrayType) args.head).elemtype, locale));
+                    buf.append("...");
+                } else {
+                    buf.append(visit(args.head, locale));
+                }
+                return buf.toString();
+            }
+        }
+
+        protected String getLocalizedString(Locale locale, String key, Object... args) {
+            return messages.getLocalizedString(key, args);
+        }
+    };
+    // </editor-fold>
+
+    // <editor-fold defaultstate="collapsed" desc="printSymbol">
+    /**
+     * Visitor for generating a string representation of a given symbol
+     * accordingly to a given locale
+     */
+    public String toString(Symbol t, Locale locale) {
+        return symbolPrinter.visit(t, locale);
+    }
+    // where
+    private SymbolPrinter symbolPrinter = new SymbolPrinter();
+
+    public class SymbolPrinter extends DefaultSymbolVisitor<String, Locale> {
+
+        @Override
+        public String visitClassSymbol(ClassSymbol sym, Locale locale) {
+            return sym.name.isEmpty()
+                    ? getLocalizedString(locale, "compiler.misc.anonymous.class", sym.flatname)
+                    : sym.fullname.toString();
+        }
+
+        @Override
+        public String visitMethodSymbol(MethodSymbol s, Locale locale) {
+            if ((s.flags() & BLOCK) != 0) {
+                return s.owner.name.toString();
+            } else {
+                String ms = (s.name == names.init)
+                        ? s.owner.name.toString()
+                        : s.name.toString();
+                if (s.type != null) {
+                    if (s.type.tag == FORALL) {
+                        ms = "<" + typePrinter.visit(s.type.getTypeArguments(), locale) + ">" + ms;
+                    }
+                    ms += "(" + typePrinter.printMethodArgs(
+                            s.type.getParameterTypes(),
+                            (s.flags() & VARARGS) != 0,
+                            locale) + ")";
+                }
+                return ms;
+            }
+        }
+
+        @Override
+        public String visitOperatorSymbol(OperatorSymbol s, Locale locale) {
+            return visitMethodSymbol(s, locale);
+        }
+
+        @Override
+        public String visitPackageSymbol(PackageSymbol s, Locale locale) {
+            return s.name.isEmpty()
+                    ? getLocalizedString(locale, "compiler.misc.unnamed.package")
+                    : s.fullname.toString();
+        }
+
+        @Override
+        public String visitSymbol(Symbol s, Locale locale) {
+            return s.name.toString();
+        }
+
+        public String visit(List<Symbol> ts, Locale locale) {
+            ListBuffer<String> sbuf = lb();
+            for (Symbol t : ts) {
+                sbuf.append(visit(t, locale));
+            }
+            return sbuf.toList().toString();
+        }
+
+        protected String getLocalizedString(Locale locale, String key, Object... args) {
+            return messages.getLocalizedString(key, args);
+        }
+    };
+    // </editor-fold>
+
     // <editor-fold defaultstate="collapsed" desc="toString">
     /**
      * This toString is slightly more descriptive than the one on Type.
+     *
+     * @deprecated Types.toString(Type t, Locale l) provides better support
+     * for localization
      */
+    @Deprecated
     public String toString(Type t) {
         if (t.tag == FORALL) {
             ForAll forAll = (ForAll)t;
@@ -3236,6 +3462,28 @@
     }
 
     /**
+     * A default visitor for symbols.  All visitor methods except
+     * visitSymbol are implemented by delegating to visitSymbol.  Concrete
+     * subclasses must provide an implementation of visitSymbol and can
+     * override other methods as needed.
+     *
+     * @param <R> the return type of the operation implemented by this
+     * visitor; use Void if no return type is needed.
+     * @param <S> the type of the second argument (the first being the
+     * symbol itself) of the operation implemented by this visitor; use
+     * Void if a second argument is not needed.
+     */
+    public static abstract class DefaultSymbolVisitor<R,S> implements Symbol.Visitor<R,S> {
+        final public R visit(Symbol s, S arg)                   { return s.accept(this, arg); }
+        public R visitClassSymbol(ClassSymbol s, S arg)         { return visitSymbol(s, arg); }
+        public R visitMethodSymbol(MethodSymbol s, S arg)       { return visitSymbol(s, arg); }
+        public R visitOperatorSymbol(OperatorSymbol s, S arg)   { return visitSymbol(s, arg); }
+        public R visitPackageSymbol(PackageSymbol s, S arg)     { return visitSymbol(s, arg); }
+        public R visitTypeSymbol(TypeSymbol s, S arg)           { return visitSymbol(s, arg); }
+        public R visitVarSymbol(VarSymbol s, S arg)             { return visitSymbol(s, arg); }
+    }
+
+    /**
      * A <em>simple</em> visitor for types.  This visitor is simple as
      * captured wildcards, for-all types (generic methods), and
      * undetermined type variables (part of inference) are hidden.
diff --git a/src/share/classes/com/sun/tools/javac/comp/Attr.java b/src/share/classes/com/sun/tools/javac/comp/Attr.java
index 91840d4..c41c7e9 100644
--- a/src/share/classes/com/sun/tools/javac/comp/Attr.java
+++ b/src/share/classes/com/sun/tools/javac/comp/Attr.java
@@ -614,14 +614,14 @@
             }
 
             // Check that type parameters are well-formed.
-            chk.validateTypeParams(tree.typarams);
+            chk.validate(tree.typarams, localEnv);
             if ((owner.flags() & ANNOTATION) != 0 &&
                 tree.typarams.nonEmpty())
                 log.error(tree.typarams.head.pos(),
                           "intf.annotation.members.cant.have.type.params");
 
             // Check that result type is well-formed.
-            chk.validate(tree.restype);
+            chk.validate(tree.restype, localEnv);
             if ((owner.flags() & ANNOTATION) != 0)
                 chk.validateAnnotationType(tree.restype);
 
@@ -707,7 +707,7 @@
         }
 
         // Check that the variable's declared type is well-formed.
-        chk.validate(tree.vartype);
+        chk.validate(tree.vartype, env);
 
         VarSymbol v = tree.sym;
         Lint lint = env.info.lint.augment(v.attributes_field, v.flags());
@@ -1322,7 +1322,7 @@
             // current context.  Also, capture the return type
             result = check(tree, capture(restype), VAL, pkind, pt);
         }
-        chk.validate(tree.typeargs);
+        chk.validate(tree.typeargs, localEnv);
     }
     //where
         /** Check that given application node appears as first statement
@@ -1397,7 +1397,7 @@
         // symbol + type back into the attributed tree.
         Type clazztype = chk.checkClassType(
             tree.clazz.pos(), attribType(clazz, env), true);
-        chk.validate(clazz);
+        chk.validate(clazz, localEnv);
         if (tree.encl != null) {
             // We have to work in this case to store
             // symbol + type back into the attributed tree.
@@ -1533,7 +1533,7 @@
                 owntype = clazztype;
         }
         result = check(tree, owntype, VAL, pkind, pt);
-        chk.validate(tree.typeargs);
+        chk.validate(tree.typeargs, localEnv);
     }
 
     /** Make an attributed null check tree.
@@ -1555,7 +1555,7 @@
         Type elemtype;
         if (tree.elemtype != null) {
             elemtype = attribType(tree.elemtype, env);
-            chk.validate(tree.elemtype);
+            chk.validate(tree.elemtype, env);
             owntype = elemtype;
             for (List<JCExpression> l = tree.dims; l.nonEmpty(); l = l.tail) {
                 attribExpr(l.head, env, syms.intType);
@@ -1711,6 +1711,7 @@
 
     public void visitTypeCast(JCTypeCast tree) {
         Type clazztype = attribType(tree.clazz, env);
+        chk.validate(tree.clazz, env);
         Type exprtype = attribExpr(tree.expr, env, Infer.anyPoly);
         Type owntype = chk.checkCastable(tree.expr.pos(), exprtype, clazztype);
         if (exprtype.constValue() != null)
@@ -1723,6 +1724,7 @@
             tree.expr.pos(), attribExpr(tree.expr, env));
         Type clazztype = chk.checkReifiableReferenceType(
             tree.clazz.pos(), attribType(tree.clazz, env));
+        chk.validate(tree.clazz, env);
         chk.checkCastable(tree.expr.pos(), exprtype, clazztype);
         result = check(tree, syms.booleanType, VAL, pkind, pt);
     }
@@ -2695,9 +2697,9 @@
 
         // Validate type parameters, supertype and interfaces.
         attribBounds(tree.typarams);
-        chk.validateTypeParams(tree.typarams);
-        chk.validate(tree.extending);
-        chk.validate(tree.implementing);
+        chk.validate(tree.typarams, env);
+        chk.validate(tree.extending, env);
+        chk.validate(tree.implementing, env);
 
         // If this is a non-abstract class, check that it has no abstract
         // methods or unimplemented methods of an implemented interface.
diff --git a/src/share/classes/com/sun/tools/javac/comp/Check.java b/src/share/classes/com/sun/tools/javac/comp/Check.java
index 8a6cb07..d901d86 100644
--- a/src/share/classes/com/sun/tools/javac/comp/Check.java
+++ b/src/share/classes/com/sun/tools/javac/comp/Check.java
@@ -764,26 +764,32 @@
     /** Visitor method: Validate a type expression, if it is not null, catching
      *  and reporting any completion failures.
      */
-    void validate(JCTree tree) {
+    void validate(JCTree tree, Env<AttrContext> env) {
         try {
-            if (tree != null) tree.accept(validator);
+            if (tree != null) {
+                validator.env = env;
+                tree.accept(validator);
+                checkRaw(tree, env);
+            }
         } catch (CompletionFailure ex) {
             completionError(tree.pos(), ex);
         }
     }
+    //where
+    void checkRaw(JCTree tree, Env<AttrContext> env) {
+        if (lint.isEnabled(Lint.LintCategory.RAW) &&
+            tree.type.tag == CLASS &&
+            !env.enclClass.name.isEmpty() &&  //anonymous or intersection
+            tree.type.isRaw()) {
+            log.warning(tree.pos(), "raw.class.use", tree.type, tree.type.tsym.type);
+        }
+    }
 
     /** Visitor method: Validate a list of type expressions.
      */
-    void validate(List<? extends JCTree> trees) {
+    void validate(List<? extends JCTree> trees, Env<AttrContext> env) {
         for (List<? extends JCTree> l = trees; l.nonEmpty(); l = l.tail)
-            validate(l.head);
-    }
-
-    /** Visitor method: Validate a list of type parameters.
-     */
-    void validateTypeParams(List<JCTypeParameter> trees) {
-        for (List<JCTypeParameter> l = trees; l.nonEmpty(); l = l.tail)
-            validate(l.head);
+            validate(l.head, env);
     }
 
     /** A visitor class for type validation.
@@ -791,7 +797,7 @@
     class Validator extends JCTree.Visitor {
 
         public void visitTypeArray(JCArrayTypeTree tree) {
-            validate(tree.elemtype);
+            validate(tree.elemtype, env);
         }
 
         public void visitTypeApply(JCTypeApply tree) {
@@ -805,7 +811,7 @@
                 // For matching pairs of actual argument types `a' and
                 // formal type parameters with declared bound `b' ...
                 while (args.nonEmpty() && forms.nonEmpty()) {
-                    validate(args.head);
+                    validate(args.head, env);
 
                     // exact type arguments needs to know their
                     // bounds (for upper and lower bound
@@ -849,14 +855,14 @@
         }
 
         public void visitTypeParameter(JCTypeParameter tree) {
-            validate(tree.bounds);
+            validate(tree.bounds, env);
             checkClassBounds(tree.pos(), tree.type);
         }
 
         @Override
         public void visitWildcard(JCWildcard tree) {
             if (tree.inner != null)
-                validate(tree.inner);
+                validate(tree.inner, env);
         }
 
         public void visitSelect(JCFieldAccess tree) {
@@ -870,7 +876,7 @@
             }
         }
         public void visitSelectInternal(JCFieldAccess tree) {
-            if (tree.type.getEnclosingType().tag != CLASS &&
+            if (tree.type.tsym.isStatic() &&
                 tree.selected.type.isParameterized()) {
                 // The enclosing type is not a class, so we are
                 // looking at a static member type.  However, the
@@ -878,7 +884,7 @@
                 log.error(tree.pos(), "cant.select.static.class.from.param.type");
             } else {
                 // otherwise validate the rest of the expression
-                validate(tree.selected);
+                tree.selected.accept(this);
             }
         }
 
@@ -886,6 +892,8 @@
          */
         public void visitTree(JCTree tree) {
         }
+
+        Env<AttrContext> env;
     }
 
 /* *************************************************************************
diff --git a/src/share/classes/com/sun/tools/javac/comp/Todo.java b/src/share/classes/com/sun/tools/javac/comp/Todo.java
index 3dd4c0f..bab5bbc 100644
--- a/src/share/classes/com/sun/tools/javac/comp/Todo.java
+++ b/src/share/classes/com/sun/tools/javac/comp/Todo.java
@@ -25,7 +25,14 @@
 
 package com.sun.tools.javac.comp;
 
-import com.sun.tools.javac.util.*;
+import java.util.AbstractQueue;
+import com.sun.tools.javac.util.Context;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Queue;
+import javax.tools.JavaFileObject;
 
 /** A queue of all as yet unattributed classes.
  *
@@ -34,7 +41,7 @@
  *  This code and its internal interfaces are subject to change or
  *  deletion without notice.</b>
  */
-public class Todo extends ListBuffer<Env<AttrContext>> {
+public class Todo extends AbstractQueue<Env<AttrContext>> {
     /** The context key for the todo list. */
     protected static final Context.Key<Todo> todoKey =
         new Context.Key<Todo>();
@@ -51,4 +58,115 @@
     protected Todo(Context context) {
         context.put(todoKey, this);
     }
+
+    public void append(Env<AttrContext> env) {
+        add(env);
+    }
+
+    @Override
+    public Iterator<Env<AttrContext>> iterator() {
+        return contents.iterator();
+    }
+
+    @Override
+    public int size() {
+        return contents.size();
+    }
+
+    public boolean offer(Env<AttrContext> e) {
+        if (contents.add(e)) {
+            if (contentsByFile != null)
+                addByFile(e);
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public Env<AttrContext> poll() {
+        if (size() == 0)
+            return null;
+        Env<AttrContext> env = contents.remove(0);
+        if (contentsByFile != null)
+            removeByFile(env);
+        return env;
+    }
+
+    public Env<AttrContext> peek() {
+        return (size() == 0 ? null : contents.get(0));
+    }
+
+    public Queue<Queue<Env<AttrContext>>> groupByFile() {
+        if (contentsByFile == null) {
+            contentsByFile = new LinkedList<Queue<Env<AttrContext>>>();
+            for (Env<AttrContext> env: contents) {
+                addByFile(env);
+            }
+        }
+        return contentsByFile;
+    }
+
+    private void addByFile(Env<AttrContext> env) {
+        JavaFileObject file = env.toplevel.sourcefile;
+        if (fileMap == null)
+            fileMap = new HashMap<JavaFileObject, FileQueue>();
+        FileQueue fq = fileMap.get(file);
+        if (fq == null) {
+            fq = new FileQueue();
+            fileMap.put(file, fq);
+            contentsByFile.add(fq);
+        }
+        fq.fileContents.add(env);
+    }
+
+    private void removeByFile(Env<AttrContext> env) {
+        JavaFileObject file = env.toplevel.sourcefile;
+        FileQueue fq = fileMap.get(file);
+        if (fq == null)
+            return;
+        if (fq.fileContents.remove(env)) {
+            if (fq.isEmpty()) {
+                fileMap.remove(file);
+                contentsByFile.remove(fq);
+            }
+        }
+    }
+
+    LinkedList<Env<AttrContext>> contents = new LinkedList<Env<AttrContext>>();
+    LinkedList<Queue<Env<AttrContext>>> contentsByFile;
+    Map<JavaFileObject, FileQueue> fileMap;
+
+    class FileQueue extends AbstractQueue<Env<AttrContext>> {
+        @Override
+        public Iterator<Env<AttrContext>> iterator() {
+            return fileContents.iterator();
+        }
+
+        @Override
+        public int size() {
+            return fileContents.size();
+        }
+
+        public boolean offer(Env<AttrContext> e) {
+            if (fileContents.offer(e)) {
+                contents.add(e);
+                return true;
+            }
+            return false;
+        }
+
+        public Env<AttrContext> poll() {
+            if (fileContents.size() == 0)
+                return null;
+            Env<AttrContext> env = fileContents.remove(0);
+            contents.remove(env);
+            return env;
+        }
+
+        public Env<AttrContext> peek() {
+            return (fileContents.size() == 0 ? null : fileContents.get(0));
+        }
+
+        LinkedList<Env<AttrContext>> fileContents = new LinkedList<Env<AttrContext>>();
+    }
 }
diff --git a/src/share/classes/com/sun/tools/javac/comp/TransTypes.java b/src/share/classes/com/sun/tools/javac/comp/TransTypes.java
index 03530d1..3db0459 100644
--- a/src/share/classes/com/sun/tools/javac/comp/TransTypes.java
+++ b/src/share/classes/com/sun/tools/javac/comp/TransTypes.java
@@ -534,7 +534,7 @@
         tree.truepart = translate(tree.truepart, erasure(tree.type));
         tree.falsepart = translate(tree.falsepart, erasure(tree.type));
         tree.type = erasure(tree.type);
-        result = tree;
+        result = retype(tree, tree.type, pt);
     }
 
    public void visitIf(JCIf tree) {
diff --git a/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java b/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java
index ba05d17..3f4911b 100644
--- a/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java
+++ b/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java
@@ -122,35 +122,47 @@
         }
     }
 
-    private static enum CompilePolicy {
-        /*
-         * Just attribute the parse trees
+    /**
+     * Control how the compiler's latter phases (attr, flow, desugar, generate)
+     * are connected. Each individual file is processed by each phase in turn,
+     * but with different compile policies, you can control the order in which
+     * each class is processed through its next phase.
+     *
+     * <p>Generally speaking, the compiler will "fail fast" in the face of
+     * errors, although not aggressively so. flow, desugar, etc become no-ops
+     * once any errors have occurred. No attempt is currently made to determine
+     * if it might be safe to process a class through its next phase because
+     * it does not depend on any unrelated errors that might have occurred.
+     */
+    protected static enum CompilePolicy {
+        /**
+         * Just attribute the parse trees.
          */
         ATTR_ONLY,
 
-        /*
+        /**
          * Just attribute and do flow analysis on the parse trees.
          * This should catch most user errors.
          */
         CHECK_ONLY,
 
-        /*
+        /**
          * Attribute everything, then do flow analysis for everything,
          * then desugar everything, and only then generate output.
-         * Means nothing is generated if there are any errors in any classes.
+         * This means no output will be generated if there are any
+         * errors in any classes.
          */
         SIMPLE,
 
-        /*
-         * After attributing everything and doing flow analysis,
-         * group the work by compilation unit.
-         * Then, process the work for each compilation unit together.
-         * Means nothing is generated for a compilation unit if the are any errors
-         * in the compilation unit  (or in any preceding compilation unit.)
+        /**
+         * Groups the classes for each source file together, then process
+         * each group in a manner equivalent to the {@code SIMPLE} policy.
+         * This means no output will be generated if there are any
+         * errors in any of the classes in a source file.
          */
         BY_FILE,
 
-        /*
+        /**
          * Completely process each entry on the todo list in turn.
          * -- this is the same for 1.5.
          * Means output might be generated for some classes in a compilation unit
@@ -178,7 +190,7 @@
 
     private static CompilePolicy DEFAULT_COMPILE_POLICY = CompilePolicy.BY_TODO;
 
-    private static enum ImplicitSourcePolicy {
+    protected static enum ImplicitSourcePolicy {
         /** Don't generate or process implicitly read source files. */
         NONE,
         /** Generate classes for implicitly read source files. */
@@ -252,11 +264,11 @@
 
     /** The type eraser.
      */
-    TransTypes transTypes;
+    protected TransTypes transTypes;
 
     /** The syntactic sugar desweetener.
      */
-    Lower lower;
+    protected Lower lower;
 
     /** The annotation annotator.
      */
@@ -788,14 +800,17 @@
                 generate(desugar(flow(attribute(todo))));
                 break;
 
-            case BY_FILE:
-                for (Queue<Env<AttrContext>> queue : groupByFile(flow(attribute(todo))).values())
-                    generate(desugar(queue));
+            case BY_FILE: {
+                    Queue<Queue<Env<AttrContext>>> q = todo.groupByFile();
+                    while (!q.isEmpty() && errorCount() == 0) {
+                        generate(desugar(flow(attribute(q.remove()))));
+                    }
+                }
                 break;
 
             case BY_TODO:
-                while (todo.nonEmpty())
-                    generate(desugar(flow(attribute(todo.next()))));
+                while (!todo.isEmpty())
+                    generate(desugar(flow(attribute(todo.remove()))));
                 break;
 
             default:
@@ -1105,13 +1120,13 @@
     /**
      * Perform dataflow checks on an attributed parse tree.
      */
-    protected void flow(Env<AttrContext> env, ListBuffer<Env<AttrContext>> results) {
+    protected void flow(Env<AttrContext> env, Queue<Env<AttrContext>> results) {
         try {
             if (errorCount() > 0)
                 return;
 
             if (relax || compileStates.isDone(env, CompileState.FLOW)) {
-                results.append(env);
+                results.add(env);
                 return;
             }
 
@@ -1130,7 +1145,7 @@
                 if (errorCount() > 0)
                     return;
 
-                results.append(env);
+                results.add(env);
             }
             finally {
                 log.useSource(prev);
@@ -1284,7 +1299,7 @@
         generate(queue, null);
     }
 
-    public void generate(Queue<Pair<Env<AttrContext>, JCClassDecl>> queue, ListBuffer<JavaFileObject> results) {
+    public void generate(Queue<Pair<Env<AttrContext>, JCClassDecl>> queue, Queue<JavaFileObject> results) {
         boolean usePrintSource = (stubOutput || sourceOutput || printFlat);
 
         for (Pair<Env<AttrContext>, JCClassDecl> x: queue) {
@@ -1294,7 +1309,7 @@
             if (verboseCompilePolicy) {
                 log.printLines(log.noticeWriter, "[generate "
                                + (usePrintSource ? " source" : "code")
-                               + " " + env.enclClass.sym + "]");
+                               + " " + cdef.sym + "]");
             }
 
             if (taskListener != null) {
@@ -1312,7 +1327,7 @@
                 else
                     file = genCode(env, cdef);
                 if (results != null && file != null)
-                    results.append(file);
+                    results.add(file);
             } catch (IOException ex) {
                 log.error(cdef.pos(), "class.cant.write",
                           cdef.sym, ex.getMessage());
diff --git a/src/share/classes/com/sun/tools/javac/resources/compiler.properties b/src/share/classes/com/sun/tools/javac/resources/compiler.properties
index a80253a..3389b1e 100644
--- a/src/share/classes/com/sun/tools/javac/resources/compiler.properties
+++ b/src/share/classes/com/sun/tools/javac/resources/compiler.properties
@@ -770,6 +770,10 @@
 compiler.warn.annotation.method.not.found.reason=\
     Cannot find annotation method ''{1}()'' in type ''{0}'': {2}
 
+compiler.warn.raw.class.use=\
+    [raw-type] found raw type: {0}\n\
+    missing type parameters for generic class {1}
+
 #####
 
 ## The following are tokens which are non-terminals in the language. They should
@@ -823,6 +827,12 @@
 compiler.misc.anonymous.class=\
     <anonymous {0}>
 
+compiler.misc.type.captureof=\
+    capture#{0} of {1}
+
+compiler.misc.type.none=\
+    <none>
+
 compiler.misc.unnamed.package=\
     unnamed package
 
diff --git a/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java b/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java
index d9c6032..94c2ac5 100644
--- a/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java
+++ b/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java
@@ -32,7 +32,6 @@
 import com.sun.tools.javac.util.List;
 
 import java.net.*;
-import java.lang.OutOfMemoryError;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.InvocationTargetException;
@@ -70,7 +69,8 @@
     }
 
     public DocletInvoker(Messager messager,
-                         String docletClassName, String docletPath) {
+                         String docletClassName, String docletPath,
+                         ClassLoader docletParentClassLoader) {
         this.messager = messager;
         this.docletClassName = docletClassName;
 
@@ -82,7 +82,10 @@
         cpString = appendPath(System.getProperty("java.class.path"), cpString);
         cpString = appendPath(docletPath, cpString);
         URL[] urls = pathToURLs(cpString);
-        appClassLoader = new URLClassLoader(urls);
+        if (docletParentClassLoader == null)
+            appClassLoader = new URLClassLoader(urls);
+        else
+            appClassLoader = new URLClassLoader(urls, docletParentClassLoader);
 
         // attempt to find doclet
         Class dc = null;
diff --git a/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java b/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java
index 1552fe1..f1d2e53 100644
--- a/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java
+++ b/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java
@@ -46,8 +46,13 @@
         super(context);
     }
 
-    public ListBuffer<Env<AttrContext>> append(Env<AttrContext> e) {
+    @Override
+    public void append(Env<AttrContext> e) {
         // do nothing; Javadoc doesn't perform attribution.
-        return this;
+    }
+
+    @Override
+    public boolean offer(Env<AttrContext> e) {
+        return false;
     }
 }
diff --git a/src/share/classes/com/sun/tools/javadoc/Main.java b/src/share/classes/com/sun/tools/javadoc/Main.java
index d868938..5d36b98 100644
--- a/src/share/classes/com/sun/tools/javadoc/Main.java
+++ b/src/share/classes/com/sun/tools/javadoc/Main.java
@@ -45,7 +45,7 @@
      * Command line interface.
      * @param args   The command line parameters.
      */
-    public static void main(String[] args) {
+    public static void main(String... args) {
         System.exit(execute(args));
     }
 
@@ -54,18 +54,33 @@
      * @param args   The command line parameters.
      * @return The return code.
      */
-    public static int execute(String[] args) {
+    public static int execute(String... args) {
         Start jdoc = new Start();
         return jdoc.begin(args);
     }
 
     /**
      * Programmatic interface.
+     * @param args   The command line parameters.
+     * @param docletParentClassLoader The parent class loader used when
+     *  creating the doclet classloader. If null, the class loader used
+     *  to instantiate doclets will be created without specifying a parent
+     *  class loader.
+     * @return The return code.
+     * @since 1.7
+     */
+    public static int execute(ClassLoader docletParentClassLoader, String... args) {
+        Start jdoc = new Start(docletParentClassLoader);
+        return jdoc.begin(args);
+    }
+
+    /**
+     * Programmatic interface.
      * @param programName  Name of the program (for error messages).
      * @param args   The command line parameters.
      * @return The return code.
      */
-    public static int execute(String programName, String[] args) {
+    public static int execute(String programName, String... args) {
         Start jdoc = new Start(programName);
         return jdoc.begin(args);
     }
@@ -73,13 +88,29 @@
     /**
      * Programmatic interface.
      * @param programName  Name of the program (for error messages).
+     * @param args   The command line parameters.
+     * @param docletParentClassLoader The parent class loader used when
+     *  creating the doclet classloader. If null, the class loader used
+     *  to instantiate doclets will be created without specifying a parent
+     *  class loader.
+     * @return The return code.
+     * @since 1.7
+     */
+    public static int execute(String programName, ClassLoader docletParentClassLoader, String... args) {
+        Start jdoc = new Start(programName, docletParentClassLoader);
+        return jdoc.begin(args);
+    }
+
+    /**
+     * Programmatic interface.
+     * @param programName  Name of the program (for error messages).
      * @param defaultDocletClassName  Fully qualified class name.
      * @param args   The command line parameters.
      * @return The return code.
      */
     public static int execute(String programName,
                               String defaultDocletClassName,
-                              String[] args) {
+                              String... args) {
         Start jdoc = new Start(programName, defaultDocletClassName);
         return jdoc.begin(args);
     }
@@ -87,6 +118,26 @@
     /**
      * Programmatic interface.
      * @param programName  Name of the program (for error messages).
+     * @param defaultDocletClassName  Fully qualified class name.
+     * @param docletParentClassLoader The parent class loader used when
+     *  creating the doclet classloader. If null, the class loader used
+     *  to instantiate doclets will be created without specifying a parent
+     *  class loader.
+     * @param args   The command line parameters.
+     * @return The return code.
+     * @since 1.7
+     */
+    public static int execute(String programName,
+                              String defaultDocletClassName,
+                              ClassLoader docletParentClassLoader,
+                              String... args) {
+        Start jdoc = new Start(programName, defaultDocletClassName, docletParentClassLoader);
+        return jdoc.begin(args);
+    }
+
+    /**
+     * Programmatic interface.
+     * @param programName  Name of the program (for error messages).
      * @param errWriter    PrintWriter to receive error messages.
      * @param warnWriter    PrintWriter to receive error messages.
      * @param noticeWriter    PrintWriter to receive error messages.
@@ -99,10 +150,39 @@
                               PrintWriter warnWriter,
                               PrintWriter noticeWriter,
                               String defaultDocletClassName,
-                              String[] args) {
+                              String... args) {
         Start jdoc = new Start(programName,
                                errWriter, warnWriter, noticeWriter,
                                defaultDocletClassName);
         return jdoc.begin(args);
     }
+
+    /**
+     * Programmatic interface.
+     * @param programName  Name of the program (for error messages).
+     * @param errWriter    PrintWriter to receive error messages.
+     * @param warnWriter    PrintWriter to receive error messages.
+     * @param noticeWriter    PrintWriter to receive error messages.
+     * @param defaultDocletClassName  Fully qualified class name.
+     * @param docletParentClassLoader The parent class loader used when
+     *  creating the doclet classloader. If null, the class loader used
+     *  to instantiate doclets will be created without specifying a parent
+     *  class loader.
+     * @param args   The command line parameters.
+     * @return The return code.
+     * @since 1.7
+     */
+    public static int execute(String programName,
+                              PrintWriter errWriter,
+                              PrintWriter warnWriter,
+                              PrintWriter noticeWriter,
+                              String defaultDocletClassName,
+                              ClassLoader docletParentClassLoader,
+                              String... args) {
+        Start jdoc = new Start(programName,
+                               errWriter, warnWriter, noticeWriter,
+                               defaultDocletClassName,
+                               docletParentClassLoader);
+        return jdoc.begin(args);
+    }
 }
diff --git a/src/share/classes/com/sun/tools/javadoc/Start.java b/src/share/classes/com/sun/tools/javadoc/Start.java
index 1ce740d..7452a6a 100644
--- a/src/share/classes/com/sun/tools/javadoc/Start.java
+++ b/src/share/classes/com/sun/tools/javadoc/Start.java
@@ -28,17 +28,11 @@
 import com.sun.javadoc.*;
 
 import com.sun.tools.javac.main.CommandLine;
-import com.sun.tools.javac.main.JavaCompiler;
 import com.sun.tools.javac.util.Context;
 import com.sun.tools.javac.util.List;
 import com.sun.tools.javac.util.ListBuffer;
 import com.sun.tools.javac.util.Options;
 
-import com.sun.tools.javadoc.Messager;
-import com.sun.tools.javadoc.DocletInvoker;
-import com.sun.tools.javadoc.RootDocImpl;
-import com.sun.tools.javadoc.ModifierFilter;
-
 import java.io.IOException;
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -60,10 +54,8 @@
     /** Context for this invocation. */
     private final Context context;
 
-    /**
-     * Name of the program
-     */
     private final String defaultDocletClassName;
+    private final ClassLoader docletParentClassLoader;
 
     private static final String javadocName = "javadoc";
 
@@ -97,21 +89,45 @@
           PrintWriter warnWriter,
           PrintWriter noticeWriter,
           String defaultDocletClassName) {
+        this(programName, errWriter, warnWriter, noticeWriter, defaultDocletClassName, null);
+    }
+
+    Start(String programName,
+          PrintWriter errWriter,
+          PrintWriter warnWriter,
+          PrintWriter noticeWriter,
+          String defaultDocletClassName,
+          ClassLoader docletParentClassLoader) {
         context = new Context();
         messager = new Messager(context, programName, errWriter, warnWriter, noticeWriter);
         this.defaultDocletClassName = defaultDocletClassName;
+        this.docletParentClassLoader = docletParentClassLoader;
     }
 
     Start(String programName, String defaultDocletClassName) {
+        this(programName, defaultDocletClassName, null);
+    }
+
+    Start(String programName, String defaultDocletClassName,
+          ClassLoader docletParentClassLoader) {
         context = new Context();
         messager = new Messager(context, programName);
         this.defaultDocletClassName = defaultDocletClassName;
+        this.docletParentClassLoader = docletParentClassLoader;
+    }
+
+    Start(String programName, ClassLoader docletParentClassLoader) {
+        this(programName, standardDocletClassName, docletParentClassLoader);
     }
 
     Start(String programName) {
         this(programName, standardDocletClassName);
     }
 
+    Start(ClassLoader docletParentClassLoader) {
+        this(javadocName, docletParentClassLoader);
+    }
+
     Start() {
         this(javadocName);
     }
@@ -139,7 +155,7 @@
     /**
      * Main program - external wrapper
      */
-    int begin(String argv[]) {
+    int begin(String... argv) {
         boolean failed = false;
 
         try {
@@ -178,7 +194,7 @@
     /**
      * Main program - internal
      */
-    private boolean parseAndExecute(String argv[]) throws IOException {
+    private boolean parseAndExecute(String... argv) throws IOException {
         long tm = System.currentTimeMillis();
 
         ListBuffer<String> javaNames = new ListBuffer<String>();
@@ -396,7 +412,8 @@
 
         // attempt to find doclet
         docletInvoker = new DocletInvoker(messager,
-                                          docletClassName, docletPath);
+                                          docletClassName, docletPath,
+                                          docletParentClassLoader);
     }
 
     private void setFilter(long filterBits) {
diff --git a/src/share/classes/javax/tools/FileObject.java b/src/share/classes/javax/tools/FileObject.java
index 046ad95..bbf5037 100644
--- a/src/share/classes/javax/tools/FileObject.java
+++ b/src/share/classes/javax/tools/FileObject.java
@@ -26,12 +26,10 @@
 package javax.tools;
 
 import java.io.IOException;
-import java.io.CharConversionException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.Reader;
 import java.io.Writer;
-import java.nio.CharBuffer;
 import java.net.URI;
 
 /**
diff --git a/test/tools/javac/6304921/T6304921.out b/test/tools/javac/6304921/T6304921.out
index 32218ac..4a8cb59 100644
--- a/test/tools/javac/6304921/T6304921.out
+++ b/test/tools/javac/6304921/T6304921.out
@@ -1,3 +1,7 @@
+T6304921.java:671/671/680: warning: [raw-type] found raw type: java.util.ArrayList
+missing type parameters for generic class java.util.ArrayList<E>
+        List<Integer> list = new ArrayList();
+                                 ^
 T6304921.java:667/667/682: warning: [unchecked] unchecked conversion
 found   : java.util.ArrayList
 required: java.util.List<java.lang.Integer>
@@ -18,4 +22,4 @@
         return 123 + true; // bad binary expression
                    ^
 2 errors
-3 warnings
+4 warnings
diff --git a/test/tools/javac/6734819/T6734819b.out b/test/tools/javac/6734819/T6734819b.out
index 4b25a08..3d71533 100644
--- a/test/tools/javac/6734819/T6734819b.out
+++ b/test/tools/javac/6734819/T6734819b.out
@@ -5,5 +5,5 @@
 [desugar A]
 [generate code A]
 [desugar B]
-[generate code B]
+[generate code B.C]
 [generate code B]
diff --git a/test/tools/javac/conditional/6500343/T6500343a.java b/test/tools/javac/conditional/6500343/T6500343a.java
new file mode 100644
index 0000000..98cd281
--- /dev/null
+++ b/test/tools/javac/conditional/6500343/T6500343a.java
@@ -0,0 +1,50 @@
+/*
+ * 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 6500343
+ * @summary compiler generates bad code when translating conditional expressions
+ * @author Maurizio Cimadamore
+ *
+ */
+
+public class T6500343a {
+    static class Base {}
+    static interface I {}
+    static class A1 extends Base implements I {}
+    static class A2 extends Base implements I {}
+
+    static Object crash(I i, A1 a1, A2 a2, boolean b1, boolean b2) {
+        return b1 ? i : b2 ? a2 : a1;
+        // lub(I, lub(A1, A2)) ==> lub(I, Base&I) ==> I (doesn't compile on 1.4 ok >1.5)
+    }
+
+    public static void main(String[] args) {
+        T6500343a.crash(new A1(), new A1(), new A2(), true, false);
+        T6500343a.crash(new A1(), new A1(), new A2(), false, true);
+        T6500343a.crash(new A1(), new A1(), new A2(), false, false);
+        T6500343a.crash(new A1(), new A1(), new A2(), true, true);
+    }
+}
+
diff --git a/test/tools/javac/conditional/6500343/T6500343b.java b/test/tools/javac/conditional/6500343/T6500343b.java
new file mode 100644
index 0000000..1ddf332
--- /dev/null
+++ b/test/tools/javac/conditional/6500343/T6500343b.java
@@ -0,0 +1,48 @@
+/*
+ * 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 6500343
+ * @summary compiler generates bad code when translating conditional expressions
+ * @author Maurizio Cimadamore
+ *
+ */
+
+public class T6500343b {
+
+    final static int i1 = 0;
+    final static int i2 = 1;
+
+    static void crash(int i) {
+        switch (i) {
+            case (true ? 0 : 1):
+            case (i1 == 5 ? 1 : 2):
+            case (i1 == i2 ? 2 : 3):
+        }
+    }
+
+    public static void main(String[] args) {
+        T6500343b.crash(0);
+    }
+}
diff --git a/test/tools/javac/policy/A.java b/test/tools/javac/policy/test1/A.java
similarity index 100%
rename from test/tools/javac/policy/A.java
rename to test/tools/javac/policy/test1/A.java
diff --git a/test/tools/javac/policy/B.java b/test/tools/javac/policy/test1/B.java
similarity index 100%
rename from test/tools/javac/policy/B.java
rename to test/tools/javac/policy/test1/B.java
diff --git a/test/tools/javac/policy/C.java b/test/tools/javac/policy/test1/C.java
similarity index 100%
rename from test/tools/javac/policy/C.java
rename to test/tools/javac/policy/test1/C.java
diff --git a/test/tools/javac/policy/D.java b/test/tools/javac/policy/test1/D.java
similarity index 100%
rename from test/tools/javac/policy/D.java
rename to test/tools/javac/policy/test1/D.java
diff --git a/test/tools/javac/policy/Test.java b/test/tools/javac/policy/test1/Test1a.java
similarity index 88%
rename from test/tools/javac/policy/Test.java
rename to test/tools/javac/policy/test1/Test1a.java
index 694daa8..5e85002 100644
--- a/test/tools/javac/policy/Test.java
+++ b/test/tools/javac/policy/test1/Test1a.java
@@ -21,6 +21,14 @@
  * have any questions.
  */
 
+// These tests exercise the various compile policies available via
+// JavaCompiler.CompilePolicy. Like any golden file tests, they are
+// somewhat fragile and susceptible to breakage, but like the canary
+// in the mine, it is useful to know when something is not as it used
+// to be. The golden files should not be taken as a guarantee of
+// future behavior, and should be updated, with due care, if the
+// behavior of the compile policy is deliberately changed.
+
 /*
  * @test
  * @bug 6260188 6290772
diff --git a/test/tools/javac/policy/test1/Test1b.java b/test/tools/javac/policy/test1/Test1b.java
new file mode 100644
index 0000000..8cf3d4d
--- /dev/null
+++ b/test/tools/javac/policy/test1/Test1b.java
@@ -0,0 +1,156 @@
+/*
+ * 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 6420151
+ * @summary Compile a group of files and validate the set of class files produced
+ * @run main Test1b -XDcompilePolicy=byfile A.java B.java D.java
+ */
+
+/*
+ * @test 6420151
+ * @summary Compile a group of files and validate the set of class files produced
+ * @run main Test1b -XDcompilePolicy=byfile A.java C.java D.java
+ */
+
+/*
+ * @test 6420151
+ * @summary Compile a group of files and validate the set of class files produced
+ * @run main Test1b -XDcompilePolicy=simple A.java B.java D.java
+ */
+
+/*
+ * @test 6420151
+ * @summary Compile a group of files and validate the set of class files produced
+ * @run main Test1b -XDcompilePolicy=simple A.java C.java D.java
+ */
+
+// These test cases should be uncommented when the default compile policy is
+// changed to "byfile".  While the default policy is "bytodo", the test cases fail
+///*
+// * @test 6420151
+// * @summary Compile a group of files and validate the set of class files produced
+// * @run main Test1b A.java B.java D.java
+// */
+//
+///*
+// * @test 6420151
+// * @summary Compile a group of files and validate the set of class files produced
+// * @run main Test1b A.java C.java D.java
+// */
+
+// These test cases are retained for debugging; if uncommented, they show that
+// to bytodo mode fails the "all or none" class file test
+///*
+// * @test 6420151
+// * @summary Compile a group of files and validate the set of class files produced
+// * @run main Test1b -XDcompilePolicy=bytodo A.java B.java D.java
+// */
+//
+///*
+// * @test 6420151
+// * @summary Compile a group of files and validate the set of class files produced
+// * @run main Test1b -XDcompilePolicy=bytodo A.java C.java D.java
+// */
+
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class Test1b
+{
+    public static void main(String... args) throws Exception {
+        new Test1b().run(args);
+    }
+
+    void run(String... args) throws Exception {
+        File testSrcDir = new File(System.getProperty("test.src"));
+        File tmpClassDir = new File(".");
+        List<String> l = new ArrayList<String>();
+        l.add("-d");
+        l.add(tmpClassDir.getPath());
+        for (String a: args) {
+            if (a.endsWith(".java"))
+                l.add(new File(testSrcDir, a).getPath());
+            else
+                l.add(a);
+        }
+
+        StringWriter sw = new StringWriter();
+        int rc = com.sun.tools.javac.Main.compile(l.toArray(new String[l.size()]), new PrintWriter(sw));
+        System.err.println(sw);
+
+        Pattern p = Pattern.compile("([A-Z]+).*");
+        for (String name: tmpClassDir.list()) {
+            if (name.endsWith(".class")) {
+                Matcher m = p.matcher(name);
+                if (m.matches()) {
+                    found(m.group(1), name);
+                }
+            }
+        }
+
+        // for all classes that might have been compiled, check that
+        // all the classes in the source file get generated, or none do.
+        check("A", 3);
+        check("B", 3);
+        check("C", 3);
+        check("D", 3);
+
+        if (errors > 0)
+            throw new Exception(errors + " errors");
+    }
+
+    void check(String prefix, int expect) {
+        List<String> names = map.get(prefix);
+        int found = (names == null ? 0 : names.size());
+        if (found == 0 || found == expect) {
+            System.err.println("Found " + found + " files for " + prefix + ": OK");
+            return;
+        }
+        error("Found " + found + " files for " + prefix + ": expected 0 or " + expect + " " + names);
+    }
+
+    void found(String prefix, String name) {
+        List<String> names = map.get(prefix);
+        if (names == null) {
+            names = new ArrayList<String>();
+            map.put(prefix, names);
+        }
+        names.add(name);
+    }
+
+    void error(String message) {
+        System.err.println(message);
+        errors++;
+    }
+
+    Map<String,List<String>> map = new HashMap<String,List<String>>();
+    int errors;
+}
diff --git a/test/tools/javac/policy/byfile.ABD.out b/test/tools/javac/policy/test1/byfile.ABD.out
similarity index 60%
rename from test/tools/javac/policy/byfile.ABD.out
rename to test/tools/javac/policy/test1/byfile.ABD.out
index ac67dbd..4ad8736 100644
--- a/test/tools/javac/policy/byfile.ABD.out
+++ b/test/tools/javac/policy/test1/byfile.ABD.out
@@ -1,11 +1,17 @@
 [attribute A]
 [attribute A1]
 [attribute A2]
+[flow A]
+[flow A1]
+[flow A2]
+[desugar A]
+[desugar A1]
+[desugar A2]
+[generate code A]
+[generate code A1]
+[generate code A2]
 [attribute B]
 [attribute B1]
 B.java:12:9: compiler.err.cant.resolve.location: kindname.variable, x, , , kindname.class, B1
 [attribute B2]
-[attribute D]
-[attribute D1]
-[attribute D2]
 1 error
diff --git a/test/tools/javac/policy/byfile.ACD.out b/test/tools/javac/policy/test1/byfile.ACD.out
similarity index 66%
rename from test/tools/javac/policy/byfile.ACD.out
rename to test/tools/javac/policy/test1/byfile.ACD.out
index 02598f1..66534ce 100644
--- a/test/tools/javac/policy/byfile.ACD.out
+++ b/test/tools/javac/policy/test1/byfile.ACD.out
@@ -1,15 +1,18 @@
 [attribute A]
 [attribute A1]
 [attribute A2]
-[attribute C]
-[attribute C1]
-[attribute C2]
-[attribute D]
-[attribute D1]
-[attribute D2]
 [flow A]
 [flow A1]
 [flow A2]
+[desugar A]
+[desugar A1]
+[desugar A2]
+[generate code A]
+[generate code A1]
+[generate code A2]
+[attribute C]
+[attribute C1]
+[attribute C2]
 [flow C]
 [flow C1]
 C.java:12:17: compiler.err.unreachable.stmt
diff --git a/test/tools/javac/policy/bytodo.ABD.out b/test/tools/javac/policy/test1/bytodo.ABD.out
similarity index 100%
rename from test/tools/javac/policy/bytodo.ABD.out
rename to test/tools/javac/policy/test1/bytodo.ABD.out
diff --git a/test/tools/javac/policy/bytodo.ACD.out b/test/tools/javac/policy/test1/bytodo.ACD.out
similarity index 100%
rename from test/tools/javac/policy/bytodo.ACD.out
rename to test/tools/javac/policy/test1/bytodo.ACD.out
diff --git a/test/tools/javac/policy/simple.ABD.out b/test/tools/javac/policy/test1/simple.ABD.out
similarity index 100%
rename from test/tools/javac/policy/simple.ABD.out
rename to test/tools/javac/policy/test1/simple.ABD.out
diff --git a/test/tools/javac/policy/simple.ACD.out b/test/tools/javac/policy/test1/simple.ACD.out
similarity index 100%
rename from test/tools/javac/policy/simple.ACD.out
rename to test/tools/javac/policy/test1/simple.ACD.out
diff --git a/test/tools/javac/policy/test2/A.java b/test/tools/javac/policy/test2/A.java
new file mode 100644
index 0000000..924b612
--- /dev/null
+++ b/test/tools/javac/policy/test2/A.java
@@ -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.
+ */
+
+class A {
+
+    class A1 {
+    }
+
+    static class A2 extends B {
+    }
+
+    static class A3 extends B.Inner {
+    }
+
+    class A4 {
+        void m1() {
+            class A3m1 { }
+        }
+
+        void m2() {
+            new B() {
+            };
+        }
+    }
+
+}
diff --git a/test/tools/javac/policy/test2/B.java b/test/tools/javac/policy/test2/B.java
new file mode 100644
index 0000000..234b3f4
--- /dev/null
+++ b/test/tools/javac/policy/test2/B.java
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+class B {
+    static class Inner {
+    }
+}
diff --git a/test/tools/javac/policy/test2/Test.java b/test/tools/javac/policy/test2/Test.java
new file mode 100644
index 0000000..604ae20
--- /dev/null
+++ b/test/tools/javac/policy/test2/Test.java
@@ -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
+ * @compile/ref=byfile.AB.out -XDstdout -XDverboseCompilePolicy -XDcompile.policy=byfile A.java B.java
+ */
+
+/*
+ * @test
+ * @compile/ref=byfile.BA.out -XDstdout -XDverboseCompilePolicy -XDcompile.policy=byfile B.java A.java
+ */
+
+/*
+ * @test
+ * @compile/ref=bytodo.AB.out -XDstdout -XDverboseCompilePolicy -XDcompile.policy=bytodo A.java B.java
+ */
+
+/*
+ * @test
+ * @compile/ref=bytodo.BA.out -XDstdout -XDverboseCompilePolicy -XDcompile.policy=bytodo B.java A.java
+ */
diff --git a/test/tools/javac/policy/test2/byfile.AB.out b/test/tools/javac/policy/test2/byfile.AB.out
new file mode 100644
index 0000000..fdc7d87
--- /dev/null
+++ b/test/tools/javac/policy/test2/byfile.AB.out
@@ -0,0 +1,15 @@
+[attribute A]
+[flow A]
+[attribute B]
+[flow B]
+[desugar A]
+[generate code A.A1]
+[generate code A.A2]
+[generate code A.A3]
+[generate code A3m1]
+[generate code <anonymous A$A4$1>]
+[generate code A.A4]
+[generate code A]
+[desugar B]
+[generate code B.Inner]
+[generate code B]
diff --git a/test/tools/javac/policy/test2/byfile.BA.out b/test/tools/javac/policy/test2/byfile.BA.out
new file mode 100644
index 0000000..565ad13
--- /dev/null
+++ b/test/tools/javac/policy/test2/byfile.BA.out
@@ -0,0 +1,15 @@
+[attribute B]
+[flow B]
+[desugar B]
+[generate code B.Inner]
+[generate code B]
+[attribute A]
+[flow A]
+[desugar A]
+[generate code A.A1]
+[generate code A.A2]
+[generate code A.A3]
+[generate code A3m1]
+[generate code <anonymous A$A4$1>]
+[generate code A.A4]
+[generate code A]
diff --git a/test/tools/javac/policy/test2/bytodo.AB.out b/test/tools/javac/policy/test2/bytodo.AB.out
new file mode 100644
index 0000000..fdc7d87
--- /dev/null
+++ b/test/tools/javac/policy/test2/bytodo.AB.out
@@ -0,0 +1,15 @@
+[attribute A]
+[flow A]
+[attribute B]
+[flow B]
+[desugar A]
+[generate code A.A1]
+[generate code A.A2]
+[generate code A.A3]
+[generate code A3m1]
+[generate code <anonymous A$A4$1>]
+[generate code A.A4]
+[generate code A]
+[desugar B]
+[generate code B.Inner]
+[generate code B]
diff --git a/test/tools/javac/policy/test2/bytodo.BA.out b/test/tools/javac/policy/test2/bytodo.BA.out
new file mode 100644
index 0000000..565ad13
--- /dev/null
+++ b/test/tools/javac/policy/test2/bytodo.BA.out
@@ -0,0 +1,15 @@
+[attribute B]
+[flow B]
+[desugar B]
+[generate code B.Inner]
+[generate code B]
+[attribute A]
+[flow A]
+[desugar A]
+[generate code A.A1]
+[generate code A.A2]
+[generate code A.A3]
+[generate code A3m1]
+[generate code <anonymous A$A4$1>]
+[generate code A.A4]
+[generate code A]
diff --git a/test/tools/javac/warnings/6747671/T6747671.java b/test/tools/javac/warnings/6747671/T6747671.java
new file mode 100644
index 0000000..e7597b5
--- /dev/null
+++ b/test/tools/javac/warnings/6747671/T6747671.java
@@ -0,0 +1,58 @@
+/*
+ * 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 6747671
+ * @summary -Xlint:rawtypes
+ * @compile/ref=T6747671.out -XDrawDiagnostics -Xlint:rawtypes T6747671.java
+ */
+
+
+class T6747671<E> {
+
+    static class B<X> {}
+
+    class A<X> {
+        class X {}
+        class Z<Y> {}
+    }
+
+
+    A.X x1;//raw warning
+    A.Z z1;//raw warning
+
+    T6747671.B<Integer> b1;//ok
+    T6747671.B b2;//raw warning
+
+    A<String>.X x2;//ok
+    A<String>.Z<Integer> z2;//ok
+    A<B>.Z<A<B>> z3;//raw warning (2)
+
+    void test(Object arg1, B arg2) {//raw warning
+        boolean b = arg1 instanceof A;//raw warning
+        Object a = (A)arg1;//raw warning
+        A a2 = new A() {};//raw warning (2)
+        a2.new Z() {};//raw warning
+    }
+}
\ No newline at end of file
diff --git a/test/tools/javac/warnings/6747671/T6747671.out b/test/tools/javac/warnings/6747671/T6747671.out
new file mode 100644
index 0000000..6e8c357
--- /dev/null
+++ b/test/tools/javac/warnings/6747671/T6747671.out
@@ -0,0 +1,12 @@
+T6747671.java:42:6: compiler.warn.raw.class.use: T6747671.A.X, T6747671<E>.A<X>.X
+T6747671.java:43:6: compiler.warn.raw.class.use: T6747671.A.Z, T6747671<E>.A<X>.Z<Y>
+T6747671.java:46:13: compiler.warn.raw.class.use: T6747671.B, T6747671.B<X>
+T6747671.java:50:14: compiler.warn.raw.class.use: T6747671.B, T6747671.B<X>
+T6747671.java:50:7: compiler.warn.raw.class.use: T6747671.B, T6747671.B<X>
+T6747671.java:52:28: compiler.warn.raw.class.use: T6747671.B, T6747671.B<X>
+T6747671.java:53:37: compiler.warn.raw.class.use: T6747671.A, T6747671<E>.A<X>
+T6747671.java:54:21: compiler.warn.raw.class.use: T6747671.A, T6747671<E>.A<X>
+T6747671.java:55:9: compiler.warn.raw.class.use: T6747671.A, T6747671<E>.A<X>
+T6747671.java:55:20: compiler.warn.raw.class.use: T6747671.A, T6747671<E>.A<X>
+T6747671.java:56:16: compiler.warn.raw.class.use: T6747671.A.Z, T6747671<E>.A<X>.Z<Y>
+11 warnings
\ No newline at end of file
diff --git a/test/tools/javac/warnings/Unchecked.lintAll.out b/test/tools/javac/warnings/Unchecked.lintAll.out
index cb9e1ca..cc6e8d3 100644
--- a/test/tools/javac/warnings/Unchecked.lintAll.out
+++ b/test/tools/javac/warnings/Unchecked.lintAll.out
@@ -1,3 +1,8 @@
+Unchecked.java:16:9: compiler.warn.raw.class.use: java.util.List, java.util.List<E>
 Unchecked.java:17:14: compiler.warn.unchecked.call.mbr.of.raw.type: add(E), java.util.List
+Unchecked.java:26:9: compiler.warn.raw.class.use: java.util.List, java.util.List<E>
+Unchecked.java:35:9: compiler.warn.raw.class.use: java.util.List, java.util.List<E>
+Unchecked.java:46:21: compiler.warn.raw.class.use: java.util.List, java.util.List<E>
+Unchecked.java:57:9: compiler.warn.raw.class.use: java.util.List, java.util.List<E>
 Unchecked.java:58:14: compiler.warn.unchecked.call.mbr.of.raw.type: add(E), java.util.List
-2 warnings
+7 warnings
\ No newline at end of file