--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransTypes.java Thu Sep 29 16:45:12 2016 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransTypes.java Thu Sep 29 17:24:10 2016 +0000
@@ -415,10 +415,10 @@
if (!isSameMemberWhenErased(dest, impl, impl_erasure))
return true;
- // If the erasure of the return type is different, a
- // bridge is needed.
- return !types.isSameType(impl_erasure.getReturnType(),
- method_erasure.getReturnType());
+ /* Bottom line: A bridge is needed if the erasure of the implementation
+ is different from that of the method that it overrides.
+ */
+ return !types.isSameType(impl_erasure, method_erasure);
} else {
// method and impl are the same...
if ((method.flags() & ABSTRACT) != 0) {
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java Thu Sep 29 16:45:12 2016 +0000
+++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/JShellTool.java Thu Sep 29 17:24:10 2016 +0000
@@ -199,6 +199,7 @@
private boolean feedbackInitialized = false;
private String commandLineFeedbackMode = null;
private List<String> remoteVMOptions = new ArrayList<>();
+ private List<String> compilerOptions = new ArrayList<>();
SourceCodeAnalysis analysis;
JShell state = null;
@@ -558,9 +559,14 @@
parser.accepts("s");
parser.accepts("v");
OptionSpec<String> r = parser.accepts("R").withRequiredArg();
+ OptionSpec<String> c = parser.accepts("C").withRequiredArg();
parser.acceptsAll(asList("h", "help"));
parser.accepts("version");
parser.accepts("full-version");
+
+ parser.accepts("X");
+ OptionSpec<String> addExports = parser.accepts("add-exports").withRequiredArg();
+
NonOptionArgumentSpec<String> loadFileSpec = parser.nonOptions();
OptionSet options;
@@ -585,6 +591,10 @@
printUsage();
return null;
}
+ if (options.has("X")) {
+ printUsageX();
+ return null;
+ }
if (options.has("version")) {
cmdout.printf("jshell %s\n", version());
return null;
@@ -630,7 +640,19 @@
commandLineFeedbackMode = "verbose";
}
if (options.has(r)) {
- remoteVMOptions = options.valuesOf(r);
+ remoteVMOptions.addAll(options.valuesOf(r));
+ }
+ if (options.has(c)) {
+ compilerOptions.addAll(options.valuesOf(c));
+ }
+
+ if (options.has(addExports)) {
+ List<String> exports = options.valuesOf(addExports).stream()
+ .map(mp -> mp + "=ALL-UNNAMED")
+ .flatMap(mp -> Stream.of("--add-exports", mp))
+ .collect(toList());
+ remoteVMOptions.addAll(exports);
+ compilerOptions.addAll(exports);
}
return options.valuesOf(loadFileSpec);
@@ -640,6 +662,10 @@
cmdout.print(getResourceString("help.usage"));
}
+ private void printUsageX() {
+ cmdout.print(getResourceString("help.usage.x"));
+ }
+
/**
* Message handler to use during initial start-up.
*/
@@ -683,7 +709,8 @@
.idGenerator((sn, i) -> (currentNameSpace == startNamespace || state.status(sn).isActive())
? currentNameSpace.tid(sn)
: errorNamespace.tid(sn))
- .remoteVMOptions(remoteVMOptions.toArray(new String[remoteVMOptions.size()]))
+ .remoteVMOptions(remoteVMOptions.stream().toArray(String[]::new))
+ .compilerOptions(compilerOptions.stream().toArray(String[]::new))
.build();
shutdownSubscription = state.onShutdown((JShell deadState) -> {
if (deadState == state) {
--- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties Thu Sep 29 16:45:12 2016 +0000
+++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/resources/l10n.properties Thu Sep 29 17:24:10 2016 +0000
@@ -164,8 +164,15 @@
\ Use one -J for each runtime flag or flag argument\n\
\ -R<flag> Pass <flag> to the remote runtime system.\n\
\ Use one -R for each remote flag or flag argument\n\
+\ -C<flag> Pass <flag> to the compiler.\n\
+\ Use one -C for each compiler flag or flag argument\n\
\ --help Print this synopsis of standard options\n\
-\ --version Version information\n
+\ --version Version information\n\
+\ -X Print help on non-standard options\n
+help.usage.x = \
+\ --add-exports <module>/<package> Export specified module-private package to snippets\n\
+\ \n\
+\These options are non-standard and subject to change without notice.\n
help.list.summary = list the source you have typed
help.list.args = [<name or id>|-all|-start]
--- a/langtools/test/jdk/jshell/HistoryTest.java Thu Sep 29 16:45:12 2016 +0000
+++ b/langtools/test/jdk/jshell/HistoryTest.java Thu Sep 29 17:24:10 2016 +0000
@@ -23,6 +23,7 @@
/*
* @test
+ * @bug 8166744
* @summary Test Completion
* @modules jdk.internal.le/jdk.internal.jline.extra
* jdk.jshell/jdk.internal.jshell.tool
@@ -75,6 +76,44 @@
});
}
+ public void test8166744() {
+ test(
+ a -> {if (!a) setCommandInput("class C {\n");},
+ a -> {if (!a) setCommandInput("void f() {\n");},
+ a -> {if (!a) setCommandInput("}\n");},
+ a -> {assertCommand(a, "}", "| created class C");},
+ a -> {
+ if (!a) {
+ try {
+ previousAndAssert(getHistory(), "}");
+ previousAndAssert(getHistory(), "}");
+ previousAndAssert(getHistory(), "void f() {");
+ previousAndAssert(getHistory(), "class C {");
+ getHistory().add("class C{");
+ } catch (Exception ex) {
+ throw new IllegalStateException(ex);
+ }
+ }
+ assertCommand(a, "int dummy;", "dummy ==> 0");
+ });
+ test(
+ a -> {if (!a) setCommandInput("class C {\n");},
+ a -> {if (!a) setCommandInput("void f() {\n");},
+ a -> {if (!a) setCommandInput("}\n");},
+ a -> {assertCommand(a, "}", "| created class C");},
+ a -> {
+ if (!a) {
+ try {
+ previousSnippetAndAssert(getHistory(), "class C {");
+ getHistory().add("class C{");
+ } catch (Exception ex) {
+ throw new IllegalStateException(ex);
+ }
+ }
+ assertCommand(a, "int dummy;", "dummy ==> 0");
+ });
+ }
+
private EditingHistory getHistory() throws Exception {
Field input = repl.getClass().getDeclaredField("input");
input.setAccessible(true);
--- a/langtools/test/jdk/jshell/ToolBasicTest.java Thu Sep 29 16:45:12 2016 +0000
+++ b/langtools/test/jdk/jshell/ToolBasicTest.java Thu Sep 29 17:24:10 2016 +0000
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317 8143955 8157953 8080347
+ * @bug 8143037 8142447 8144095 8140265 8144906 8146138 8147887 8147886 8148316 8148317 8143955 8157953 8080347 8154714
* @summary Tests for Basic tests for REPL tool
* @modules jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.main
@@ -574,4 +574,20 @@
}
}
+ public void testAddExports() {
+ test(false, new String[]{"--no-startup"},
+ a -> assertCommandOutputStartsWith(a, "import jdk.internal.misc.VM;", "| Error:")
+ );
+ test(false, new String[]{"--no-startup",
+ "-R--add-exports", "-Rjava.base/jdk.internal.misc=ALL-UNNAMED",
+ "-C--add-exports", "-Cjava.base/jdk.internal.misc=ALL-UNNAMED"},
+ a -> assertImport(a, "import jdk.internal.misc.VM;", "", "jdk.internal.misc.VM"),
+ a -> assertCommand(a, "System.err.println(VM.isBooted())", "", "", null, "", "true\n")
+ );
+ test(false, new String[]{"--no-startup", "--add-exports", "java.base/jdk.internal.misc"},
+ a -> assertImport(a, "import jdk.internal.misc.VM;", "", "jdk.internal.misc.VM"),
+ a -> assertCommand(a, "System.err.println(VM.isBooted())", "", "", null, "", "true\n")
+ );
+ }
+
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/bridges/ReorderedBoundsTest.java Thu Sep 29 17:24:10 2016 +0000
@@ -0,0 +1,65 @@
+/*
+ * 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 8166363
+ * @summary Method with reordered type parameter bounds compiles with Override annotation but does not actually override superclass method.
+ * @run main ReorderedBoundsTest
+ */
+
+import java.io.Serializable;
+
+public class ReorderedBoundsTest {
+ public static class Parent {
+ public <T extends Appendable & Serializable> String printClassName(T t) {
+ return "Parent";
+ }
+ }
+
+ public static class OrderedChild extends Parent {
+ @Override
+ public <T extends Appendable & Serializable> String printClassName(T t) {
+ return "OrderedChild";
+ }
+ }
+
+ public static class ReorderedChild extends Parent {
+ @Override
+ public <T extends Serializable & Appendable> String printClassName(T t) {
+ return "ReorderedChild";
+ }
+ }
+
+ public static void main(String[] args) {
+
+ String s;
+ Parent p = new OrderedChild();
+ if (!(s = p.printClassName(new StringBuilder())).equals("OrderedChild"))
+ throw new AssertionError("Bad output: " + s);
+
+ p = new ReorderedChild();
+ if (!(s = p.printClassName(new StringBuilder())).equals("ReorderedChild"))
+ throw new AssertionError("Bad output: " + s);
+ }
+}
\ No newline at end of file