diff --git a/base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java b/base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java index 9dbe547d0b..b575aab13b 100644 --- a/base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java +++ b/base-test/org.eclipse.jdt.groovy.core.tests.compiler/src/org/eclipse/jdt/groovy/core/tests/xform/TypeCheckedTests.java @@ -4348,6 +4348,25 @@ public void testTypeChecked10323() { "----------\n"); } + @Test + public void testTypeChecked10324() { + //@formatter:off + String[] sources = { + "Main.groovy", + "class C {\n" + + "}\n" + + "def X m(C c) {\n" + + "}\n" + + "@groovy.transform.TypeChecked\n" + + "void test() {\n" + + " Set x = m(new C<>())\n" + + "}\n", + }; + //@formatter:on + + runNegativeTest(sources, ""); + } + @Test public void testTypeChecked10325() { //@formatter:off diff --git a/base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java index 24095ab43c..eb5bae73f5 100644 --- a/base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java +++ b/base/org.codehaus.groovy25/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java @@ -982,13 +982,13 @@ && isAssignment(enclosingBinaryExpression.getOperation().getType())) { if (rightExpression instanceof ConstructorCallExpression) { inferDiamondType((ConstructorCallExpression) rightExpression, lType); } - // GRECLIPSE add -- unchecked assignment + // GRECLIPSE add -- GROOVY-10051, GROOVY-10235, GROOVY-10324 if (lType.isUsingGenerics() && missesGenericsTypes(resultType)) { // the inferred type of the binary expression is the type of the RHS // "completed" with generics type information available from the LHS if (lType.equals(resultType)) { if (!lType.isGenericsPlaceHolder()) resultType = lType; - } else { + } else if (!resultType.isGenericsPlaceHolder()) { Map gt = new HashMap<>(); extractGenericsConnections(gt, resultType, resultType.redirect()); extractGenericsConnections(gt, lType, getNextSuperClass(resultType, lType)); diff --git a/base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java index 7df1d7e534..624e22dfc8 100644 --- a/base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java +++ b/base/org.codehaus.groovy30/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java @@ -867,13 +867,13 @@ && isAssignment(enclosingBinaryExpression.getOperation().getType())) { if (rightExpression instanceof ConstructorCallExpression) { inferDiamondType((ConstructorCallExpression) rightExpression, lType); } - // GRECLIPSE add -- unchecked assignment + // GRECLIPSE add -- GROOVY-10051, GROOVY-10235, GROOVY-10324 if (lType.isUsingGenerics() && missesGenericsTypes(resultType)) { // the inferred type of the binary expression is the type of the RHS // "completed" with generics type information available from the LHS if (lType.equals(resultType)) { if (!lType.isGenericsPlaceHolder()) resultType = lType; - } else { + } else if (!resultType.isGenericsPlaceHolder()) { Map gt = new HashMap<>(); extractGenericsConnections(gt, resultType, resultType.redirect()); extractGenericsConnections(gt, lType, getNextSuperClass(resultType, lType)); diff --git a/base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java b/base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java index 151f6137e6..4c88778a54 100644 --- a/base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java +++ b/base/org.codehaus.groovy40/src/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java @@ -866,13 +866,13 @@ && isAssignment(enclosingBinaryExpression.getOperation().getType())) { // the inferred type of the binary expression is the type of the RHS // "completed" with generics type information available from the LHS - /* GRECLIPSE edit -- GROOVY-10235 + /* GRECLIPSE edit -- GROOVY-10051, GROOVY-10235, GROOVY-10324 if (!resultType.isGenericsPlaceHolder()) // plain reference drops placeholder resultType = GenericsUtils.parameterizeType(lType, resultType.getPlainNodeReference()); */ if (lType.equals(resultType)) { if (!lType.isGenericsPlaceHolder()) resultType = lType; - } else { + } else if (!resultType.isGenericsPlaceHolder()) { Map gt = new HashMap<>(); extractGenericsConnections(gt, resultType, resultType.redirect()); extractGenericsConnections(gt, lType, getNextSuperClass(resultType, lType));