Skip to content

Commit 9d9590a

Browse files
committed
GROOVY-10494
1 parent ec804d5 commit 9d9590a

2 files changed

Lines changed: 36 additions & 1 deletion

File tree

base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5328,6 +5328,36 @@ public void testTypeChecked10482b() {
53285328
runConformTest(sources);
53295329
}
53305330

5331+
@Test
5332+
public void testTypeChecked10494() {
5333+
assumeTrue(isAtLeastGroovy(40) && isParrotParser());
5334+
5335+
//@formatter:off
5336+
String[] sources = {
5337+
"Main.groovy",
5338+
"interface I<T> {\n" +
5339+
" default void m(T t) {\n" +
5340+
" println t\n" +
5341+
" }\n" +
5342+
"}\n" +
5343+
"@groovy.transform.TypeChecked\n" +
5344+
"class C implements I<String> {\n" +
5345+
" @Override void m(String s) {\n" +
5346+
" super.m(s)\n" +
5347+
" }\n" +
5348+
"}\n",
5349+
};
5350+
//@formatter:on
5351+
5352+
runNegativeTest(sources,
5353+
"----------\n" +
5354+
"1. ERROR in Main.groovy (at line 9)\n" +
5355+
"\tsuper.m(s)\n" +
5356+
"\t^^^^^^^^^^\n" +
5357+
"Groovy:[Static type checking] - Default method m(T) requires qualified super\n" +
5358+
"----------\n");
5359+
}
5360+
53315361
@Test
53325362
public void testTypeChecked10499() {
53335363
for (String bounds : new String[] {"?", "Y", "? extends Y"}) {

base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3524,7 +3524,12 @@ && implementsInterfaceOrIsSubclassOf(receiverType, node.getDeclaringClass()))) {
35243524
&& objectExpression instanceof ClassExpression && call.getNodeMetaData(DYNAMIC_RESOLUTION) == null) {
35253525
addStaticTypeError("Non-static method " + prettyPrintTypeName(declaringClass) + "#" + targetMethodCandidate.getName() + " cannot be called from static context", call);
35263526
} else if (targetMethodCandidate.isAbstract() && isSuperExpression(objectExpression)) { // GROOVY-10341
3527-
addStaticTypeError("Abstract method " + toMethodParametersString(targetMethodCandidate.getName(), extractTypesFromParameters(targetMethodCandidate.getParameters())) + " cannot be called directly", call);
3527+
String target = toMethodParametersString(targetMethodCandidate.getName(), extractTypesFromParameters(targetMethodCandidate.getParameters()));
3528+
if (Traits.hasDefaultImplementation(targetMethodCandidate)) { // GROOVY-10494
3529+
addStaticTypeError("Default method " + target + " requires qualified super", call);
3530+
} else {
3531+
addStaticTypeError("Abstract method " + target + " cannot be called directly", call);
3532+
}
35283533
}
35293534
if (chosenReceiver == null) {
35303535
chosenReceiver = Receiver.make(declaringClass);

0 commit comments

Comments
 (0)