# HG changeset patch # User vromero # Date 1391721087 0 # Node ID 79dc4b992c0a385c1364592801781b747b85c6ca # Parent fb870c70e774aa5e163b665ba88f2d7f92bef2d0 8030855: Default methods should be visible under source previous to 8 Reviewed-by: jjg, dlsmith diff -r fb870c70e774 -r 79dc4b992c0a src/share/classes/com/sun/tools/javac/code/Source.java --- a/src/share/classes/com/sun/tools/javac/code/Source.java Thu Feb 06 21:03:03 2014 +0000 +++ b/src/share/classes/com/sun/tools/javac/code/Source.java Thu Feb 06 21:11:27 2014 +0000 @@ -203,9 +203,6 @@ public boolean allowDefaultMethods() { return compareTo(JDK1_8) >= 0; } - public boolean allowDefaultMethodsResolution() { - return compareTo(JDK1_7) >= 0; - } public boolean allowStaticInterfaceMethods() { return compareTo(JDK1_8) >= 0; } diff -r fb870c70e774 -r 79dc4b992c0a src/share/classes/com/sun/tools/javac/comp/Resolve.java --- a/src/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Feb 06 21:03:03 2014 +0000 +++ b/src/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Feb 06 21:11:27 2014 +0000 @@ -92,10 +92,9 @@ TreeInfo treeinfo; Types types; JCDiagnostic.Factory diags; - public final boolean boxingEnabled; // = source.allowBoxing(); - public final boolean varargsEnabled; // = source.allowVarargs(); + public final boolean boxingEnabled; + public final boolean varargsEnabled; public final boolean allowMethodHandles; - public final boolean allowDefaultMethodsResolution; public final boolean allowStructuralMostSpecific; private final boolean debugResolve; private final boolean compactMethodDiags; @@ -137,7 +136,6 @@ verboseResolutionMode = VerboseResolutionMode.getVerboseResolutionMode(options); Target target = Target.instance(context); allowMethodHandles = target.hasMethodHandles(); - allowDefaultMethodsResolution = source.allowDefaultMethodsResolution(); allowStructuralMostSpecific = source.allowStructuralMostSpecific(); polymorphicSignatureScope = new Scope(syms.noSymbol); @@ -1681,7 +1679,6 @@ bestSoFar : methodNotFound; for (InterfaceLookupPhase iphase2 : InterfaceLookupPhase.values()) { - if (iphase2 == InterfaceLookupPhase.DEFAULT_OK && !allowDefaultMethodsResolution) break; //keep searching for abstract methods for (Type itype : itypes[iphase2.ordinal()]) { if (!itype.isInterface()) continue; //skip j.l.Object (included by Types.closure()) @@ -1714,10 +1711,8 @@ //from superinterfaces) if ((s.flags() & (ABSTRACT | INTERFACE | ENUM)) != 0) { return this; - } else if (rs.allowDefaultMethodsResolution) { + } else { return DEFAULT_OK; - } else { - return null; } } }, @@ -3341,9 +3336,9 @@ if ((env1.enclClass.sym.flags() & STATIC) != 0) staticOnly = true; env1 = env1.outer; } - if (allowDefaultMethodsResolution && c.isInterface() && - name == names._super && !isStatic(env) && - types.isDirectSuperInterface(c, env.enclClass.sym)) { + if (c.isInterface() && + name == names._super && !isStatic(env) && + types.isDirectSuperInterface(c, env.enclClass.sym)) { //this might be a default super call if one of the superinterfaces is 'c' for (Type t : pruneInterfaces(env.enclClass.type)) { if (t.tsym == c) { diff -r fb870c70e774 -r 79dc4b992c0a test/tools/javac/T8029240/DefaultMethodsNotVisibileForSource7Test.java --- a/test/tools/javac/T8029240/DefaultMethodsNotVisibileForSource7Test.java Thu Feb 06 21:03:03 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,164 +0,0 @@ -/* - * 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. - */ - -/* - * @test - * @bug 8029240 - * @summary Default methods not always visible under -source 7 - * @library /tools/javac/lib - * @build ToolBox - * @run main DefaultMethodsNotVisibileForSource7Test - */ - -import java.nio.file.Files; -import java.nio.file.Paths; - -public class DefaultMethodsNotVisibileForSource7Test { - // common definitions - - // this one should be compiled with source 8, the rest with source 7 - static final String ISrc = - "interface I {\n" + - " default void m() {}\n" + - "}"; - - static final String JSrc = - "interface J extends I {}"; - - static final String ASrc = - "abstract class A implements I {}"; - - static final String BSrc = - "class B implements I {}"; - - // test legacy implementations - static final String C1Src = - "class C1 implements I {\n" + - " @Override public void m() {}\n" + - "}"; - - static final String C2Src = - "class C2 implements J {\n" + - " @Override public void m() {}\n" + - "}"; - - static final String C3Src = - "class C3 extends A {\n" + - " @Override public void m() {}\n" + - "}"; - - static final String C4Src = - "class C4 extends B {\n" + - " @Override public void m() {}\n" + - "}"; - - //test legacy invocations - static final String LegacyInvocationSrc = - "class LegacyInvocation {\n" + - " public static void test(I i, J j, A a, B b) {\n" + - " i.m();\n" + - " j.m();\n" + - " a.m();\n" + - " b.m();\n" + - " }\n" + - "}"; - - //test case super invocations - static final String SubASrc = - "class SubA extends A {\n" + - " public void test() {\n" + - " super.m();\n" + - " }\n" + - "}"; - - static final String SubBSrc = - "class SubB extends B {\n" + - " public void test() {\n" + - " super.m();\n" + - " }\n" + - "}"; - - public static void main(String[] args) throws Exception { - new DefaultMethodsNotVisibileForSource7Test().run(); - } - - void run() throws Exception { - testsPreparation(); - testLegacyImplementations(); - testLegacyInvocations(); - testSuperInvocations(); - } - - void testsPreparation() throws Exception { - Files.createDirectory(Paths.get("out")); - - /* as an extra check let's make sure that interface 'I' can't be compiled - * with source 7 - */ - ToolBox.JavaToolArgs javacArgs = - new ToolBox.JavaToolArgs(ToolBox.Expect.FAIL) - .setOptions("-d", "out", "-source", "7") - .setSources(ISrc); - ToolBox.javac(javacArgs); - - //but it should compile with source >= 8 - javacArgs = - new ToolBox.JavaToolArgs() - .setOptions("-d", "out") - .setSources(ISrc); - ToolBox.javac(javacArgs); - - javacArgs = - new ToolBox.JavaToolArgs() - .setOptions("-cp", "out", "-d", "out", "-source", "7") - .setSources(JSrc, ASrc, BSrc); - ToolBox.javac(javacArgs); - } - - void testLegacyImplementations() throws Exception { - //compile C1-4 - ToolBox.JavaToolArgs javacArgs = - new ToolBox.JavaToolArgs() - .setOptions("-cp", "out", "-d", "out", "-source", "7") - .setSources(C1Src, C2Src, C3Src, C4Src); - ToolBox.javac(javacArgs); - } - - void testLegacyInvocations() throws Exception { - //compile LegacyInvocation - ToolBox.JavaToolArgs javacArgs = - new ToolBox.JavaToolArgs() - .setOptions("-cp", "out", "-d", "out", "-source", "7") - .setSources(LegacyInvocationSrc); - ToolBox.javac(javacArgs); - } - - void testSuperInvocations() throws Exception { - //compile SubA, SubB - ToolBox.JavaToolArgs javacArgs = - new ToolBox.JavaToolArgs() - .setOptions("-cp", "out", "-d", "out", "-source", "7") - .setSources(SubASrc, SubBSrc); - ToolBox.javac(javacArgs); - } -} diff -r fb870c70e774 -r 79dc4b992c0a test/tools/javac/defaultMethodsVisibility/DefaultMethodsNotVisibleForSourceLessThan8Test.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/defaultMethodsVisibility/DefaultMethodsNotVisibleForSourceLessThan8Test.java Thu Feb 06 21:11:27 2014 +0000 @@ -0,0 +1,180 @@ +/* + * 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. + */ + +/* + * @test + * @bug 8029240 8030855 + * @summary Default methods not always visible under -source 7 + * Default methods should be visible under source previous to 8 + * @library /tools/javac/lib + * @build ToolBox + * @run main DefaultMethodsNotVisibleForSourceLessThan8Test + */ + +import java.nio.file.Files; +import java.nio.file.Paths; + +public class DefaultMethodsNotVisibleForSourceLessThan8Test { + // common definitions + + // this one should be compiled with source 8, the rest with source < 8 + static final String ISrc = + "interface I {\n" + + " default void m() {}\n" + + "}"; + + static final String JSrc = + "interface J extends I {}"; + + static final String ASrc = + "abstract class A implements I {}"; + + static final String BSrc = + "class B implements I {}"; + + // test legacy implementations + static final String C1Src = + "class C1 implements I {\n" + + " public void m() {}\n" + + "}"; + + static final String C2Src = + "class C2 implements J {\n" + + " public void m() {}\n" + + "}"; + + static final String C3Src = + "class C3 extends A {\n" + + " public void m() {}\n" + + "}"; + + static final String C4Src = + "class C4 extends B {\n" + + " public void m() {}\n" + + "}"; + + //test legacy invocations + static final String LegacyInvocationSrc = + "class LegacyInvocation {\n" + + " public static void test(I i, J j, A a, B b) {\n" + + " i.m();\n" + + " j.m();\n" + + " a.m();\n" + + " b.m();\n" + + " }\n" + + "}"; + + //test case super invocations + static final String SubASrc = + "class SubA extends A {\n" + + " public void test() {\n" + + " super.m();\n" + + " }\n" + + "}"; + + static final String SubBSrc = + "class SubB extends B {\n" + + " public void test() {\n" + + " super.m();\n" + + " }\n" + + "}"; + + public static void main(String[] args) throws Exception { + String[] sources = new String[] { + "1.2", + "1.3", + "1.4", + "1.5", + "1.6", + "1.7", + }; + for (String source : sources) { + new DefaultMethodsNotVisibleForSourceLessThan8Test().run(source); + } + } + + String outDir; + String source; + + void run(String source) throws Exception { + this.source = source; + outDir = "out" + source.replace('.', '_'); + testsPreparation(); + testLegacyImplementations(); + testLegacyInvocations(); + testSuperInvocations(); + } + + void testsPreparation() throws Exception { + Files.createDirectory(Paths.get(outDir)); + + /* as an extra check let's make sure that interface 'I' can't be compiled + * with source < 8 + */ + ToolBox.JavaToolArgs javacArgs = + new ToolBox.JavaToolArgs(ToolBox.Expect.FAIL) + .setOptions("-d", outDir, "-source", source) + .setSources(ISrc); + ToolBox.javac(javacArgs); + + //but it should compile with source >= 8 + javacArgs = + new ToolBox.JavaToolArgs() + .setOptions("-d", outDir) + .setSources(ISrc); + ToolBox.javac(javacArgs); + + javacArgs = + new ToolBox.JavaToolArgs() + .setOptions("-cp", outDir, "-d", outDir, "-source", source) + .setSources(JSrc, ASrc, BSrc); + ToolBox.javac(javacArgs); + } + + void testLegacyImplementations() throws Exception { + //compile C1-4 + ToolBox.JavaToolArgs javacArgs = + new ToolBox.JavaToolArgs() + .setOptions("-cp", outDir, "-d", outDir, "-source", source) + .setSources(C1Src, C2Src, C3Src, C4Src); + ToolBox.javac(javacArgs); + } + + void testLegacyInvocations() throws Exception { + //compile LegacyInvocation + ToolBox.JavaToolArgs javacArgs = + new ToolBox.JavaToolArgs() + .setOptions("-cp", outDir, "-d", outDir, "-source", source) + .setSources(LegacyInvocationSrc); + ToolBox.javac(javacArgs); + } + + void testSuperInvocations() throws Exception { + //compile SubA, SubB + ToolBox.JavaToolArgs javacArgs = + new ToolBox.JavaToolArgs() + .setOptions("-cp", outDir, "-d", outDir, "-source", source) + .setSources(SubASrc, SubBSrc); + ToolBox.javac(javacArgs); + } +}