[ 
https://issues.apache.org/jira/browse/GROOVY-12541?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18133349#comment-18133349
 ] 

ASF GitHub Bot commented on GROOVY-12541:
-----------------------------------------

paulk-asert opened a new pull request, #3061:
URL: https://github.com/apache/groovy/pull/3061

   … variables




> @CompileStatic silently drops type annotations on local variables
> -----------------------------------------------------------------
>
>                 Key: GROOVY-12541
>                 URL: https://issues.apache.org/jira/browse/GROOVY-12541
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 6.0.0
>            Reporter: Paul King
>            Priority: Major
>
> h3. Problem
> Under {{@CompileStatic}}, {{TYPE_USE}} annotations on local variables are not 
> written to the class file (no {{RuntimeVisibleTypeAnnotations}} entry with 
> target {{LOCAL_VARIABLE}}). The same source compiled dynamically emits them 
> correctly. No error or warning is given.
> {code:groovy}
> @groovy.transform.CompileStatic
> class Foo {
>     static void m() {
>         @TU Integer n = 0
>         for (@TU Integer i = 0; i < 3; i++) { }
>         println n
>     }
> }
> {code}
> ||Code||Dynamic||{{@CompileStatic}}||
> |{{for (@TU Integer i = 0; ...)}}|emitted|*not emitted*|
> |{{@TU Integer n = 0}}|emitted|*not emitted*|
> The same happens whether the annotation targets only {{TYPE_USE}} or 
> {{LOCAL_VARIABLE, TYPE_USE}}. Tested on 6.0.0-beta-2 and master. (Primitive 
> locals currently crash instead; see the related {{GroovyBugError}} issue. 
> Once that is fixed, they show this same drop under {{@CompileStatic}}.)
> Tools that read local variable type annotations from bytecode (e.g. 
> TornadoVM's {{@Parallel}} loop marker) therefore never see them in statically 
> compiled Groovy.
> h3. Cause
> {{CompileStack}} writes local variable type annotations from 
> {{BytecodeVariable.getType()}}, the slot type passed to {{defineVariable}}. 
> For declarations, {{BinaryExpressionHelper.evaluateEqual}} gets that type 
> from the type chooser. The dynamic chooser returns the declared type node, 
> which carries the annotations. {{StaticTypesTypeChooser}} returns the type 
> checker's inferred type, a different node without them.
> h3. Proposed fix
> Record the declared type separately from the slot type and emit the 
> annotations from it:
> * {{BytecodeVariable}}: new {{declaredType}} property; {{getDeclaredType()}} 
> falls back to {{getType()}} when none was recorded.
> * {{CompileStack.defineVariable(Variable, ClassNode, boolean)}}: 
> {{answer.setDeclaredType(v.getOriginType())}}.
> * {{CompileStack}} local variable table emission: read type annotations from 
> {{v.getDeclaredType()}} instead of {{v.getType()}}.
> Regression test added to {{TypeAnnotationsTest}} 
> ({{testTypeAnnotationsForLocalVariablesCompileStatic}}): a {{@CompileStatic}} 
> {{for (@A int i ...)}} loop and an annotated {{Integer}} local both get 
> {{LOCAL_VARIABLE}} type annotations.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to