# HG changeset patch # User asaha # Date 1434608980 25200 # Node ID 57a11f869f0a469798d571197403947bdd8f0525 # Parent 0c9b87169d91d05c117332d933fa4bc336964903# Parent 09909d7ccc23e7e97de2289c506a2fedbac25ed0 Merge diff -r 0c9b87169d91 -r 57a11f869f0a .hgtags --- a/.hgtags Mon Jun 15 11:41:41 2015 -0700 +++ b/.hgtags Wed Jun 17 23:29:40 2015 -0700 @@ -442,6 +442,7 @@ 87dcdc1fd75bf827c8a4596b183de7ea73cb75e1 jdk8u60-b17 e7e42c79861ea1ab7495de5f238c01f98035a8a8 jdk8u60-b18 0366d7f1faa12ed35694571c151524e0847f05ff jdk8u60-b19 +976523f1d5626bdb6dd47883e2734614b64a5e61 jdk8u60-b20 779397f90251ea813cb44621dc27f780e5c20449 jdk8u52-b06 e0ce6be9142ed1e2f0ce3ee13090ec01c6c44721 jdk8u52-b07 779397f90251ea813cb44621dc27f780e5c20449 jdk8u65-b00 diff -r 0c9b87169d91 -r 57a11f869f0a src/share/classes/com/sun/tools/javac/code/Scope.java --- a/src/share/classes/com/sun/tools/javac/code/Scope.java Mon Jun 15 11:41:41 2015 -0700 +++ b/src/share/classes/com/sun/tools/javac/code/Scope.java Wed Jun 17 23:29:40 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -241,12 +241,16 @@ listeners = listeners.prepend(sl); } - /** Remove symbol from this scope. Used when an inner class - * attribute tells us that the class isn't a package member. + /** Remove symbol from this scope. */ - public void remove(Symbol sym) { + public void remove(final Symbol sym) { Assert.check(shared == 0); - Entry e = lookup(sym.name); + Entry e = lookup(sym.name, new Filter() { + @Override + public boolean accepts(Symbol candidate) { + return candidate == sym; + } + }); if (e.scope == null) return; // remove e from table and shadowed list; diff -r 0c9b87169d91 -r 57a11f869f0a src/share/classes/com/sun/tools/javac/code/Types.java --- a/src/share/classes/com/sun/tools/javac/code/Types.java Mon Jun 15 11:41:41 2015 -0700 +++ b/src/share/classes/com/sun/tools/javac/code/Types.java Wed Jun 17 23:29:40 2015 -0700 @@ -2694,74 +2694,98 @@ // // - class MembersClosureCache extends SimpleVisitor { - - private WeakHashMap _map = - new WeakHashMap(); - - class Entry { - final boolean skipInterfaces; - final CompoundScope compoundScope; - - public Entry(boolean skipInterfaces, CompoundScope compoundScope) { - this.skipInterfaces = skipInterfaces; - this.compoundScope = compoundScope; + class MembersClosureCache extends SimpleVisitor { + + private Map _map = new HashMap<>(); + + Set seenTypes = new HashSet<>(); + + class MembersScope extends CompoundScope { + + CompoundScope scope; + + public MembersScope(CompoundScope scope) { + super(scope.owner); + this.scope = scope; } - boolean matches(boolean skipInterfaces) { - return this.skipInterfaces == skipInterfaces; + Filter combine(final Filter sf) { + return new Filter() { + @Override + public boolean accepts(Symbol s) { + return !s.owner.isInterface() && (sf == null || sf.accepts(s)); + } + }; + } + + @Override + public Iterable getElements(Filter sf) { + return scope.getElements(combine(sf)); + } + + @Override + public Iterable getElementsByName(Name name, Filter sf) { + return scope.getElementsByName(name, combine(sf)); + } + + @Override + public int getMark() { + return scope.getMark(); } } - List seenTypes = List.nil(); + CompoundScope nilScope; /** members closure visitor methods **/ - public CompoundScope visitType(Type t, Boolean skipInterface) { - return null; + public CompoundScope visitType(Type t, Void _unused) { + if (nilScope == null) { + nilScope = new CompoundScope(syms.noSymbol); + } + return nilScope; } @Override - public CompoundScope visitClassType(ClassType t, Boolean skipInterface) { - if (seenTypes.contains(t.tsym)) { + public CompoundScope visitClassType(ClassType t, Void _unused) { + if (!seenTypes.add(t.tsym)) { //this is possible when an interface is implemented in multiple - //superclasses, or when a classs hierarchy is circular - in such + //superclasses, or when a class hierarchy is circular - in such //cases we don't need to recurse (empty scope is returned) return new CompoundScope(t.tsym); } try { - seenTypes = seenTypes.prepend(t.tsym); + seenTypes.add(t.tsym); ClassSymbol csym = (ClassSymbol)t.tsym; - Entry e = _map.get(csym); - if (e == null || !e.matches(skipInterface)) { - CompoundScope membersClosure = new CompoundScope(csym); - if (!skipInterface) { - for (Type i : interfaces(t)) { - membersClosure.addSubScope(visit(i, skipInterface)); - } + CompoundScope membersClosure = _map.get(csym); + if (membersClosure == null) { + membersClosure = new CompoundScope(csym); + for (Type i : interfaces(t)) { + membersClosure.addSubScope(visit(i, null)); } - membersClosure.addSubScope(visit(supertype(t), skipInterface)); + membersClosure.addSubScope(visit(supertype(t), null)); membersClosure.addSubScope(csym.members()); - e = new Entry(skipInterface, membersClosure); - _map.put(csym, e); + _map.put(csym, membersClosure); } - return e.compoundScope; + return membersClosure; } finally { - seenTypes = seenTypes.tail; + seenTypes.remove(t.tsym); } } @Override - public CompoundScope visitTypeVar(TypeVar t, Boolean skipInterface) { - return visit(t.getUpperBound(), skipInterface); + public CompoundScope visitTypeVar(TypeVar t, Void _unused) { + return visit(t.getUpperBound(), null); } } private MembersClosureCache membersCache = new MembersClosureCache(); public CompoundScope membersClosure(Type site, boolean skipInterface) { - return membersCache.visit(site, skipInterface); + CompoundScope cs = membersCache.visit(site, null); + if (cs == null) + Assert.error("type " + site); + return skipInterface ? membersCache.new MembersScope(cs) : cs; } // diff -r 0c9b87169d91 -r 57a11f869f0a src/share/classes/com/sun/tools/javac/comp/Attr.java --- a/src/share/classes/com/sun/tools/javac/comp/Attr.java Mon Jun 15 11:41:41 2015 -0700 +++ b/src/share/classes/com/sun/tools/javac/comp/Attr.java Wed Jun 17 23:29:40 2015 -0700 @@ -825,9 +825,18 @@ } public void visitClassDef(JCClassDecl tree) { - // Local classes have not been entered yet, so we need to do it now: - if ((env.info.scope.owner.kind & (VAR | MTH)) != 0) + // Local and anonymous classes have not been entered yet, so we need to + // do it now. + if ((env.info.scope.owner.kind & (VAR | MTH)) != 0) { enter.classEnter(tree, env); + } else { + // If this class declaration is part of a class level annotation, + // as in @MyAnno(new Object() {}) class MyClass {}, enter it in + // order to simplify later steps and allow for sensible error + // messages. + if (env.tree.hasTag(NEWCLASS) && TreeInfo.isInAnnotation(env, tree)) + enter.classEnter(tree, env); + } ClassSymbol c = tree.sym; if (c == null) { diff -r 0c9b87169d91 -r 57a11f869f0a src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java --- a/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Mon Jun 15 11:41:41 2015 -0700 +++ b/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Wed Jun 17 23:29:40 2015 -0700 @@ -1256,6 +1256,9 @@ return isSimpleReceiver(((JCAnnotatedType)rec).underlyingType); case APPLY: return true; + case NEWCLASS: + JCNewClass nc = (JCNewClass) rec; + return nc.encl == null && nc.def == null && !TreeInfo.isDiamond(nc); default: return false; } @@ -1310,17 +1313,24 @@ Type site; if (rec != null) { - if (rec.hasTag(APPLY)) { - Symbol recSym = quicklyResolveMethod(env, (JCMethodInvocation) rec); - if (recSym == null) - return null; - Symbol resolvedReturnType = - analyzeCandidateMethods(recSym, syms.errSymbol, returnSymbolAnalyzer); - if (resolvedReturnType == null) - return null; - site = resolvedReturnType.type; - } else { - site = attribSpeculative(rec, env, attr.unknownTypeExprInfo).type; + switch (rec.getTag()) { + case APPLY: + Symbol recSym = quicklyResolveMethod(env, (JCMethodInvocation) rec); + if (recSym == null) + return null; + Symbol resolvedReturnType = + analyzeCandidateMethods(recSym, syms.errSymbol, returnSymbolAnalyzer); + if (resolvedReturnType == null) + return null; + site = resolvedReturnType.type; + break; + case NEWCLASS: + JCNewClass nc = (JCNewClass) rec; + site = attribSpeculative(nc.clazz, env, attr.unknownTypeExprInfo).type; + break; + default: + site = attribSpeculative(rec, env, attr.unknownTypeExprInfo).type; + break; } } else { site = env.enclClass.sym.type; diff -r 0c9b87169d91 -r 57a11f869f0a src/share/classes/com/sun/tools/javac/comp/Resolve.java --- a/src/share/classes/com/sun/tools/javac/comp/Resolve.java Mon Jun 15 11:41:41 2015 -0700 +++ b/src/share/classes/com/sun/tools/javac/comp/Resolve.java Wed Jun 17 23:29:40 2015 -0700 @@ -271,7 +271,7 @@ * the one of its outer environment */ protected static boolean isStatic(Env env) { - return env.info.staticLevel > env.outer.info.staticLevel; + return env.outer != null && env.info.staticLevel > env.outer.info.staticLevel; } /** An environment is an "initializer" if it is a constructor or diff -r 0c9b87169d91 -r 57a11f869f0a src/share/classes/com/sun/tools/javac/jvm/Gen.java --- a/src/share/classes/com/sun/tools/javac/jvm/Gen.java Mon Jun 15 11:41:41 2015 -0700 +++ b/src/share/classes/com/sun/tools/javac/jvm/Gen.java Wed Jun 17 23:29:40 2015 -0700 @@ -514,6 +514,10 @@ clinitTAs.addAll(getAndRemoveNonFieldTAs(sym)); } else { checkStringConstant(vdef.init.pos(), sym.getConstValue()); + /* if the init contains a reference to an external class, add it to the + * constant's pool + */ + vdef.init.accept(classReferenceVisitor); } } break; @@ -2431,9 +2435,12 @@ && !allowGenerics // no Miranda methods available with generics ) implementInterfaceMethods(c); - cdef.defs = normalizeDefs(cdef.defs, c); c.pool = pool; pool.reset(); + /* method normalizeDefs() can add references to external classes into the constant pool + * so it should be called after pool.reset() + */ + cdef.defs = normalizeDefs(cdef.defs, c); generateReferencesToPrunedTree(c, pool); Env localEnv = new Env(cdef, new GenContext()); diff -r 0c9b87169d91 -r 57a11f869f0a src/share/classes/com/sun/tools/javac/resources/javac_ja.properties --- a/src/share/classes/com/sun/tools/javac/resources/javac_ja.properties Mon Jun 15 11:41:41 2015 -0700 +++ b/src/share/classes/com/sun/tools/javac/resources/javac_ja.properties Wed Jun 17 23:29:40 2015 -0700 @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -133,7 +133,7 @@ javac.msg.usage.nonstandard.footer=\u3053\u308C\u3089\u306F\u975E\u6A19\u6E96\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u3042\u308A\u4E88\u544A\u306A\u3057\u306B\u5909\u66F4\u3055\u308C\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002 -javac.msg.bug=\u30B3\u30F3\u30D1\u30A4\u30E9\u3067\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F({0})\u3002Bug Parade\u3067\u91CD\u8907\u304C\u306A\u3044\u304B\u3092\u3054\u78BA\u8A8D\u306E\u3046\u3048\u3001Java Developer Connection (http://java.sun.com/webapps/bugreport)\u3067bug\u306E\u767B\u9332\u3092\u304A\u9858\u3044\u3044\u305F\u3057\u307E\u3059\u3002\u30EC\u30DD\u30FC\u30C8\u306B\u306F\u3001\u305D\u306E\u30D7\u30ED\u30B0\u30E9\u30E0\u3068\u4E0B\u8A18\u306E\u8A3A\u65AD\u5185\u5BB9\u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044\u3002\u3054\u5354\u529B\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002 +javac.msg.bug=\u30B3\u30F3\u30D1\u30A4\u30E9\u3067\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F({0})\u3002\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3067\u91CD\u8907\u304C\u306A\u3044\u304B\u3092\u3054\u78BA\u8A8D\u306E\u3046\u3048\u3001Java Bug Database (http://bugreport.java.com/bugreport/)\u3067bug\u306E\u767B\u9332\u3092\u304A\u9858\u3044\u3044\u305F\u3057\u307E\u3059\u3002\u30EC\u30DD\u30FC\u30C8\u306B\u306F\u3001\u305D\u306E\u30D7\u30ED\u30B0\u30E9\u30E0\u3068\u4E0B\u8A18\u306E\u8A3A\u65AD\u5185\u5BB9\u3092\u542B\u3081\u3066\u304F\u3060\u3055\u3044\u3002\u3054\u5354\u529B\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002 javac.msg.io=\n\n\u5165\u51FA\u529B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\n\u8A73\u7D30\u306F\u6B21\u306E\u30B9\u30BF\u30C3\u30AF\u30FB\u30C8\u30EC\u30FC\u30B9\u3067\u8ABF\u67FB\u3057\u3066\u304F\u3060\u3055\u3044\u3002\n diff -r 0c9b87169d91 -r 57a11f869f0a src/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties --- a/src/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties Mon Jun 15 11:41:41 2015 -0700 +++ b/src/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties Wed Jun 17 23:29:40 2015 -0700 @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -133,7 +133,7 @@ javac.msg.usage.nonstandard.footer=\u8FD9\u4E9B\u9009\u9879\u90FD\u662F\u975E\u6807\u51C6\u9009\u9879, \u5982\u6709\u66F4\u6539, \u6055\u4E0D\u53E6\u884C\u901A\u77E5\u3002 -javac.msg.bug=\u7F16\u8BD1\u5668 ({0}) \u4E2D\u51FA\u73B0\u5F02\u5E38\u9519\u8BEF\u3002 \u5982\u679C\u5728 Bug Parade \u4E2D\u6CA1\u6709\u627E\u5230\u8BE5\u9519\u8BEF, \u8BF7\u5728 Java Developer Connection (http://java.sun.com/webapps/bugreport) \u4E2D\u5EFA\u7ACB Bug\u3002\u8BF7\u5728\u62A5\u544A\u4E2D\u9644\u4E0A\u60A8\u7684\u7A0B\u5E8F\u548C\u4EE5\u4E0B\u8BCA\u65AD\u4FE1\u606F\u3002\u8C22\u8C22\u3002 +javac.msg.bug=\u7F16\u8BD1\u5668 ({0}) \u4E2D\u51FA\u73B0\u5F02\u5E38\u9519\u8BEF\u3002\u5982\u679C\u5728 Java Bug Database (http://bugreport.java.com/bugreport/) \u4E2D\u6CA1\u6709\u627E\u5230\u8BE5\u9519\u8BEF, \u8BF7\u5728\u8BE5\u6570\u636E\u5E93\u4E2D\u5EFA\u7ACB Bug\u3002\u8BF7\u5728\u62A5\u544A\u4E2D\u9644\u4E0A\u60A8\u7684\u7A0B\u5E8F\u548C\u4EE5\u4E0B\u8BCA\u65AD\u4FE1\u606F\u3002\u8C22\u8C22\u3002 javac.msg.io=\n\n\u53D1\u751F\u8F93\u5165/\u8F93\u51FA\u9519\u8BEF\u3002\n\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F, \u8BF7\u53C2\u9605\u4EE5\u4E0B\u5806\u6808\u8DDF\u8E2A\u3002\n diff -r 0c9b87169d91 -r 57a11f869f0a src/share/classes/com/sun/tools/javac/tree/TreeInfo.java --- a/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java Mon Jun 15 11:41:41 2015 -0700 +++ b/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java Wed Jun 17 23:29:40 2015 -0700 @@ -28,6 +28,7 @@ import com.sun.source.tree.Tree; +import com.sun.source.util.TreePath; import com.sun.tools.javac.code.*; import com.sun.tools.javac.comp.AttrContext; import com.sun.tools.javac.comp.Env; @@ -351,6 +352,18 @@ return (lit.typetag == BOT); } + /** Return true iff this tree is a child of some annotation. */ + public static boolean isInAnnotation(Env env, JCTree tree) { + TreePath tp = TreePath.getPath(env.toplevel, tree); + if (tp != null) { + for (Tree t : tp) { + if (t.getKind() == Tree.Kind.ANNOTATION) + return true; + } + } + return false; + } + public static String getCommentText(Env env, JCTree tree) { DocCommentTable docComments = (tree.hasTag(JCTree.Tag.TOPLEVEL)) ? ((JCCompilationUnit) tree).docComments diff -r 0c9b87169d91 -r 57a11f869f0a test/tools/javac/7153958/CPoolRefClassContainingInlinedCts.java --- a/test/tools/javac/7153958/CPoolRefClassContainingInlinedCts.java Mon Jun 15 11:41:41 2015 -0700 +++ b/test/tools/javac/7153958/CPoolRefClassContainingInlinedCts.java Wed Jun 17 23:29:40 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,9 @@ /* * @test - * @bug 7153958 + * @bug 7153958 8073372 * @summary add constant pool reference to class containing inlined constants - * @compile pkg/ClassToBeStaticallyImported.java CPoolRefClassContainingInlinedCts.java + * @compile pkg/ClassToBeStaticallyImportedA.java pkg/ClassToBeStaticallyImportedB.java CPoolRefClassContainingInlinedCts.java * @run main CPoolRefClassContainingInlinedCts */ @@ -38,7 +38,8 @@ import java.io.File; import java.io.IOException; -import static pkg.ClassToBeStaticallyImported.staticField; +import static pkg.ClassToBeStaticallyImportedA.staticFieldA; +import static pkg.ClassToBeStaticallyImportedB.staticFieldB; public class CPoolRefClassContainingInlinedCts { @@ -54,10 +55,14 @@ void checkClassName(String className) { switch (className) { - case "SimpleAssignClass" : case "BinaryExpClass": - case "UnaryExpClass" : case "CastClass": - case "ParensClass" : case "CondClass": - case "IfClass" : case "pkg/ClassToBeStaticallyImported": + case "SimpleAssignClassA" : case "BinaryExpClassA": + case "UnaryExpClassA" : case "CastClassA": + case "ParensClassA" : case "CondClassA": + case "IfClassA" : case "pkg/ClassToBeStaticallyImportedA": + case "SimpleAssignClassB" : case "BinaryExpClassB": + case "UnaryExpClassB" : case "CastClassB": + case "ParensClassB" : case "CondClassB": + case "IfClassB" : case "pkg/ClassToBeStaticallyImportedB": numberOfReferencedClassesToBeChecked++; } } @@ -76,59 +81,111 @@ } i += cpInfo.size(); } - if (numberOfReferencedClassesToBeChecked != 8) { + if (numberOfReferencedClassesToBeChecked != 16) { throw new AssertionError("Class reference missing in the constant pool"); } } - private int assign = SimpleAssignClass.x; - private int binary = BinaryExpClass.x + 1; - private int unary = -UnaryExpClass.x; - private int cast = (int)CastClass.x; - private int parens = (ParensClass.x); - private int cond = (CondClass.x == 1) ? 1 : 2; - private static int ifConstant; - private static int importStatic; + private int assignA = SimpleAssignClassA.x; + private int binaryA = BinaryExpClassA.x + 1; + private int unaryA = -UnaryExpClassA.x; + private int castA = (int)CastClassA.x; + private int parensA = (ParensClassA.x); + private int condA = (CondClassA.x == 1) ? 1 : 2; + private static int ifConstantA; + private static int importStaticA; static { - if (IfClass.x == 1) { - ifConstant = 1; + if (IfClassA.x == 1) { + ifConstantA = 1; } else { - ifConstant = 2; + ifConstantA = 2; } } static { - if (staticField == 1) { - importStatic = 1; + if (staticFieldA == 1) { + importStaticA = 1; } else { - importStatic = 2; + importStaticA = 2; + } + } + + // now as final constants + private static final int assignB = SimpleAssignClassB.x; + private static final int binaryB = BinaryExpClassB.x + 1; + private static final int unaryB = -UnaryExpClassB.x; + private static final int castB = (int)CastClassB.x; + private static final int parensB = (ParensClassB.x); + private static final int condB = (CondClassB.x == 1) ? 1 : 2; + private static final int ifConstantB; + private static final int importStaticB; + static { + if (IfClassB.x == 1) { + ifConstantB = 1; + } else { + ifConstantB = 2; + } + } + static { + if (staticFieldB == 1) { + importStaticB = 1; + } else { + importStaticB = 2; } } } -class SimpleAssignClass { +class SimpleAssignClassA { public static final int x = 1; } -class BinaryExpClass { +class SimpleAssignClassB { public static final int x = 1; } -class UnaryExpClass { +class BinaryExpClassA { public static final int x = 1; } -class CastClass { +class BinaryExpClassB { public static final int x = 1; } -class ParensClass { +class UnaryExpClassA { public static final int x = 1; } -class CondClass { +class UnaryExpClassB { public static final int x = 1; } -class IfClass { +class CastClassA { public static final int x = 1; } + +class CastClassB { + public static final int x = 1; +} + +class ParensClassA { + public static final int x = 1; +} + +class ParensClassB { + public static final int x = 1; +} + +class CondClassA { + public static final int x = 1; +} + +class CondClassB { + public static final int x = 1; +} + +class IfClassA { + public static final int x = 1; +} + +class IfClassB { + public static final int x = 1; +} diff -r 0c9b87169d91 -r 57a11f869f0a test/tools/javac/7153958/pkg/ClassToBeStaticallyImported.java --- a/test/tools/javac/7153958/pkg/ClassToBeStaticallyImported.java Mon Jun 15 11:41:41 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package pkg; - -public class ClassToBeStaticallyImported { - public static final int staticField = 1; -} diff -r 0c9b87169d91 -r 57a11f869f0a test/tools/javac/7153958/pkg/ClassToBeStaticallyImportedA.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/7153958/pkg/ClassToBeStaticallyImportedA.java Wed Jun 17 23:29:40 2015 -0700 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package pkg; + +public class ClassToBeStaticallyImportedA { + public static final int staticFieldA = 1; +} diff -r 0c9b87169d91 -r 57a11f869f0a test/tools/javac/7153958/pkg/ClassToBeStaticallyImportedB.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/7153958/pkg/ClassToBeStaticallyImportedB.java Wed Jun 17 23:29:40 2015 -0700 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package pkg; + +public class ClassToBeStaticallyImportedB { + public static final int staticFieldB = 1; +} diff -r 0c9b87169d91 -r 57a11f869f0a test/tools/javac/annotations/neg/AnonSubclass.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/annotations/neg/AnonSubclass.java Wed Jun 17 23:29:40 2015 -0700 @@ -0,0 +1,13 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8028389 + * @summary javac should output a proper error message when given something + * like new Object(){} as annotation argument. + * + * @compile/fail/ref=AnonSubclass.out -XDrawDiagnostics AnonSubclass.java + */ + +@AnonSubclass(new Object(){}) +@interface AnonSubclass { + String value(); +} diff -r 0c9b87169d91 -r 57a11f869f0a test/tools/javac/annotations/neg/AnonSubclass.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/annotations/neg/AnonSubclass.out Wed Jun 17 23:29:40 2015 -0700 @@ -0,0 +1,2 @@ +AnonSubclass.java:10:15: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: compiler.misc.anonymous.class: java.lang.Object, java.lang.String) +1 error diff -r 0c9b87169d91 -r 57a11f869f0a test/tools/javac/annotations/neg/pkg/AnonSubclassOnPkg.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/annotations/neg/pkg/AnonSubclassOnPkg.java Wed Jun 17 23:29:40 2015 -0700 @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package pkg; + +@interface AnonSubclassOnPkg { + String value(); +} diff -r 0c9b87169d91 -r 57a11f869f0a test/tools/javac/annotations/neg/pkg/package-info.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/annotations/neg/pkg/package-info.java Wed Jun 17 23:29:40 2015 -0700 @@ -0,0 +1,12 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8028389 + * @summary javac should output a proper error message when given something + * like new Object(){} as annotation argument. + * + * @compile AnonSubclassOnPkg.java + * @compile/fail/ref=package-info.out -XDrawDiagnostics package-info.java + */ + +@AnonSubclassOnPkg(new Object(){}) +package pkg; diff -r 0c9b87169d91 -r 57a11f869f0a test/tools/javac/annotations/neg/pkg/package-info.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/annotations/neg/pkg/package-info.out Wed Jun 17 23:29:40 2015 -0700 @@ -0,0 +1,2 @@ +package-info.java:11:20: compiler.err.prob.found.req: (compiler.misc.inconvertible.types: compiler.misc.anonymous.class: java.lang.Object, java.lang.String) +1 error diff -r 0c9b87169d91 -r 57a11f869f0a test/tools/javac/expression/DeeplyChainedNonPolyExpressionTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/expression/DeeplyChainedNonPolyExpressionTest.java Wed Jun 17 23:29:40 2015 -0700 @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8079613 + * @summary Ensure that compiler ascertains a class of patently non-poly expressions as such + * @run main/timeout=10 DeeplyChainedNonPolyExpressionTest + */ + +public class DeeplyChainedNonPolyExpressionTest { + static class JSO { + + JSO put(String s, Object y) { + return null; + } + + JSO put(java.lang.String x, java.util.Collection y) { + return null; + } + + JSO put(java.lang.String x, int y) { + return null; + } + + JSO put(java.lang.String x, long y) { + return null; + } + + JSO put(java.lang.String x, double y) { + return null; + } + + JSO put(java.lang.String x, java.util.Map y) { + return null; + } + + JSO put(java.lang.String x, boolean y) { + return null; + } + } + + static class JSA { + + JSA put(Object o) { + return null; + } + + JSA put(int i, Object x) { + return null; + } + + JSA put(boolean x) { + return null; + } + + JSA put(int x) { + return null; + } + + JSA put(int i, int x) { + return null; + } + + JSA put(int x, boolean y) { + return null; + } + + JSA put(int i, long x) { + return null; + } + + JSA put(long x) { + return null; + } + + JSA put(java.util.Collection x) { + return null; + } + + JSA put(int i, java.util.Collection x) { + return null; + } + + JSA put(int i, java.util.Map x) { + return null; + } + + JSA put(java.util.Map x) { + return null; + } + + JSA put(int i, double x) { + return null; + } + + JSA put(double x) { + return null; + } + } + + public static void main(String [] args) { + } + public static void foo() { + new JSO() + .put("s", new JSA()) + .put("s", new JSA()) + .put("s", new JSO() + .put("s", new JSO() + .put("s", new JSA().put("s")) + .put("s", new JSA()) + .put("s", new JSO() + .put("s", new JSO() + .put("s", new JSA().put("s").put("s")) + .put("s", new JSA()) + .put("s", new JSO() + .put("s", new JSO() + .put("s", new JSA().put("s").put("s").put("s") + .put("s").put("s").put("s") + .put("s").put("s")) + .put("s", new JSA()) + .put("s", new JSO() + .put("s", new JSO() + .put("s", new JSA().put("s")) + .put("s", new JSA()) + ) + ) + ) + ) + ) + .put("s", new JSO() + .put("s", new JSA().put("s")) + .put("s", new JSA()) + .put("s", new JSO() + .put("s", new JSO() + .put("s", new JSA().put("s").put("s")) + .put("s", new JSA()) + .put("s", new JSO() + .put("s", new JSO() + .put("s", new JSA().put("s").put("s").put("s") + .put("s").put("s").put("s") + .put("s").put("s")) + .put("s", new JSA()) + .put("s", new JSO() + .put("s", new JSO() + .put("s", new JSA().put("s")) + .put("s", new JSA())) + ) + ) + ) + ) + ) + ) + ) + ) + ); + } +} diff -r 0c9b87169d91 -r 57a11f869f0a test/tools/javac/scope/RemoveSymbolTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/scope/RemoveSymbolTest.java Wed Jun 17 23:29:40 2015 -0700 @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8080842 + * @summary Ensure Scope impl can cope with remove() when a field and method share the name. + * @run main RemoveSymbolTest + */ + +import java.util.Iterator; +import java.util.LinkedList; + +public class RemoveSymbolTest implements Iterable { + static class Widget { + private String name; + Widget(String s) { name = s; } + @Override public String toString() { return name; } + } + + private LinkedList data; + // Instantiate an Iterable instance using a Lambda expression. + // Causes ClassFormatError if a local variable of type Widget is named after one of the methods. + private final Iterable myIterator1 = () -> new Iterator() { + private W hasNext = null; + private int index = 0; + @Override public boolean hasNext() { return index < data.size(); } + @Override public W next() { return data.get(index++); } + }; + + // Instantiate an Iterable instance using an anonymous class. + // Always works fine regardless of the name of the local variable. + private final Iterable myIterator2 = + new Iterable() { + @Override + public Iterator iterator() { + return new Iterator() { + private W hasNext = null; + private int index = 0; + @Override public boolean hasNext() { return index < data.size(); } + @Override public W next() { return data.get(index++); } + }; + } + }; + public RemoveSymbolTest() { data = new LinkedList<>(); } + public void add(W e) { data.add(e); } + @Override public String toString() { return data.toString(); } + @Override public Iterator iterator() { return myIterator1.iterator(); } + public static void main(String[] args) { + RemoveSymbolTest widgets = new RemoveSymbolTest<>(); + widgets.add(new Widget("W1")); + widgets.add(new Widget("W2")); + widgets.add(new Widget("W3")); + System.out.println(".foreach() call: "); + widgets.forEach(w -> System.out.println(w + " ")); + } +} diff -r 0c9b87169d91 -r 57a11f869f0a test/tools/javac/scope/RemoveSymbolUnitTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/scope/RemoveSymbolUnitTest.java Wed Jun 17 23:29:40 2015 -0700 @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8080842 + * @summary Ensure Scope impl can cope with remove() when a field and method share the name. + */ + +import com.sun.tools.javac.util.*; +import com.sun.tools.javac.code.*; +import com.sun.tools.javac.code.Scope.*; +import com.sun.tools.javac.code.Symbol.*; +import com.sun.tools.javac.file.JavacFileManager; + +public class RemoveSymbolUnitTest { + + Context context; + Names names; + Symtab symtab; + + public static void main(String... args) throws Exception { + new RemoveSymbolUnitTest().run(); + } + + public void run() { + context = new Context(); + JavacFileManager.preRegister(context); // required by ClassReader which is required by Symtab + names = Names.instance(context); + symtab = Symtab.instance(context); + + Name hasNext = names.fromString("hasNext"); + ClassSymbol clazz = new ClassSymbol(0, + names.fromString("X"), + Type.noType, + symtab.unnamedPackage); + + VarSymbol v = new VarSymbol(0, hasNext, Type.noType, clazz); + MethodSymbol m = new MethodSymbol(0, hasNext, Type.noType, clazz); + + // Try enter and remove in different shuffled combinations. + // working with fresh scope each time. + Scope cs = new Scope(clazz); + cs.enter(v); + cs.enter(m); + cs.remove(v); + Symbol s = cs.lookup(hasNext).sym; + if (s != m) + throw new AssertionError("Wrong symbol"); + + cs = new Scope(clazz); + cs.enter(m); + cs.enter(v); + cs.remove(v); + s = cs.lookup(hasNext).sym; + if (s != m) + throw new AssertionError("Wrong symbol"); + + cs = new Scope(clazz); + cs.enter(v); + cs.enter(m); + cs.remove(m); + s = cs.lookup(hasNext).sym; + if (s != v) + throw new AssertionError("Wrong symbol"); + + cs = new Scope(clazz); + cs.enter(m); + cs.enter(v); + cs.remove(m); + s = cs.lookup(hasNext).sym; + if (s != v) + throw new AssertionError("Wrong symbol"); + } +} diff -r 0c9b87169d91 -r 57a11f869f0a test/tools/javac/types/ScopeListenerTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/types/ScopeListenerTest.java Wed Jun 17 23:29:40 2015 -0700 @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8039262 + * @summary Ensure that using Types.membersClosure does not increase the number of listeners on the + * class's members Scope. + */ + +import com.sun.tools.javac.code.Scope; +import com.sun.tools.javac.code.Symbol; +import com.sun.tools.javac.code.Symtab; +import com.sun.tools.javac.code.Types; +import com.sun.tools.javac.file.JavacFileManager; +import com.sun.tools.javac.util.Context; +import com.sun.tools.javac.util.Names; +import java.lang.reflect.Field; +import java.util.Collection; + +public class ScopeListenerTest { + + public static void main(String[] args) throws Exception { + new ScopeListenerTest().run(); + } + + void run() throws Exception { + Context context = new Context(); + JavacFileManager.preRegister(context); + Types types = Types.instance(context); + Symtab syms = Symtab.instance(context); + Names names = Names.instance(context); + types.membersClosure(syms.stringType, true); + types.membersClosure(syms.stringType, false); + + Field listenersField = Scope.class.getDeclaredField("listeners"); + + listenersField.setAccessible(true); + + int listenerCount = + ((Collection) listenersField.get(syms.stringType.tsym.members())).size(); + + for (int i = 0; i < 100; i++) { + types.membersClosure(syms.stringType, true); + types.membersClosure(syms.stringType, false); + } + + int newListenerCount + = ((Collection) listenersField.get(syms.stringType.tsym.members())).size(); + + if (listenerCount != newListenerCount) { + throw new AssertionError("Orig listener count: " + listenerCount + + "; new listener count: " + newListenerCount); + } + + for (Symbol s : types.membersClosure(syms.stringType, true).getElements()) + ; + for (Symbol s : types.membersClosure(syms.stringType, false).getElementsByName(names.fromString("substring"))) + ; + } + +}