Skip to content

Commit 453b272

Browse files
committed
GROOVY-10499
1 parent d665d08 commit 453b272

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

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

+28
Original file line numberDiff line numberDiff line change
@@ -5231,6 +5231,34 @@ public void testTypeChecked10482b() {
52315231
runConformTest(sources);
52325232
}
52335233

5234+
@Test
5235+
public void testTypeChecked10499() {
5236+
for (String bounds : new String[] {"?", "Y", "? extends Y"}) {
5237+
//@formatter:off
5238+
String[] sources = {
5239+
"Main.groovy",
5240+
"class C<X> {\n" +
5241+
" C(X x) {\n" +
5242+
" }\n" +
5243+
"}\n" +
5244+
"class D<Y> {\n" +
5245+
" D(C<" + bounds + "> c, Y y) {\n" +
5246+
" }\n" +
5247+
" Y m(Y y) {\n" +
5248+
" }\n" +
5249+
"}\n" +
5250+
"@groovy.transform.TypeChecked\n" +
5251+
"def <Z> void test(Z z = null) {\n" +
5252+
" new D<>(new C<Z>(z), z).m(z)\n" + // Cannot find matching method D#m(Z)
5253+
"}\n" +
5254+
"test()\n",
5255+
};
5256+
//@formatter:on
5257+
5258+
runConformTest(sources);
5259+
}
5260+
}
5261+
52345262
@Test
52355263
public void testTypeChecked10525() {
52365264
//@formatter:off

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

+5-2
Original file line numberDiff line numberDiff line change
@@ -1926,10 +1926,13 @@ static ClassNode getCombinedBoundType(final GenericsType genericsType) {
19261926
return genericsType.getType();
19271927
}
19281928

1929-
static GenericsType getCombinedGenericsType(final GenericsType gt1, final GenericsType gt2) {
1929+
static GenericsType getCombinedGenericsType(GenericsType gt1, GenericsType gt2) {
1930+
// GROOVY-9998, GROOVY-10499: unpack "?" that is from "? extends T"
1931+
if (isUnboundedWildcard(gt1)) gt1 = gt1.getType().asGenericsType();
1932+
if (isUnboundedWildcard(gt2)) gt2 = gt2.getType().asGenericsType();
19301933
ClassNode cn1 = GenericsUtils.makeClassSafe0(CLASS_Type, gt1);
19311934
ClassNode cn2 = GenericsUtils.makeClassSafe0(CLASS_Type, gt2);
1932-
ClassNode lub = lowestUpperBound(cn1,cn2);
1935+
ClassNode lub = lowestUpperBound(cn1, cn2);
19331936
return lub.getGenericsTypes()[0];
19341937
}
19351938

0 commit comments

Comments
 (0)