This is an automated email from the ASF dual-hosted git repository. paulk pushed a commit to branch GROOVY_3_0_X in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 7b9297cfd639ba14225c99299700706cdd35381b Author: Eric Milles <[email protected]> AuthorDate: Tue Apr 6 08:59:31 2021 -0500 GROOVY-10011: STC: instanceof refines declared type for diamond operator (closes #1545) (port to 3_0_X) --- .../transform/stc/StaticTypeCheckingVisitor.java | 8 ++++++-- src/test/groovy/transform/stc/GenericsSTCTest.groovy | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) 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 e025180..49f5353 100644 --- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java +++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java @@ -5447,11 +5447,15 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport { } private ClassNode getDeclaredOrInferredType(final Expression expression) { + ClassNode declaredOrInferred; // in case of "T t = new ExtendsOrImplementsT()", return T for the expression type if (expression instanceof Variable && !((Variable) expression).isDynamicTyped()) { - return getOriginalDeclarationType(expression); // GROOVY-9996 + declaredOrInferred = getOriginalDeclarationType(expression); // GROOVY-9996 + } else { + declaredOrInferred = getType(expression); } - return getInferredTypeFromTempInfo(expression, getType(expression)); + // GROOVY-10011: apply instanceof constraints to either option + return getInferredTypeFromTempInfo(expression, declaredOrInferred); } private static ClassNode getDeclaringClass(final MethodNode method, final Expression arguments) { diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy index b5020e3..be9319e 100644 --- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy +++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy @@ -213,6 +213,25 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase { ''' } + // GROOVY-10011 + void testDiamondInferrenceFromConstructor8b() { + assertScript ''' + @groovy.transform.TupleConstructor(defaults=false) + class C<T> { + T p + } + interface I { } + class D implements I { } + + void test(I i) { + if (i instanceof D) { + C<D> cd = new C<>(i) + } + } + test(new D()) + ''' + } + void testLinkedListWithListArgument() { assertScript ''' List<String> list = new LinkedList<String>(['1','2','3'])
