# HG changeset patch # User asaha # Date 1461863133 25200 # Node ID 85b3985bce89507e4546b9bfd5608fe2d50450be # Parent cc1e702fab6ac8fd6892a2e4fb83d1b22d4b3577# Parent a92df1dd4204f4072d624676f74044338095bd12 Merge diff -r cc1e702fab6a -r 85b3985bce89 .hgtags --- a/.hgtags Mon Apr 11 12:35:04 2016 -0700 +++ b/.hgtags Thu Apr 28 10:05:33 2016 -0700 @@ -596,4 +596,18 @@ a93c1e57407944362e05c79d756425e8c1274d9a jdk8u101-b01 86a9d99ffadaf26b3d8417666a3600ea1ce7560f jdk8u101-b02 6a0df041e6c9b0756f1cbc9e1fcb6f519b80d767 jdk8u101-b03 +90f493bfe1faca0573844fdd2497070c8b224d76 jdk8u101-b04 +52b1aad7837180baa6555b0b6a5e43e96aea2e19 jdk8u101-b05 +10ffafaf53404de7fd23784aa3ff6016d107b9c8 jdk8u76-b00 +0caab0d65a04d8cce71976a6bdc1ca0841bcbcf0 jdk8u76-b01 +78f0aa6199150e10f387989b9bd5997f72cdc4e1 jdk8u76-b02 +8969d6096fe123922bb3ac0c8f6f7b18c1c7668e jdk8u76-b03 +f8173fa5db9ba23e7cd935600f56a8a53157eb6e jdk8u76-b04 +dad1f3dd4a906542a656b3f07142f90c1630320e jdk8u102-b00 +dad1f3dd4a906542a656b3f07142f90c1630320e jdk8u82-b00 +6adcc437e39d4e16803ea2ec2f77c7b2b014512f jdk8u102-b01 +8a650e6924641eff6398fa8cda6e9fd6bd486e71 jdk8u102-b02 +8a8745bff8d5d6dbe64563e051cfd228d2e4d917 jdk8u102-b03 +614dc9771517839b3ed68b6b549bef1c370651c9 jdk8u102-b04 +7750594d9ceba010e36349bc20ee011edbb7c577 jdk8u102-b05 90f493bfe1faca0573844fdd2497070c8b224d76 jdk8u111-b00 diff -r cc1e702fab6a -r 85b3985bce89 src/share/classes/com/sun/tools/javac/comp/Attr.java --- a/src/share/classes/com/sun/tools/javac/comp/Attr.java Mon Apr 11 12:35:04 2016 -0700 +++ b/src/share/classes/com/sun/tools/javac/comp/Attr.java Thu Apr 28 10:05:33 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2016, 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 @@ -249,6 +249,7 @@ * are correct. * * @param tree The tree whose kind and type is checked + * @param found The computed type of the tree * @param ownkind The computed kind of the tree * @param resultInfo The expected result of the tree */ diff -r cc1e702fab6a -r 85b3985bce89 src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java --- a/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Mon Apr 11 12:35:04 2016 -0700 +++ b/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Thu Apr 28 10:05:33 2016 -0700 @@ -860,7 +860,7 @@ private JCExpression makeReceiver(VarSymbol rcvr) { if (rcvr == null) return null; JCExpression rcvrExpr = make.Ident(rcvr); - Type rcvrType = tree.sym.enclClass().type; + Type rcvrType = tree.ownerAccessible ? tree.sym.enclClass().type : tree.expr.type; if (rcvrType == syms.arrayClass.type) { // Map the receiver type to the actually type, not just "array" rcvrType = tree.getQualifierExpression().type; diff -r cc1e702fab6a -r 85b3985bce89 src/share/classes/com/sun/tools/javac/comp/Resolve.java --- a/src/share/classes/com/sun/tools/javac/comp/Resolve.java Mon Apr 11 12:35:04 2016 -0700 +++ b/src/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Apr 28 10:05:33 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2016, 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 @@ -1007,7 +1007,7 @@ DeferredType dt = (DeferredType)found; return dt.check(this); } else { - Type uResult = U(found.baseType()); + Type uResult = U(found); Type capturedType = pos == null || pos.getTree() == null ? types.capture(uResult) : checkContext.inferenceContext() diff -r cc1e702fab6a -r 85b3985bce89 src/share/classes/com/sun/tools/javac/util/GraphUtils.java --- a/src/share/classes/com/sun/tools/javac/util/GraphUtils.java Mon Apr 11 12:35:04 2016 -0700 +++ b/src/share/classes/com/sun/tools/javac/util/GraphUtils.java Thu Apr 28 10:05:33 2016 -0700 @@ -103,34 +103,60 @@ * directed graph in linear time. Works on TarjanNode. */ public static > List> tarjan(Iterable nodes) { - ListBuffer> cycles = new ListBuffer<>(); + Tarjan tarjan = new Tarjan<>(); + return tarjan.findSCC(nodes); + } + + //where + private static class Tarjan> { + + /** Unique node identifier. */ + int index = 0; + + /** List of SCCs found so far. */ + ListBuffer> sccs = new ListBuffer<>(); + + /** Stack of all reacheable nodes from given root. */ ListBuffer stack = new ListBuffer<>(); - int index = 0; - for (N node: nodes) { - if (node.index == -1) { - index += tarjan(node, index, stack, cycles); + + private List> findSCC(Iterable nodes) { + for (N node : nodes) { + if (node.index == -1) { + findSCC(node); + } + } + return sccs.toList(); + } + + private void findSCC(N v) { + visitNode(v); + for (TarjanNode tn : v.getAllDependencies()) { + @SuppressWarnings("unchecked") + N n = (N)tn; + if (n.index == -1) { + //it's the first time we see this node + findSCC(n); + v.lowlink = Math.min(v.lowlink, n.lowlink); + } else if (stack.contains(n)) { + //this node is already reachable from current root + v.lowlink = Math.min(v.lowlink, n.index); + } + } + if (v.lowlink == v.index) { + //v is the root of a SCC + addSCC(v); } } - return cycles.toList(); - } - private static > int tarjan(N v, int index, ListBuffer stack, ListBuffer> cycles) { - v.index = index; - v.lowlink = index; - index++; - stack.prepend(v); - v.active = true; - for (TarjanNode nd: v.getAllDependencies()) { - @SuppressWarnings("unchecked") - N n = (N)nd; - if (n.index == -1) { - tarjan(n, index, stack, cycles); - v.lowlink = Math.min(v.lowlink, n.lowlink); - } else if (stack.contains(n)) { - v.lowlink = Math.min(v.lowlink, n.index); - } + private void visitNode(N n) { + n.index = index; + n.lowlink = index; + index++; + stack.prepend(n); + n.active = true; } - if (v.lowlink == v.index) { + + private void addSCC(N v) { N n; ListBuffer cycle = new ListBuffer<>(); do { @@ -138,9 +164,8 @@ n.active = false; cycle.add(n); } while (n != v); - cycles.add(cycle.toList()); + sccs.add(cycle.toList()); } - return index; } /** diff -r cc1e702fab6a -r 85b3985bce89 test/tools/javac/conditional/ConditionalWithFinalStrings.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/conditional/ConditionalWithFinalStrings.java Thu Apr 28 10:05:33 2016 -0700 @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2016, 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 8066871 + * @summary java.lang.VerifyError: Bad local variable type - local final String + * @author Srikanth Sankaran + * + * @compile -g:none ConditionalWithFinalStrings.java + * @run main ConditionalWithFinalStrings + */ + +public class ConditionalWithFinalStrings { + + interface I { + String foo(); + } + + static class Tmp { + private String value; + public void setValue(String tmpStr) { + this.value = tmpStr; + if (!this.value.equals("YES")) + throw new AssertionError(); + } + } + + void goo(I i) { + if (!i.foo().equals("YES")) + throw new AssertionError(); + } + + public void test() { + final String y = "YES"; + final String n = "NO"; + Tmp tmp = new Tmp(); + tmp.setValue(true ? y : n); + goo (() -> y); + + } + public static void main(String[] args) { + new ConditionalWithFinalStrings().test(); + if (!id("Hello!").equals("Hello!")) + throw new AssertionError(); + + } + static Z id(Z z) { return z; } +} diff -r cc1e702fab6a -r 85b3985bce89 test/tools/javac/generics/inference/8130304/T8130304.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/generics/inference/8130304/T8130304.java Thu Apr 28 10:05:33 2016 -0700 @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2016, 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. + */ + +/** + * @test + * @bug 8130304 + * @summary Inference: NodeNotFoundException thrown with deep generic method call chain + * @compile T8130304.java + */ +class T8130304 { + + void test() { + outer( + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner(), + inner()); + } + + void outer(T... ts) { } + + T inner() { + return null; + } +} diff -r cc1e702fab6a -r 85b3985bce89 test/tools/javac/generics/inference/8130304/T8130304b.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/generics/inference/8130304/T8130304b.java Thu Apr 28 10:05:33 2016 -0700 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2016, 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. + */ + +/** + * @test + * @bug 8130304 + * @summary Inference: NodeNotFoundException thrown with deep generic method call chain + * @compile T8130304b.java + */ +class T8130304b { + + void test() { + TestZ r = null; + Crazy x = r.m3("X"); + r.m1(r.m4(r.m2(x, r.m3("a")), t -> "x"), r.m3("a")); + } + + interface Crazy { } + + interface TestZ { + public Crazy m1(Crazy... d); + public Crazy> m2(Crazy e, Crazy f); + public Crazy m3(A g); + public Crazy m4(Crazy h, java.util.function.Function i); + } +} diff -r cc1e702fab6a -r 85b3985bce89 test/tools/javac/lambda/MethodReference75.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/lambda/MethodReference75.java Thu Apr 28 10:05:33 2016 -0700 @@ -0,0 +1,46 @@ +/* + * 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 8143647 + * @summary Javac compiles method reference that allows results in an IllegalAccessError + * @run main MethodReference75 + */ + +import pkg.PublicDerived8143647; + +public class MethodReference75 { + public static void main(String[] args) { + if (java.util.Arrays + .asList(new PublicDerived8143647()) + .stream() + .map(PublicDerived8143647::getX) + .findFirst() + .get() + .equals("PackagePrivateBase")) + System.out.println("OK"); + else + throw new AssertionError("Unexpected output"); + } +} diff -r cc1e702fab6a -r 85b3985bce89 test/tools/javac/lambda/pkg/PublicDerived8143647.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/lambda/pkg/PublicDerived8143647.java Thu Apr 28 10:05:33 2016 -0700 @@ -0,0 +1,33 @@ +/* + * 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. + */ + +package pkg; + +abstract class PackagePrivateBase8143647 { + public String getX() { + return "PackagePrivateBase"; + } +} + +public class PublicDerived8143647 extends PackagePrivateBase8143647 { +}