You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2021/11/04 16:36:31 UTC
[groovy] branch master updated: GROOVY-10344: STC: dereference type
parameter before generics transfer
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new 3dc6945 GROOVY-10344: STC: dereference type parameter before generics transfer
3dc6945 is described below
commit 3dc6945fd3ba318801129b4300766fba39e3c1ef
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Thu Nov 4 11:36:24 2021 -0500
GROOVY-10344: STC: dereference type parameter before generics transfer
---
.../transform/stc/StaticTypeCheckingVisitor.java | 3 ++
.../groovy/transform/stc/GenericsSTCTest.groovy | 34 ++++++++++++++++++++++
2 files changed, 37 insertions(+)
diff --git a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index 35c696b..4a26bf9 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1099,6 +1099,9 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
}
inferredType = type;
}
+ if (inferredType.isGenericsPlaceHolder()) // GROOVY-10344: "T t = new C<>()"
+ inferredType = getCombinedBoundType(inferredType.getGenericsTypes()[0]);
+
adjustGenerics(inferredType, cceType);
storeType(cce, cceType);
}
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 1a8d7fd..9482905 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -1079,6 +1079,40 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
'''
}
+ // GROOVY-10344
+ void testDiamondInferrenceFromConstructor22() {
+ assertScript '''
+ class C<X,Y> {
+ }
+ def <T extends C<? extends Number, ? extends Number>> T m(T t) {
+ return t
+ }
+ def x = m(new C<>())
+ assert x instanceof C
+ '''
+ }
+
+ // GROOVY-10230
+ void testDiamondInferrenceFromConstructor23() {
+ assertScript '''
+ class A {
+ def <T extends C<Number,Number>> T m(T t) {
+ return t
+ }
+ }
+ class B extends A {
+ @Override
+ def <T extends C<Number,Number>> T m(T t) {
+ T x = null; super.m(true ? t : x)
+ }
+ }
+ class C<X,Y> {
+ }
+ def x = new B().m(new C<>())
+ assert x instanceof C
+ '''
+ }
+
// GROOVY-10280
void testTypeArgumentPropagation() {
assertScript '''