Skip to content

Commit 82f5d45

Browse files
committed
GROOVY-10267, GROOVY-10576
1 parent 97a612e commit 82f5d45

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

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

+20
Original file line numberDiff line numberDiff line change
@@ -4576,6 +4576,26 @@ public void testTypeChecked10254() {
45764576
runConformTest(sources, "42");
45774577
}
45784578

4579+
@Test
4580+
public void testTypeChecked10267() {
4581+
//@formatter:off
4582+
String[] sources = {
4583+
"Main.groovy",
4584+
"class C<T> {\n" +
4585+
"}\n" +
4586+
"@groovy.transform.TypeChecked\n" +
4587+
"C<? extends Object> test() {\n" +
4588+
" test2()\n" +
4589+
"}\n" +
4590+
"C<? extends Object> test2() {\n" +
4591+
"}\n" +
4592+
"test()\n",
4593+
};
4594+
//@formatter:on
4595+
4596+
runConformTest(sources);
4597+
}
4598+
45794599
@Test
45804600
public void testTypeChecked10269() {
45814601
assumeTrue(isParrotParser());

base/org.codehaus.groovy25/src/org/codehaus/groovy/ast/GenericsType.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -487,8 +487,8 @@ private boolean compareGenericsWithBound(final ClassNode classNode, final ClassN
487487
match = gt.new GenericsTypeMatcher().checkGenerics(classNodeType.getLowerBound());
488488
} else if (classNodeType.getUpperBounds() != null) {
489489
match = gt.new GenericsTypeMatcher().checkGenerics(classNodeType.getUpperBounds()[0]);
490-
} else {
491-
match = false; // "?" (from Comparable<?>) does not satisfy anything
490+
} else { // GROOVY-10267, GROOVY-10576: "?" vs "? extends Object" (citation required) or no match
491+
match = (!gt.isPlaceholder() && !gt.isWildcard() && ClassHelper.OBJECT_TYPE.equals(gt.getType()));
492492
}
493493
} else {
494494
match = implementsInterfaceOrIsSubclassOf(classNodeType.getType(), gt.getType());

base/org.codehaus.groovy30/src/org/codehaus/groovy/ast/GenericsType.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -470,8 +470,8 @@ private static boolean compareGenericsWithBound(final ClassNode classNode, final
470470
match = gt.checkGenerics(classNodeType.getLowerBound());
471471
} else if (classNodeType.getUpperBounds() != null) {
472472
match = gt.checkGenerics(classNodeType.getUpperBounds()[0]);
473-
} else {
474-
match = false; // "?" (from Comparable<?>) does not satisfy anything
473+
} else { // GROOVY-10267, GROOVY-10576: "?" vs "? extends Object" (citation required) or no match
474+
match = (!gt.isPlaceholder() && !gt.isWildcard() && ClassHelper.OBJECT_TYPE.equals(gt.getType()));
475475
}
476476
} else {
477477
match = implementsInterfaceOrIsSubclassOf(classNodeType.getType(), gt.getType());

0 commit comments

Comments
 (0)