[ 
https://issues.apache.org/jira/browse/GROOVY-11192?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Eric Milles updated GROOVY-11192:
---------------------------------
    Docs Text: 
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}

  was:
Below is the code that causes the compiler to crash during compilation.

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}


> 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
>         Attachments: MapLong-3.groovy, 
> TestCompilerCrashOnTemplateArgCount.groovy
>
>
> When attempting to compile the code below, it causes the Groovy compiler to 
> crash with:
> 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)
>   
> The crash is caused because the GenericType parameter is missing on line 9 in 
> TestCompilerCrashOnTemplateArgCount:
> private Map<Long, String> map = new MapLong<>()   // causes compiler crash
> ...but
> private Map<Long, String> map2 = new MapLong<String>() // doest not cause 
> compiler crash
>  
> 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)

Reply via email to