[
https://issues.apache.org/jira/browse/GROOVY-11192?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Eric Milles updated GROOVY-11192:
---------------------------------
Fix Version/s: 4.0.16
> Code that causes Groovy Compiler Crash
> --------------------------------------
>
> Key: GROOVY-11192
> URL: https://issues.apache.org/jira/browse/GROOVY-11192
> Project: Groovy
> Issue Type: Bug
> Components: Static Type Checker
> Affects Versions: 4.0.15
> Environment: I am running on MacBook Pro, but I think this is a
> probably regardless of environment. I have been able to repeat this bug for
> Groovy versions from 3.0.10 to 4.0.15 and all in between.
> Reporter: John DeRegnaucourt
> Assignee: Eric Milles
> Priority: Major
> Labels: Generics, compiler, crash, parametize, type
> Fix For: 5.0.0-alpha-3, 4.0.16
>
> Attachments: MapLong-3.groovy,
> TestCompilerCrashOnTemplateArgCount.groovy
>
>
> When attempting to compile the code below, it causes the Groovy compiler to
> crash with:
> {code}
> java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
> at
> org.codehaus.groovy.ast.tools.GenericsUtils.createGenericsSpec(GenericsUtils.java:494)
> at
> org.codehaus.groovy.ast.tools.GenericsUtils.createGenericsSpec(GenericsUtils.java:480)
> at
> org.codehaus.groovy.ast.tools.GenericsUtils.parameterizeType(GenericsUtils.java:293)
> {code}
> The crash is caused because the GenericType parameter is missing on line 9 in
> TestCompilerCrashOnTemplateArgCount:
> {code:groovy}
> private Map<Long, String> map = new MapLong<>() // causes compiler crash
> {code}
> ...but
> {code:groovy}
> private Map<Long, String> map2 = new MapLong<String>() // doest not cause
> compiler crash
> {code}
> 1st source file (TestCompilerCrashOnTemplateArgCount.groovy)
> {code:groovy}
> package com.x.y.z
> import groovy.transform.CompileStatic
> @CompileStatic
> class TestCompilerCrashOnTemplateArgCount
> {
> // The line below crashes Groovy Compiler with ArrayOutOfBoundsException
> during compilation because no type argument passed to MapLong<>()
> private Map<Long, String> map = new MapLong<>()
>
> // The line below doesn't crash the compiler:
> private Map<Long, String> map2 = new MapLong<String>()
> }
> {code}
> 2nd source file (MapLong.groovy):
> {code:groovy}
> package com.x.y.z
> import groovy.transform.CompileStatic
> @CompileStatic
> class MapLong<V> implements Map<Long, V>
> {
> int size() { return 0 }
> boolean isEmpty() { return false }
> boolean containsKey(Object key) { return false }
> boolean containsValue(Object value) { return false }
> V get(Object key) { return null }
> V put(Long key, V value) { return null }
> V remove(Object key) { return null }
> void putAll(Map<? extends Long, ? extends V> m) { }
> void clear() { }
> Set<Long> keySet() { return null }
> Collection<V> values() { return null }
> Set<Entry<Long, V>> entrySet() { return null }
> }
> {code}
>
> The compiler is expecting one argument, but a no argument array was
> allocated. When it attempts to access the array at element [0], the compiler
> hits ArrayOutOfBoundsException.
>
> This is super easy to repeat with the two tiny source files attached.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)