diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/DefaultMethodsTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/DefaultMethodsTest.java index a41fe88..9b54bbc 100644 --- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/DefaultMethodsTest.java +++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/DefaultMethodsTest.java @@ -217,7 +217,29 @@ "default" ); } - + + // class implements interface with default method. + // - witness for NoSuchMethodError in synthetic method (SuperMethodAccess) + public void testModifiers5a() { + runConformTest( + new String[] { + "C.java", + "interface I {\n" + + " public void foo() default {\n" + + " System.out.println(\"default\");\n" + + " }\n" + + "}\n" + + "public class C implements I {\n" + + " public static void main(String[] args) {\n" + + " C c = new C();\n" + + " c.foo();\n" + + " }\n" + + "}\n" + }, + "default" + ); + } + // class implements interface with default method. // - no need to implement this interface method as it is not abstract, but other abstract method exists public void testModifiers6() { diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java index cb2a586..4420bc9 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java @@ -2582,8 +2582,10 @@ || accessMethod.purpose == SyntheticMethodBinding.SuperMethodAccess){ // target method declaring class may not be accessible (247953); TypeBinding declaringClass = accessMethod.purpose == SyntheticMethodBinding.SuperMethodAccess - ? accessMethod.declaringClass.superclass() - : accessMethod.declaringClass; + ? (targetMethod.isDefaultMethod() + ? targetMethod.declaringClass + : accessMethod.declaringClass.superclass()) + : accessMethod.declaringClass; invoke(Opcodes.OPC_invokespecial, targetMethod, declaringClass); } else { if (targetMethod.declaringClass.isInterface()) { // interface or annotation type