[
https://issues.apache.org/jira/browse/GROOVY-12020?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18083994#comment-18083994
]
ASF GitHub Bot commented on GROOVY-12020:
-----------------------------------------
paulk-asert opened a new pull request, #2566:
URL: https://github.com/apache/groovy/pull/2566
Under newer JDKs, ObjectUtil.cloneObject fails for EnumSet because the
MethodHandles.Lookup, teleported into the concrete RegularEnumSet (a
package-private subclass in java.base), lacks the access needed to unreflect
the inherited public clone() method. The IllegalAccessException is swallowed by
DefaultGroovyMethodsSupport.cloneObject's catch-all and cloneSimilarCollection
falls back to LinkedHashSet, so
EnumSet.of(A, B, C) + D
now returns a LinkedHashSet instead of an EnumSet. Subsequent assignment to
an EnumSet-typed variable or field then fails with a GroovyCastException.
Fall back to plain reflective Method.invoke when the MethodHandle Lookup
cannot access clazz. The clone method itself is public, so reflective
invocation succeeds without needing --add-opens.
> EnumSet .plus() regression in Groovy 4
> --------------------------------------
>
> Key: GROOVY-12020
> URL: https://issues.apache.org/jira/browse/GROOVY-12020
> Project: Groovy
> Issue Type: Bug
> Affects Versions: 4.0.32
> Reporter: Anton Panikov
> Priority: Major
>
> EnumSet.plus() method stopped working after upgrading to Groovy 4, but it is
> working in Groovy 5. All tests done using JDK 25, although I tried 11 with
> the same result.
> It is a runtime exception and the code need to access newly created EnumSet:
> {code:groovy}
> package test
> import groovy.transform.CompileStatic
> enum EnumTest {
> ONE,
> TWO,
> THREE,
> FOUR,
> FIVE,
> SIX,
> SEVEN,
> EIGHT,
> NINE
> public static final EnumSet<EnumTest> firstSet = EnumSet.of(ONE, TWO,
> THREE, FOUR, FIVE)
> public static final EnumSet<EnumTest> secondSet = firstSet + SIX
> }
> @CompileStatic
> class Application {
> static void main(String[] args) {
> println EnumTest.secondSet
> println 'ok'
> }
> }
> {code}
> It is working fine in Groovy 3.0.25 and 5.0.6. But in Groovy 4.0.32, it is
> throwing an exception:
> {code:groovy}
> Exception in thread "main" java.lang.ExceptionInInitializerError
> at test.Application.main(Application.groovy:27)
> Caused by: org.codehaus.groovy.runtime.typehandling.GroovyCastException:
> Cannot cast object '[ONE, TWO, THREE, FOUR, FIVE, SIX]' with class
> 'java.util.LinkedHashSet' to class 'java.util.EnumSet' due to:
> groovy.lang.GroovyRuntimeException: Could not find matching constructor for:
> java.util.EnumSet(test.EnumTest, test.EnumTest, test.EnumTest, test.EnumTest,
> test.EnumTest, test.EnumTest)
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:413)
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:326)
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnCollection(DefaultTypeTransformation.java:284)
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:231)
> at
> org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
> at test.EnumTest.<clinit>(Application.groovy:19)
> ... 1 more
> Suppressed: groovy.lang.GroovyRuntimeException: Could not find matching
> constructor for: java.util.EnumSet(LinkedHashSet)
> at
> groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1915)
> at
> groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1684)
> at
> org.codehaus.groovy.runtime.InvokerHelper.invokeConstructorOf(InvokerHelper.java:676)
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:389)
> ... 6 more
> {code}
> OS: Red Hat Enterprise Linux 8.9 (Ootpa)
> JDK: OpenJDK Runtime Environment Temurin-25.0.3+9 (build 25.0.3+9-LTS)
> and 11.0.20
--
This message was sent by Atlassian Jira
(v8.20.10#820010)